Spark 支持子查询吗? [复制]
Posted
技术标签:
【中文标题】Spark 支持子查询吗? [复制]【英文标题】:Does Spark support subqqueries? [duplicate] 【发布时间】:2015-10-29 12:07:41 【问题描述】:当我运行这个查询时,我得到了这种类型的错误
select * from raw_2 where ip NOT IN (select * from raw_1);
org.apache.spark.sql.AnalysisException:
查询中不支持的语言功能:
select * from raw_2 where ip NOT IN (select * from raw_1)
TOK_QUERY 1, 0,24, 14
TOK_FROM 1, 4,6, 14
TOK_TABREF 1, 6,6, 14
TOK_TABNAME 1, 6,6, 14
raw_2 1, 6,6, 14
TOK_INSERT 0, -1,24, 0
TOK_DESTINATION 0, -1,-1, 0
TOK_DIR 0, -1,-1, 0
TOK_TMP_FILE 0, -1,-1, 0
TOK_SELECT 0, 0,2, 0
TOK_SELEXPR 0, 2,2, 0
TOK_ALLCOLREF 0, 2,2, 0
TOK_WHERE 1, 8,24, 29
NOT 1, 10,24, 29
TOK_SUBQUERY_EXPR 1, 14,10, 33
TOK_SUBQUERY_OP 1, 14,14, 33
IN 1, 14,14, 33
TOK_QUERY 1, 16,24, 51
TOK_FROM 1, 21,23, 51
TOK_TABREF 1, 23,23, 51
TOK_TABNAME 1, 23,23, 51
raw_1 1, 23,23, 51
TOK_INSERT 0, -1,19, 0
TOK_DESTINATION 0, -1,-1, 0
TOK_DIR 0, -1,-1, 0
TOK_TMP_FILE 0, -1,-1, 0
TOK_SELECT 0, 17,19, 0
TOK_SELEXPR 0, 19,19, 0
TOK_ALLCOLREF 0, 19,19, 0
TOK_TABLE_OR_COL 1, 10,10, 26
ip 1, 10,10, 26
scala.NotImplementedError:无 ASTNode 类型的解析规则:817,文本:
TOK_SUBQUERY_EXPR :
TOK_SUBQUERY_EXPR 1, 14,10, 33
TOK_SUBQUERY_OP 1, 14,14, 33
IN 1, 14,14, 33
TOK_QUERY 1, 16,24, 51
TOK_FROM 1, 21,23, 51
TOK_
【问题讨论】:
【参考方案1】:Spark 2.0.0+:
从 2.0.0 开始,Spark 支持全范围的子查询。详情请见Does SparkSQL support subquery?。
火花
Spark 是否支持子查询?
一般来说是这样。像 SELECT * FROM (SELECT * FROM foo WHERE bar = 1) as tmp
这样的构造在 Spark SQL 中完全有效的查询。
据我所知,the Catalyst parser source 不支持 NOT IN
子句中的内部查询:
| termExpression ~ (NOT ~ IN ~ "(" ~> rep1sep(termExpression, ",")) <~ ")" ^^
case e1 ~ e2 => Not(In(e1, e2))
仍然可以使用外连接后跟过滤器来获得相同的效果。
【讨论】:
SELECT col FROM (SELECT a + b AS col from t1) t2以上是关于Spark 支持子查询吗? [复制]的主要内容,如果未能解决你的问题,请参考以下文章
更新表时如何改进 Spark 中的 SQL 查询? (子查询中的'NOT IN')