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

时间:2017-02-16 21:15:17

标签: sql apache-spark elasticsearch

我正在使用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]

通过这种映射,我可以选择文档。{fieldA},sourceinfo。{fieldB}等,但不能选择_id。就像它在映射中处于高水平一样。

知道如何获得这个特定的领域吗?

2 个答案:

答案 0 :(得分:0)

某些特殊字符如_,₹不支持spark SQL.please尝试用“Id”之类的其他字符替换特殊字符。

答案 1 :(得分:0)

通过将es.read.metadata设置为_id,可以访问True或元数据

例如在您的代码中:

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.show(5)

它将打印类似(以我为例)

 |-- 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 
    """)

希望这可以解决您的问题