2016-09-15 4 views
-1

Я хочу сравнить два файла, если не сопоставил дополнительную загрузку записей в другой файл с непревзойденными записями. Сравните все поля и в файле, и в количестве записей.Как сравнить два файла с использованием искры?

+1

Какова структура файлов? –

+0

Это CSV-формат – Nathon

+0

Что это за схема? Что такое столбец сравнения? Есть ли ограничение? –

ответ

3

Допустим, у вас есть два файла:

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

Спасибо за ответ Daniel, его очень полезно для меня. – Nathon

Смежные вопросы