我有两个共享相同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
进行突变。
答案 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}}