сравнивая два искровых фрейма данных и генерируя новый третий фрейм с замечанием - PullRequest
0 голосов
/ 24 февраля 2020

У меня два спарк-фрейма данных, один из которых имеет 70 тыс. Строк, а другой 60 тыс. Я пытаюсь сравнить каждую строку столбца с другим столбцом dataframe и создать новый dataframe с условием Remark. Если строка столбца из df1 присутствует в df2, это будет дублирующее замечание. Я попытался использовать внешнее соединение, но оно не дает ожидаемого результата.

df1
colA    colB
A       d4f488bef2
B       c8a91953fc
C       62026fd921
D       e88480226d
E       8335195031

df2
ColA    ColB
W       411c78854c9
X       0bfeb09d6cf
C       62026fd9211
E       8335195031e

**Expected output : df3**
ColA    ColB            Remark
A       d4f488bef2d2    From df1
B       c8a91953fc52    From df1
D       e88480226d3b    From df1
W       411c78854c9c    From df2
X       0bfeb09d6cfb    From df2
C       62026fd921      duplicate(In Both)
E       8335195031      duplicate(In Both)

Ответы [ 2 ]

1 голос
/ 24 февраля 2020
val df1Remark  = df.withColumn("df1_remark",lit("DF1"))
val df2Remark  = df.withColumn("df2_remark",lit("DF2"))

val res =  df1Remark.join(df1Remark,Seq("colA","colB"),"outer")
                    .withColumn("remark",when(col("df1_remark").isNotNull && col("df2_remark").isNotNull,lit("Duplicate")).otherwise(when(col("df1_remark").isNotNull,lit("From DF1")).otherwise(lit("FROM DF2"))))
0 голосов
/ 16 марта 2020

Это можно сделать с помощью spark-extension и трех простых строк:

import uk.co.gresearch.spark.diff._

val opts = DiffOptions("Remarks", "df1", "df2", "From df2", "changed", "From df1", "duplicate(In Both)")

df1.diff(df2, opts).show

+------------------+----+-----------+
|           Remarks|colA|       colB|
+------------------+----+-----------+
|          From df2|   X|0bfeb09d6cf|
|          From df1|   B| c8a91953fc|
|duplicate(In Both)|   E|8335195031e|
|          From df1|   A| d4f488bef2|
|          From df1|   D| e88480226d|
|duplicate(In Both)|   C|62026fd9211|
|          From df2|   W|411c78854c9|
+------------------+----+-----------+

Преобразование diff вычисляет разницу между df1 и df2, и opts: DiffOptions форматирует вывод в формате, который вы определили в своем вопросе.

Формат вывода по умолчанию будет выглядеть следующим образом:

df1.diff(df2).show
+----+----+-----------+
|diff|colA|       colB|
+----+----+-----------+
|   I|   X|0bfeb09d6cf|
|   D|   B| c8a91953fc|
|   N|   E|8335195031e|
|   D|   A| d4f488bef2|
|   D|   D| e88480226d|
|   N|   C|62026fd9211|
|   I|   W|411c78854c9|
+----+----+-----------+
...