在Where条件下使用Subselect的Spark数据集

时间:2017-04-19 14:32:09

标签: apache-spark apache-spark-dataset

我尝试在Spark SQL中重新创建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 ... ???" );

2 个答案:

答案 0 :(得分:1)

SparkSQL目前没有EXISTS&amp;在。 “(Latest) Spark SQL / DataFrames and Datasets Guide / Supported Hive Features

EXISTS&amp;始终可以使用JOIN或LEFT SEMI JOIN重写IN。 “Although Apache Spark SQL currently does not support IN or EXISTS subqueries, you can efficiently implement the semantics by rewriting queries to use LEFT SEMI JOIN.”或者可以使用UNION重写OR。 AND NOT可以使用EXCEPT重写。

答案 1 :(得分:1)

TSQL中不存在的查询可以使用&#34;中的左连接重写;其中&#34;:

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")))