我正在尝试在ElasticSearch中查询数组
data: "names":[{"name":"allen"},{"name":"bill"},{"name":"dave"},{"name":"poter"}]
goal: "select names from table where array_contains(names.name, "bill")"
但如果SQL语句使用array_contains
函数,spark不会执行谓词下推
hint: names.name = ["allen","bill","dave","poter"]
我试过了
select * from table where array_contains(names.name,"bill")
-- and
select explode(names.name) as name from table as t1;select * from t1 where name = "bill"
-- and
select * from table where cast(names.name as string) like '%bill%'
所有未能做下推,还有其他方法吗?
答案 0 :(得分:6)
下推失败。要委派谓词,您需要数据源支持,并且ElasticSearch连接器不会在pushed operations中列出array_contains
,今天包括:
=
,=>
,<
,>=
,<=
is_null
/ is_not_null
in
String[Starts|Ends]With
,StringContains
NULL
安全平等。AND
/ OR
/ NOT
的应用。所有其他转换(包括CAST
)也会禁用谓词下推。
答案 1 :(得分:0)
array_contains
不会生成数据源筛选器谓词,因此没有连接器可以有机会支持此谓词下推。
array_contains
创建一个ArrayContains Catalyst谓词表达式,当向translateFilter请求DataSourceStrategy
规划策略时,该表达式不会转换为数据源筛选谓词。
受支持的表达式中有Contains
个谓词表达式,但ArrayContains
中没有。认为您应该在Spark JIRA issue tracking system中进行报告。