groupby 并使用 pyspark 将多列转换为列表

groupby and convert multiple columns into a list using pyspark

我正在使用 pyspark。所以我有一个看起来像的火花数据框:

a | b | c
5 | 2 | 1
5 | 4 | 3
2 | 4 | 2
2 | 3 | 7

需要输出:

a | b_list
5 | 2,1,4,3
2 | 4,2,3,7

保持输出中给定的顺序很重要。

以下结果将最后 2 列聚合成一个数组列:

df1 = df.withColumn('lst', f.concat(df['b'], f.lit(','), df['c']).alias('lst'))\
  .groupBy('a')\
  .agg( f.collect_list('lst').alias('b_list'))

现在加入数组元素:

#Simplistic udf to joing array:
def join_array(col):
    return ','.join(col)

join = f.udf(join_array)

df1.select('a', join(df1['b_list']).alias('b_list'))\
  .show()

正在打印:

+---+-------+
|  a| b_list|
+---+-------+
|  5|2,1,4,3|
|  2|4,2,3,7|
+---+-------+

代替udf,加入列表,我们也可以使用上面评论中建议的concat_ws函数,像这样:

import pyspark.sql.functions as F

df = (df
      .withColumn('lst', F.concat(df['b'], F.lit(','), df['c']).alias('lst'))
      .groupBy('a')
      .agg( F.concat_ws(',', F.collect_list('lst').alias('b_list')).alias('lst')))

df.show()

+---+-------+
|  a|    lst|
+---+-------+
|  5|2,1,4,3|
|  2|4,2,3,7|
+---+-------+