我想在pyspark DataFrame中对数据进行分组,当我只有一个字段field1
时,我这样做如下:
groups = df.select("field1").distinct().flatMap(lambda x: x).collect()
dfs = [df.where(df["field1"] == g) for g in groups]
我得到了 N 个数据帧的列表dfs
,其中 N 的大小为 groups
.现在,我想使用 field1
和 field2
对数据进行分组。
我该怎么做?
另外,我想知道使用数据帧列表是否是一种好方法?然后我在 for 循环中使用dfs
:for d in dfs
。但是这个 for 循环真的很慢。
如果您只对按两个特定列分组感兴趣,请使用 groupBy
.使用两列的简单示例:
val df2 = df.groupBy('col1', 'col2')
执行groupBy
后,通常必须使用带有agg
的聚合函数,有关可用选项,请参阅此处。
如果您需要的是两列的所有组合的列表,那么另一种方法是循环访问它们并执行groupBy
.然而,groupBy
因缓慢和低效而臭名昭著。根据您需要聚合的内容,最好查看reduceByKey
或combineByKey
。