Набор данных Spark с подзапросом в условии «Где»

Я пытаюсь воссоздать запрос SQL в Spark SQL. Обычно я бы вставил в таблицу вот так:

INSERT INTO Table_B 
( 
    primary_key,
    value_1,
    value_2
) 
SELECT DISTINCT
    primary_key,
    value_1,
    value_2
FROM 
    Table_A
WHERE NOT EXISTS 
(
SELECT 1 FROM 
Table_B
WHERE
Table_B.primary_key = Table_A.primary_key
);

Spark SQL прост, и я могу загружать данные из TempView в новый набор данных. К сожалению, я не знаю, как восстановить предложение where.

Dataset<Row> Table_B = spark.sql("SELECT DISTINCT primary_key, value_1, value_2 FROM Table_A").where("NOT EXISTS ... ???" );

person br0ken.pipe    schedule 19.04.2017    source источник


Ответы (2)


Запросы с не существует в TSQL можно переписать с помощью левого соединения с «где»:

SELECT Table_A.* 
FROM Table_A Left Join Table_B on Table_B.primary_key = Table_A.primary_key
Where Table_B.primary_key is null

Возможно, аналогичный подход можно использовать в Spark с левым соединением. Например, для фреймов данных что-то вроде:

aDF.join(bDF,aDF("primary_key")===bDF("primary_key"),"left_outer").filter(isnull(col("other_b_not_nullable_column")))
person pasha701    schedule 19.04.2017

SparkSQL в настоящее время не имеет EXISTS и IN. "(последняя версия) Spark SQL/фреймы данных и наборы данных Руководство / Поддерживаемые функции Hive"

EXISTS & IN всегда можно переписать с помощью JOIN или LEFT SEMI JOIN. "Хотя Apache Spark SQL в настоящее время не поддерживает IN или EXISTS, вы можете эффективно реализовать семантику, переписав запросы для использования LEFT SEMI JOIN." ИЛИ всегда можно переписать с помощью UNION. AND NOT может быть переписан с использованием EXCEPT.

person Manish Saraf Bhardwaj    schedule 19.04.2017