2016-09-15 6 views
-1

2つのファイルを比較したいのですが、それ以外のレコードが一致しない場合は、一致しないレコードがある別のファイルに読み込まれます。 ファイルとレコード数の両方の各フィールドも比較します。sparkを使って2つのファイルを比較するには?

+1

ファイルの構造は何ですか? –

+0

CSV形式 – Nathon

+0

スキーマは何ですか?比較列は何ですか?制約はありますか? –

答えて

3

のは、あなたが2つのファイルがあるとしましょう:

scala> val a = spark.read.option("header", "true").csv("a.csv").alias("a"); a.show 
+---+-----+ 
|key|value| 
+---+-----+ 
| a| b| 
| b| c| 
+---+-----+ 

a: org.apache.spark.sql.DataFrame = [key: string, value: string] 

scala> val b = spark.read.option("header", "true").csv("b.csv").alias("b"); b.show 
+---+-----+ 
|key|value| 
+---+-----+ 
| b| c| 
| c| d| 
+---+-----+ 

b: org.apache.spark.sql.DataFrame = [key: string, value: string] 

あなたが探している一致しないレコードのソート不明であるが、joinとの任意の定義によってそれらを見つけるのは簡単です:

scala> a.join(b, Seq("key")).show 
+---+-----+-----+ 
|key|value|value| 
+---+-----+-----+ 
| b| c| c| 
+---+-----+-----+ 

scala> a.join(b, Seq("key"), "left_outer").show 
+---+-----+-----+ 
|key|value|value| 
+---+-----+-----+ 
| a| b| null| 
| b| c| c| 
+---+-----+-----+ 

scala> a.join(b, Seq("key"), "right_outer").show 
+---+-----+-----+ 
|key|value|value| 
+---+-----+-----+ 
| b| c| c| 
| c| null| d| 
+---+-----+-----+ 

scala> a.join(b, Seq("key"), "outer").show 
+---+-----+-----+ 
|key|value|value| 
+---+-----+-----+ 
| c| null| d| 
| b| c| c| 
| a| b| null| 
+---+-----+-----+ 

b.csvのレコードが存在しない場合は、a.csv

scala> val diff = a.join(b, Seq("key"), "right_outer").filter($"a.value" isNull).drop($"a.value") 
scala> diff.show 
+---+-----+ 
|key|value| 
+---+-----+ 
| c| d| 
+---+-----+ 

scala> diff.write.csv("diff.csv") 
+0

ダニエルの返事をありがとう、その私に非常に役立ちます。 – Nathon

関連する問題