You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

Spark读取OpenSearch索引失败:dynamic_date_formats映射异常

解决elasticsearch-spark-20读取OpenSearch时dynamic_date_formats解析错误

问题背景

使用Scala 2.11.12、Spark 2.3.0和elasticsearch-spark-20 7.7.0读取OpenSearch 1.3.4的myIndex索引时,触发映射解析错误,核心报错:

org.elasticsearch.hadoop.EsHadoopIllegalArgumentException: invalid map received dynamic_date_formats=[yyyy-MM-dd HH:mm:ss||yyyy-MM-dd'T'HH:mm:ss.SSS||yyyy-MM-dd||yyyy-MM-dd'T'HH||yyyy-MM-dd'T'HH:mm]

索引写入操作正常,但读取流程失败。

原因分析

elasticsearch-spark-20 7.7.0是为Elasticsearch 7.x开发的组件,OpenSearch虽基于Elasticsearch fork而来,但在映射元数据的返回格式上存在兼容性差异。ES-Hadoop库的FieldParser类在解析OpenSearch的dynamic_date_formats字段时,错误地将其当作Map类型处理,而实际该字段为数组类型,导致解析逻辑崩溃。

解决方案

方案1:禁用自动映射发现,手动指定Schema

通过配置跳过OpenSearch映射的自动发现流程,同时手动定义Spark DataFrame的Schema,避免触发错误的映射解析逻辑:

import org.apache.spark.sql.types._

// 定义与OpenSearch索引字段匹配的Schema
val customSchema = StructType(Seq(
  StructField("Timestamp", DateType, nullable = false),
  // 补充其他字段定义...
))

spark.read.format("org.elasticsearch.spark.sql")
  .option("es.read.schema.ignore", "true") // 禁用自动映射发现
  .schema(customSchema) // 绑定手动定义的Schema
  .load("myIndex")
  .filter('Timestamp === lit(dateToRead))

方案2:替换为OpenSearch官方Spark连接器

OpenSearch提供了官方兼容的Spark连接器,彻底解决版本适配问题:

  • 替换Maven依赖(移除原elasticsearch-spark-20依赖):
<dependency>
  <groupId>org.opensearch</groupId>
  <artifactId>opensearch-spark-20_2.11</artifactId>
  <version>1.3.4</version> <!-- 与OpenSearch版本保持一致 -->
</dependency>
  • 修改代码中的格式指定:
spark.read.format("org.opensearch.spark.sql")
  .load("myIndex")
  .filter('Timestamp === lit(dateToRead))

方案3:调整OpenSearch索引映射(可选)

若允许修改索引配置,可移除动态日期格式设置,改为显式定义日期字段的格式规则:

PUT /myIndex/_mapping
{
  "dynamic_date_formats": [],
  "properties": {
    "Timestamp": {
      "type": "date",
      "format": "yyyy-MM-dd HH:mm:ss||yyyy-MM-dd'T'HH:mm:ss.SSS||yyyy-MM-dd||yyyy-MM-dd'T'HH||yyyy-MM-dd'T'HH:mm"
    }
    // 其他字段定义...
  }
}

内容的提问来源于stack exchange,提问作者Tiz

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.08.22 00:06:17