2017-04-19 15 views
0

Spark SQLでSQLクエリを再作成しようとしました。条件でのSubselectを使用したSparkデータセット

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

スパークSQLは簡単ですし、私は新しいデータセットにTempViewからデータを読み込むことができます。通常、私はこのようなテーブルに挿入します。残念ながらwhere節を再構築する方法はわかりません。

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

答えて

1

現在、SparkSQLにはEXISTS &がありません。 "(Latest) Spark SQL/DataFrames and Datasets Guide/Supported Hive Features"

EXISTS & INは、常にJOINまたはLEFT SEMI JOINを使用して書き換えられます。 "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." ORは常にUNIONを使用して書き換えられます。 AND NOTはEXCEPTを使用して書き換えることができます。 TSQLに存在していないと

1

クエリは左に書き換えることができる「どこ」に参加:たぶん

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 

、同様のアプローチは、左の参加で、スパークに使用することができます。たとえば、データフレームの場合、smthingは次のようになります。

aDF.join(bDF,aDF("primary_key")===bDF("primary_key"),"left_outer").filter(isnull(col("other_b_not_nullable_column"))) 
関連する問題