Поддерживает ли SparkSQL подзапрос?

Я запускаю этот запрос в оболочке Spark, но он дает мне ошибку,

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

Ошибка:

java.lang.RuntimeException: [1.47] failure: ``) '' ожидается, но идентификатор MAX найден

выберите sal из samplecsv, где sal < (выберите MAX (sal) из samplecsv)                                               ^     в scala.sys.package $.error(package.scala: 27) Может кто-нибудь объяснить мне, спасибо

Ответ 1

Планируемые функции:

  • SPARK-23945 (Column.isin() должен принимать одностолбцовый DataFrame в качестве входных данных).
  • SPARK-18455 (Общая поддержка обработки коррелированных подзапросов).

Искра 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 здесь здесь нет функции потери.

Ответ 2

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

Существует запрос на перенос для реализации этой функции. Я предполагаю, что он может приземлиться в Spark 2.0.