【发布时间】:2020-06-02 08:55:24
【问题描述】:
我正在尝试比较两个具有相同列数的数据框,即在两个数据框中以 id 作为关键列的 4 列
df1 = spark.read.csv("/path/to/data1.csv")
df2 = spark.read.csv("/path/to/data2.csv")
现在我想将新列附加到 DF2,即 column_names,它是与 df1 具有不同值的列的列表
df2.withColumn("column_names",udf())
DF1
+------+---------+--------+------+
| id | |name | sal | Address |
+------+---------+--------+------+
| 1| ABC | 5000 | US |
| 2| DEF | 4000 | UK |
| 3| GHI | 3000 | JPN |
| 4| JKL | 4500 | CHN |
+------+---------+--------+------+
DF2:
+------+---------+--------+------+
| id | |name | sal | Address |
+------+---------+--------+------+
| 1| ABC | 5000 | US |
| 2| DEF | 4000 | CAN |
| 3| GHI | 3500 | JPN |
| 4| JKL_M | 4800 | CHN |
+------+---------+--------+------+
现在我想要 DF3
DF3:
+------+---------+--------+------+--------------+
| id | |name | sal | Address | column_names |
+------+---------+--------+------+--------------+
| 1| ABC | 5000 | US | [] |
| 2| DEF | 4000 | CAN | [address] |
| 3| GHI | 3500 | JPN | [sal] |
| 4| JKL_M | 4800 | CHN | [name,sal] |
+------+---------+--------+------+--------------+
我看到了这个 SO 问题,How to compare two dataframe and print columns that are different in scala。试过了,结果不一样。
我正在考虑通过将每个数据帧中的行传递给 udf 并逐列比较并返回列列表来使用 UDF 函数。但是,为此,两个数据帧都应该按排序顺序排列,以便将相同的 id 行发送到 udf。排序在这里是昂贵的操作。有什么解决办法吗?
【问题讨论】:
-
你想要 pyspark 还是 spark 的解决方案?是指scala还是python?
-
我在 python 中寻找解决方案
-
Sorting is costly operation here.- 在这种情况下,我认为没有比排序更好的方法了 -
这里不需要UDF。在
id上使用左连接,然后比较列值并创建新列column_names。
标签: python dataframe apache-spark pyspark apache-spark-sql