2016-03-24 7 views
13

SparkSQL 1.6 API(scala)Dataframeには、交差および除外機能がありますが、違いはありません。2つのDataFramesの違いを取得する方法は?

df1.except(df2).union(df2.except(df1)) 

しかし、これは少し厄介なようだ:明らかに、労働組合のとを除く組み合わせが違いを生成するために使用することができます。私の経験上、何かが厄介なように見える場合は、特にScalaでそれを行うより良い方法があります。

答えて

16

あなたはいつものようにそれを書き換えることができます:このUNIONINTERSECTEXCEPT/MINUSはかなりの演算子を組み合わせたSQLの標準セットですが、真剣に

df1.unionAll(df2).except(df1.intersect(df2)) 

。私はXORのような操作をボックスの外に提供するシステムは認識していません。ほとんどの場合、他の3つを使用して実装するのは簡単で、そこでは最適化することはあまりありません。

+0

ありがとうございます。それがあれば、とにかくこのようなことが起こるはずです。 – WillD

2

なぜですか?

df1.except(df2) 
+0

これはXORを実行しないためです。 私は交差点にないすべての要素を探していました。 あなたのコードは、交差点にないd1の要素だけを返します。 また、交差点にないd2のものも必要です。 – WillD

1

EXCEPT(またはEXCEPTのエイリアスであるMINUS)が結果をデデュープすることに注意してください。 EXCEPT」、私はそこに書いたように

https://issues.apache.org/jira/browse/SPARK-21274

:だからあなたが設定(diffはあなたが言及した)+「以外」が予想される場合、「交差」オリジナルデータフレームに等しくなるように設定し、重複を保ち、この機能要求を検討ALL "はSpark SQLで書き換えられます

SELECT a,b,c 
FROM tab1 t1 
    LEFT OUTER JOIN 
     tab2 t2 
    ON (
     (t1.a, t1.b, t1.c) = (t2.a, t2.b, t2.c) 
    ) 
WHERE 
    COALESCE(t2.a, t2.b, t2.c) IS NULL 
関連する問題