SparkSQL是否支持子查询?

时间:2015-11-26 07:49:05

标签: sql apache-spark subquery apache-spark-sql

我在Spark shell中运行此查询,但它给了我错误,

sqlContext.sql(
 "select sal from samplecsv where sal < (select MAX(sal) from samplecsv)"
).collect().foreach(println)

错误:

  

java.lang.RuntimeException:[1.47]失败:``)&#39;&#39;预期但标识符MAX找到

     

从samplecsv中选择sal,其中sal < (从samplecsv中选择MAX(sal))                                                 ^       在scala.sys.package $ .error(package.scala:27)   任何人都可以解释我,谢谢

2 个答案:

答案 0 :(得分:35)

计划功能

  • SPARK-23945(Column.isin()应接受单列DataFrame作为输入。)
  • SPARK-18455(对相关子查询处理的一般支持)。

Spark 2.0 +

Spark SQL应该支持相关和不相关的子查询。有关详细信息,请参阅SubquerySuite。一些例子包括:

select * from l where exists (select * from r where l.a = r.c)
select * from l where not exists (select * from r where l.a = r.c)

select * from l where l.a in (select c from r)
select * from l where a not in (select c from r)

不幸的是,就目前而言(Spark 2.0),使用DataFrame DSL无法表达相同的逻辑。

Spark&lt; 2.0

Spark支持FROM子句中的子查询(与Hive&lt; = 0.12相同)。

SELECT col FROM (SELECT *  FROM t1 WHERE bar) t2

它根本不支持WHERE子句中的子查询。一般来说,任意子查询(特别是相关子查询)无法使用Spark表示而不会提升为笛卡尔连接。

由于子查询性能通常是典型关系系统中的一个重要问题,并且每个子查询都可以使用JOIN来表示,因此这里没有功能损失。

答案 1 :(得分:0)

https://issues.apache.org/jira/browse/SPARK-4226

有一个拉取请求来实现该功能..我的猜测它可能会落在Spark 2.0中。