我正在使用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。就像它在映射中处于高水平一样。
知道如何获得这个特定的领域吗?
答案 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
,_score
,sort
要使用我曾经使用过的_metadata(地图类型)中的_id列,可以使用您认为最合适的
df.createOrReplaceTempView('temp_table_name')
spark.sql("""
SELECT
_metadata._id as reference_id
FROM temp_table_name
""")
希望这可以解决您的问题