Spark Elasticsearch连接器:如何选择_id字段?

5

我正在使用Spark Elasticsearch连接器,并且想要从ES中提取一些字段以及_id。

myquery = """{"query":..., """
val df = spark.read.format("org.elasticsearch.spark.sql")
                 .option("query", myquery)
                 .option("pushdown", "true")
                 .load("myindex/mytype")
                 .limit(10) 
                 .select("myfield","_id") 

很遗憾,_id字段未被识别:

AnalysisException: u'cannot resolve \'`_id`\' given input columns: 
[query, size, @version, @timestamp, 
 sourceinfo, signaletic, document, metadata, fields, aggs]
使用这个映射,我可以选择例如document.{fieldA}、sourceinfo.{fieldB}等,但不能选取_id。就像它在映射中处于一个过高的级别一样。 你有什么办法可以获取这个特定的字段吗?

我添加了一个答案,请告诉我是否对你有帮助。我之前遇到过同样的问题。希望这个解决方案能够帮到你。 - Danial Shabbir
2个回答

1
您可以通过将es.read.metadata设置为True来访问_id或元数据。 例如,在您的代码中:
myquery = """{"query":..., """
val df = spark.read.format("org.elasticsearch.spark.sql")
                 .option("query", myquery)
                 .option("pushdown", "true")
                 .option("es.read.metadata",True) # Set it to True
                 .load("myindex/mytype")
                 .limit(10) 
                 .select("myfield","_id") 
当你执行时
df.printSchema()
它将打印类似以下内容(在我的情况下):
 |-- user_id: string (nullable = true)
 |-- user_rt: string (nullable = true)
 |-- user_rt_id: string (nullable = true)
 |-- username: string (nullable = true)
 |-- video: long (nullable = true)
 |-- _metadata: map (nullable = true) # this map column will be added
 |    |-- key: string
 |    |-- value: string (valueContainsNull = true)
你可以从_metadata列中进一步提取属性,例如_index_type_id_scoresort。 要从_metadata(映射类型)访问_id列,我已经使用了这个方法,你可以使用你认为最好的方法。
df.createOrReplaceTempView('temp_table_name')
spark.sql(""" 
     SELECT 
     _metadata._id as reference_id 
     FROM temp_table_name 
    """)
希望这可以解决您的问题。

-1

有些特殊字符,如_、₹,在Spark SQL中不受支持。请尝试用另一个字符(例如“Id”)替换特殊字符。


感谢您的帮助@madhu,但是您所说的“尝试替换”是什么意思?我对这个elasticsearch命名没有控制权(https://www.elastic.co/guide/en/elasticsearch/reference/current/mapping-id-field.html)。 - Patrick

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,