Apache spark 组合由多个值组成的dataframes列-Spark

Apache spark 组合由多个值组成的dataframes列-Spark,apache-spark,pyspark,Apache Spark,Pyspark,我有两个共享相同ID列的Spark数据帧: df1: df2: 现在,我想在df1中创建一个新列,其中包含df2中表示的所有键值。因此,我的目标是: +------+---------+---------+---------+ |ID | Name1 | Name2 | keys | +------+---------+---------+---------+ | 1 | A | B | w,x | | 2 | C |

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

df1:

df2:

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

+------+---------+---------+---------+
|ID    |  Name1  |  Name2  |  keys   |
+------+---------+---------+---------+
|   1  |     A   |     B   |   w,x   |
|   2  |     C   |     D   |    y    |
|   3  |     E   |     F   |    z    |
+------+---------+---------+---------+
最终,我想为任意数量的密钥找到一个解决方案

我在Pypark中的尝试:

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函数的第二个参数需要是一个列类型变量,我不知道如何正确地修改x

您正在寻找collect_list函数

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\u set

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

    return x

df_keys = df1.withColumn("keys", get_keys(col('ID')))
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]|
#+---+-----+-----+------+