2017-11-07 7 views
2

私はQAデータの移動にSpark(Scala)を使用しています。 QAプロセスでは、ソース表とターゲット表の完全な外部結合を実行します。Spark/Scala - 1つがNULLのときにデータフレーム内の2つの列を比較します。

val mismatchColumns = for (i <- 0 to (sourceDF.columns.length-1)) yield (joinedDF.col(joinedDF.columns(i)) =!= joinedDF.col(joinedDF.columns(i+(sourceDF.columns.length)))) 
val mismatchedDF = joinedDF.filter(mismatchColumns.reduce((_||_))) 

しかし場合:私はミスマッチを見つけるために、次のロジックを使用してい

val joinColumns = for (i <- 0 to (sourceJoinFields.length - 1)) yield sourceDF.col(sourceJoinFields(i)) <=> targetDF.col(targetJoinFields(i)) 
val joinedDF = sourceDF.join(targetDF, joinColumns.reduce((_&&_)), "fullouter") 

ソーステーブルとターゲットテーブルは、キー(複数可)上のデータフレームに接合されています

+--------------+--------------+--------------+--------------+ 
|source_key |source_field |target_key |target_field | 
+--------------+--------------+--------------+--------------+ 
|null   |null   |XXX   |XXX   | 

は、不一致のデータに含まれていませんセット。

私の質問: '=!='演算子は '< =>'演算子の反対ですか?それはそうではないようですが、この場合はFALSEを返す演算子がありますか?いずれのオペレータでも多くのドキュメントを見つけることはできません。

答えて

3

IS NOT DISTINCT FROM<=>)の反対は、IS DISTINCT FROMnot(... <=> ...))です。

import org.apache.spark.sql.not 

val df = Seq(("foo", null), ("foo", "bar"), ("foo", "foo")).toDF("x", "y") 
df.select(not($"x" <=> $"y")) 

または

df.select(!($"x" <=> $"y")) 

または

df.selectExpr("x IS DISTINCT FROM y") 

すべて同じ結果を与える:

:あなたが否定の論理和を持っている場合はもちろん

+---------------+ 
|(NOT (x <=> y))| 
+---------------+ 
|   true| 
|   true| 
|   false| 
+---------------+ 

(NOT P) OR (NOT Q) 

あなたは常にconcjunctionsので

NOT(P AND Q) 

の否定としてそれを書き換えるド・モルガンの法則を使用することができます。

not(joinColumns.foldLeft(lit(true))(_ and _)) 

はうまく動作するはずです。

+1

それでした。 「まあ、やあ!私の部分に....ありがとう! – Joe787

関連する問題