我在Spark shell中运行这个查询,但它给了我错误,
sqlContext.sql(
"select sal from samplecsv where sal < (select MAX(sal) from samplecsv)"
).collect().foreach(println)
错误:
java.lang.RuntimeException:[1.47]失败:应为")",但标识符MAX找到
从samplecsv中选择sal<(从samplecsv中选择MAX(sal))^在scala.sys.package$.error(package.scala:27)有人能解释我吗,谢谢
计划功能:
- SPARK-23945(Column.isi()应接受单列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来表达相同的逻辑。
火花<2.0
Spark支持FROM
子句中的子查询(与Hive<=0.12相同)
SELECT col FROM (SELECT * FROM t1 WHERE bar) t2
它根本不支持WHERE
子句中的子查询。一般来说,如果不升级为笛卡尔连接,就无法使用Spark表达任意子查询(尤其是相关子查询)。
由于子查询性能通常是典型关系系统中的一个重要问题,并且每个子查询都可以使用JOIN
来表示,因此这里没有功能损失。
https://issues.apache.org/jira/browse/SPARK-4226
存在实现该功能的拉取请求。。我猜它可能会登陆Spark 2.0。