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