scala - 我们如何比较 spark scala 中的两个数据帧以找出这两个文件之间的差异,哪一列?和价值?
问题描述
我有两个文件,并从中创建了两个数据框 prod1 和 prod2。我需要找到列名和值在两个 dfs 中都不匹配的记录。id_sk 是主键。所有列都是字符串数据类型
数据框 1 (prod1)
id_sk | uuid|name
1 |10 |a
2 |20 |b
3 |30 |c
数据框 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")
解决方案
这是一个可能的解决方案:
//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|
+-----+--------+----------+
请注意,我认为这不是最好的解决方案,而只是一个起点(例如,如果一行有多个不同的列值怎么办?)。
推荐阅读
- python - 由于我向项目添加了一个新应用程序,因此无法访问 django-rosetta
- angular - Angular 中的项目定义是什么?
- cytoscape.js - 未捕获的类型错误:el.target 不是 Cytoscape 中的函数
- amazon-athena - Athena/Presto 数据发现查询推荐 JSON 模式?
- python - Python 中的 KeyError **kwargs
- javascript - 如何设置 maxDate 是当年 12 月的最后一天?
- java - 属性未传递给 bean
- bash - 如何使用bash替换csv文件中特定位置的字符串
- html - 浮动向右移动下一行
- html - 使用百分比作为网格间隙时 CSS 网格高度错误