如何按两个字段对数据进行分组?

How to group data by two fields?

我想在 pyspark DataFrame 中对数据进行分组,当我只有一个字段时,我按如下方式进行 field1:

groups = df.select("field1").distinct().flatMap(lambda x: x).collect()
dfs = [df.where(df["field1"] == g) for g in groups]

我得到了 N 个 DataFrame 的列表 dfs,其中 N 是 groups 的大小。现在我想使用 field1field2 对我的数据进行分组。

我该怎么做?

另外,我想知道使用 DataFrame 列表是否是一个好方法?然后我在 for 循环中使用 dfsfor d in dfs。但是这个for循环真的很慢。

如果您只对按两个特定列进行分组感兴趣,请使用 groupBy。使用两列的简单示例:

val df2 = df.groupBy('col1', 'col2')

执行 groupBy 后,通常您必须使用带有 agg 的聚合函数,请参阅 here 了解可用选项。


如果您需要的是两列所有组合的列表,那么另一种方法是遍历它们并执行 groupBy。但是,groupBy 因速度慢且效率低下而臭名昭著。根据您需要聚合的内容,查看 reduceByKeycombineByKey.

可能是个好主意