Pyspark 通过多个键并行分组数据框
Pyspark Group a Dataframe by Multiple Keys in Parallel
我需要按所有可能的列组合对数据框进行分组并输出计数。
例如:
df:
col1
col2
val1
val2
combination_list:
[[col1], [col2], [col1, col2]]
组合的个数=2^n - 1,也就是说我需要做2^n -1次groupby操作
我试过:
for c in combination_list:
df_result = df.groupby(c).count()
df_result.repartition(1).write.csv('file_path')
这非常慢,因为我有数百种组合,而且我知道在 pyspark 中应该避免 for 循环。 如何对列表中的所有组合并行进行groupby?
您要查找的操作是cube
。
Cube 为作为参数传递的所有列组合生成聚合。
data = [("c1v1", "c2v1",),
("c1v2", "c2v2",),
("c1v1", "c2v2",), ]
df = spark.createDataFrame(data, ("col1", "col2"))
df.show()
"""
+----+----+
|col1|col2|
+----+----+
|c1v1|c2v1|
|c1v2|c2v2|
|c1v1|c2v2|
+----+----+
"""
df.cube(df.columns).count().show()
"""
+----+----+-----+
|col1|col2|count|
+----+----+-----+
|c1v2|c2v2| 1|
|c1v1|c2v1| 1|
|c1v1|c2v2| 1|
|null|null| 3|
|null|c2v2| 2|
|null|c2v1| 1|
|c1v2|null| 1|
|c1v1|null| 2|
+----+----+-----+
"""
我需要按所有可能的列组合对数据框进行分组并输出计数。
例如:
df:
col1 | col2 |
---|---|
val1 | val2 |
combination_list:
[[col1], [col2], [col1, col2]]
组合的个数=2^n - 1,也就是说我需要做2^n -1次groupby操作
我试过:
for c in combination_list:
df_result = df.groupby(c).count()
df_result.repartition(1).write.csv('file_path')
这非常慢,因为我有数百种组合,而且我知道在 pyspark 中应该避免 for 循环。 如何对列表中的所有组合并行进行groupby?
您要查找的操作是cube
。
Cube 为作为参数传递的所有列组合生成聚合。
data = [("c1v1", "c2v1",),
("c1v2", "c2v2",),
("c1v1", "c2v2",), ]
df = spark.createDataFrame(data, ("col1", "col2"))
df.show()
"""
+----+----+
|col1|col2|
+----+----+
|c1v1|c2v1|
|c1v2|c2v2|
|c1v1|c2v2|
+----+----+
"""
df.cube(df.columns).count().show()
"""
+----+----+-----+
|col1|col2|count|
+----+----+-----+
|c1v2|c2v2| 1|
|c1v1|c2v1| 1|
|c1v1|c2v2| 1|
|null|null| 3|
|null|c2v2| 2|
|null|c2v1| 1|
|c1v2|null| 1|
|c1v1|null| 2|
+----+----+-----+
"""