SparkSQL 支持子查询吗?
Does SparkSQL support subquery?
我是 运行 Spark 中的这个查询 shell 但它给了我错误,
sqlContext.sql(
"select sal from samplecsv where sal < (select MAX(sal) from samplecsv)"
).collect().foreach(println)
错误:
java.lang.RuntimeException: [1.47] failure: ``)'' expected but identifier MAX found
select sal from samplecsv where sal < (select MAX(sal) from samplecsv)
^
at scala.sys.package$.error(package.scala:27)
Can anybody explan me,thanks
计划的功能:
- 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 < 2.0
Spark 支持 FROM
子句中的子查询(与 Hive <= 0.12 相同)。
SELECT col FROM (SELECT * FROM t1 WHERE bar) t2
它根本不支持 WHERE
中的子查询 clause.Generally 说任意子查询(特别是相关子查询)不能在不升级到笛卡尔连接的情况下使用 Spark 表达。
由于子查询性能通常是典型关系系统中的一个重要问题,并且每个子查询都可以使用 JOIN
表示,因此这里没有功能损失。
https://issues.apache.org/jira/browse/SPARK-4226
有一个实现该功能的拉取请求。我猜它可能会出现在 Spark 2.0 中。
我是 运行 Spark 中的这个查询 shell 但它给了我错误,
sqlContext.sql(
"select sal from samplecsv where sal < (select MAX(sal) from samplecsv)"
).collect().foreach(println)
错误:
java.lang.RuntimeException: [1.47] failure: ``)'' expected but identifier MAX found
select sal from samplecsv where sal < (select MAX(sal) from samplecsv) ^ at scala.sys.package$.error(package.scala:27) Can anybody explan me,thanks
计划的功能:
- 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 < 2.0
Spark 支持 FROM
子句中的子查询(与 Hive <= 0.12 相同)。
SELECT col FROM (SELECT * FROM t1 WHERE bar) t2
它根本不支持 WHERE
中的子查询 clause.Generally 说任意子查询(特别是相关子查询)不能在不升级到笛卡尔连接的情况下使用 Spark 表达。
由于子查询性能通常是典型关系系统中的一个重要问题,并且每个子查询都可以使用 JOIN
表示,因此这里没有功能损失。
https://issues.apache.org/jira/browse/SPARK-4226
有一个实现该功能的拉取请求。我猜它可能会出现在 Spark 2.0 中。