如何使用array_contains和ElasticSearch数据源进行谓词下推?

时间:2017-11-16 02:32:58

标签: apache-spark elasticsearch apache-spark-sql

我正在尝试在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%'

所有未能做下推,还有其他方法吗?

2 个答案:

答案 0 :(得分:6)

下推失败。要委派谓词,您需要数据源支持,并且ElasticSearch连接器不会在pushed operations中列出array_contains,今天包括:

  • ==><>=<=
  • is_null / is_not_null
  • in
  • String[Starts|Ends]WithStringContains
  • NULL安全平等。
  • 布尔运算符AND / OR / NOT的应用。

所有其他转换(包括CAST)也会禁用谓词下推。

答案 1 :(得分:0)

array_contains不会生成数据源筛选器谓词,因此没有连接器可以有机会支持此谓词下推。


array_contains创建一个ArrayContains Catalyst谓词表达式,当向translateFilter请求DataSourceStrategy规划策略时,该表达式不会转换为数据源筛选谓词。

受支持的表达式中有Contains个谓词表达式,但ArrayContains中没有。认为您应该在Spark JIRA issue tracking system中进行报告。