Apache spark 组合由多个值组成的dataframes列-Spark
我有两个共享相同ID列的Spark数据帧: df1: df2: 现在,我想在df1中创建一个新列,其中包含df2中表示的所有键值。因此,我的目标是: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 | 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]|
#+---+-----+-----+------+