Databricks通过Spark连接OpenSearch遇映射解析异常问题求助
解决Elasticsearch Spark库连接OpenSearch 2.3时的映射解析异常
这个问题的核心原因很明确:你生成的Bulk API请求里缺少了索引名,而OpenSearch 2.x的Bulk API严格要求每个操作必须指定目标索引,不像Elasticsearch 7.x还能兼容部分省略场景。
为什么会出现这个差异?
你的代码里用了es.resource参数设置为index/type,这种带type的写法在Elasticsearch 7.x中还能正常工作(因为ES 7.x允许保留一个默认类型_doc),但OpenSearch 2.x已经完全废弃了自定义索引类型的概念,并且ES Spark库在处理OpenSearch时,对es.resource的解析逻辑会把index/type中的type当作索引名,导致真正的索引名丢失,生成的Bulk请求就只剩_id没有_index了。
修复步骤
- 修改
es.resource参数:移除type部分,只保留索引名称。因为OpenSearch 2.x默认使用_doc作为文档类型,不需要额外指定。 - 确保参数格式正确,避免解析错误。
修改后的代码示例
df.write .format( "org.elasticsearch.spark.sql" ) .option( "es.nodes", host ) .option( "es.port", 443 ) .option( "es.net.ssl", "true" ) .option("es.resource", "your_target_index") // 仅指定索引名,去掉type部分 .option( "es.nodes.wan.only", "true" ) .option( "es.net.http.auth.user", username ) .option( "es.net.http.auth.pass", password ) .mode( "append" ) .save()
验证修复效果
修改后生成的Bulk请求会自动带上索引名,格式如下:
{"index":{"_index":"your_target_index","_id":50}} {"name":"Bilbo","age":50} {"index":{"_index":"your_target_index","_id":1000}} {"name":"Gandalf","age":1000} ...
这样OpenSearch就能正确解析请求,完成数据写入了。
内容的提问来源于stack exchange,提问作者ravi pavan
相关产品推荐
相关产品推荐

