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|
+---+-------+
我正在使用 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|
+---+-------+