我在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) 任何人都可以解释我,谢谢
答案 0 :(得分:35)
计划功能:
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中。