【发布时间】:2019-01-22 00:00:29
【问题描述】:
我有两个 spark 数据框:
数据框 A:
|col_1 | col_2 | ... | col_n |
|val_1 | val_2 | ... | val_n |
和数据框 B:
|col_1 | col_2 | ... | col_m |
|val_1 | val_2 | ... | val_m |
数据框 B 可以包含来自数据框 A 的重复、更新和新行。我想在 spark 中编写一个操作,我可以在其中创建一个新数据框,其中包含来自数据框 A 的行以及来自数据框 B 的更新行和新行。
我首先创建了一个哈希列,其中仅包含不可更新的列。这是唯一的标识。所以假设col1 和col2 可以更改值(可以更新),但col3,..,coln 是唯一的。我创建了一个哈希函数为hash(col3,..,coln):
A=A.withColumn("hash", hash(*[col(colname) for colname in unique_cols_A]))
B=B.withColumn("hash", hash(*[col(colname) for colname in unique_cols_B]))
现在我想编写一些 spark 代码,基本上从 B 中选择散列不在 A 中的行 (所以新行和更新行) 并将它们与来自 A 的行。如何在 pyspark 中实现这一点?
编辑: 数据框 B 可以有来自数据框 A 的额外列,因此无法进行联合。
示例示例
数据框 A:
+-----+-----+
|col_1|col_2|
+-----+-----+
| a| www|
| b| eee|
| c| rrr|
+-----+-----+
数据框 B:
+-----+-----+-----+
|col_1|col_2|col_3|
+-----+-----+-----+
| a| wew| 1|
| d| yyy| 2|
| c| rer| 3|
+-----+-----+-----+
结果: 数据框 C:
+-----+-----+-----+
|col_1|col_2|col_3|
+-----+-----+-----+
| a| wew| 1|
| b| eee| null|
| c| rer| 3|
| d| yyy| 2|
+-----+-----+-----+
【问题讨论】:
-
您在寻找类似this answer 的东西吗?而不是散列,更好的方法是加入唯一 id。
-
这与那个答案不相似,因为对我来说,我还需要保留来自数据框 B 的新行。
-
我需要一个哈希列,因为我没有唯一的 id 列。
-
您可以加入多个列,这应该相当于散列,但根据您的问题很难判断。你能提供一个reproducible example 一些小样本输入/所需的输出吗?