我尝试在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 ... ???" );
答案 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")))