合并由多个值组成的数据框列-Spark

时间:2019-05-10 12:59:29

标签: apache-spark pyspark

我有两个共享相同ID列的Spark数据帧:

df1

+------+---------+---------+
|ID    |  Name1  |  Name2  |
+------+---------+---------+
|   1  |     A   |     B   |
|   2  |     C   |     D   |
|   3  |     E   |     F   |
+------+---------+---------+

df2

+------+-------+
|ID    |  key  |
+------+-------+
|   1  |   w   |
|   1  |   x   |
|   2  |   y   |
|   3  |   z   |
+------+-------+

现在,我想在df1中创建一个新列,其中包含df2中表示的所有键值。因此,我追求结果:

+------+---------+---------+---------+
|ID    |  Name1  |  Name2  |  keys   |
+------+---------+---------+---------+
|   1  |     A   |     B   |   w,x   |
|   2  |     C   |     D   |    y    |
|   3  |     E   |     F   |    z    |
+------+---------+---------+---------+

最终,我想找到任意数量的键的解决方案。

我在PySpark中的尝试:

def get_keys(id):
    x = df2.where(df2.ID == id).select('key')

    return x

df_keys = df1.withColumn("keys", get_keys(col('ID')))

在上面的代码中,x是一个数据帧。由于.withColumn函数的第二个参数需要是Column类型的变量,因此我不确定如何正确地对x进行突变。

1 个答案:

答案 0 :(得分:1)

您正在寻找from pyspark.sql.functions import collect_list df3 = df1.join(df2, df1.ID == df2.ID).drop(df2.ID) df3.groupBy('ID','Name1','Name2').agg(collect_list('key').alias('keys')).show() #+---+-----+-----+------+ #| ID|Name1|Name2| keys| #+---+-----+-----+------+ #| 1| A| B|[w, x]| #| 3| C| F| [z]| #| 2| B| D| [y]| #+---+-----+-----+------+ 函数。

collect_set

如果只需要唯一键,则可以使用{{1}}