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

时间:2018-04-28 19:19:40

标签: pyspark spark-dataframe

我正在使用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 个答案:

答案 0 :(得分:2)

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

答案 1 :(得分:1)

以下结果将最后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|
+---+-------+