Как мы можем сравнить два фрейма данных в spark scala, чтобы найти разницу между этими двумя файлами, какой столбец ??а стоимость? - PullRequest
0 голосов
/ 20 января 2019

У меня есть два файла, и я создал из них два кадра данных prod1 и prod2. Мне нужно найти записи с именами столбцов и значениями, которые не совпадают в обоих dfs.id_sk - это первичный ключ. Все столбцы имеют строковый тип данных

dataframe 1 (prod1)

id_sk | uuid|name
1     |10   |a
2     |20   |b
3     |30   |c

dataframe 2 (prod2)

id_sk | uuid|name
2     |20   |b-upd
3     |30-up|c
4     |40   |d

, поэтому мне нужнокадр данных результата в следующем формате.

id|col_name|values
2 |name    |b,b-upd
3 |uuid    |30,30-up

Я сделал внутреннее объединение и сравнил несопоставленные записи.

Я получаю результат следующим образом:

id_sk | uuid_prod1|uid_prod2|name_prod1|name_prod2
2     |20         |20       |b         |b-upd
3     |30         |30-up    |c         |c
val commmon_rec = prod1.join(prod2,prod1("id_sk")===prod2("id_sk"),"inner").select(prod1("id_sk").alias("id_sk_prod1"),prod1("uuid").alias("uuid_prod1"),prod1("name").alias("name_prod1"),prod1("name").alias("name_prod2")

val compare = spark.sql("select ...from common_rec where col_prod1<>col_prod2")

1 Ответ

0 голосов
/ 21 января 2019

Это возможное решение:

//to create a joined DF with column "col_name" 
//if columns "name" and "uuid" contains different values: 
var output = df1.join(df2, df1.col("id_sk")===df2.col("id_sk"))
                .where(df1.col("name")=!=df2.col("name") || df1.col("uuid")=!=df2.col("uuid"))
                .withColumn("col_name", when(df1.col("name")=!=df2.col("name"), "name")
                                       .otherwise(when(df1.col("uuid")=!=df2.col("uuid"), "uuid")))

//to create the new "col_values" column 
//containing concatenated values:
output = output.withColumn("col_values", when(output.col("col_name")==="name", when(df1.col("name")=!=df2.col("name"), concat_ws(",", df1.col("name"), df2.col("name")) ))
                                        .when(output.col("col_name")==="uuid", when(df1.col("uuid")=!=df2.col("uuid"), concat_ws(",", df1.col("uuid"), df2.col("uuid")) )))

output = output.select(df1.col("id_sk"), output.col("col_name"), output.col("col_values"))
+-----+--------+----------+
|id_sk|col_name|col_values|
+-----+--------+----------+
|    2|    name|    b,b-up|
|    3|    uuid|  30,30-up|
+-----+--------+----------+

Обратите внимание, что я не думаю, что это лучшее из возможных решений, а просто отправная точка (например, что если в одной строке более одного значения столбца?).

...