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

groupby并使用pyspark将多个列转换为列表,pyspark,spark-dataframe,Pyspark,Spark Dataframe,我用的是pyspark。我有一个spark数据框,看起来像: 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 保持输出中给出的顺序很重要。最后两列中的以下结果聚合为一个数组列: df1 = df.withColumn('lst', f.concat(df['b'], f.lit(','), df['c']).alias('lst'))\ .groupBy(

我用的是pyspark。我有一个spark数据框,看起来像:

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

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

最后两列中的以下结果聚合为一个数组列:

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,如下所示:

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|
+---+-------+

关于当前排序的数据帧是什么?@ErnestKiwele不理解您的问题,但我想对a列进行分组,并将b、c放入输出中给出的列表中。在pandas中,这是一个单行答案,我在pyspark中无法理解。您可以使用它进行连接,这将比使用udf更快。@pault谢谢。不确定我是否读错了,但当我第一次看到它时,它似乎想要字符串列作为输入,但我要传入数组。等我有时间再看一看……您可以将一个数组(如
collect_list
的输出)传递到
concat_ws
——例如,看一看。