首页 > 解决方案 > 尝试在不聚合的情况下对 Pyspark df 进行分组(我认为)

问题描述

我正在尝试对以下 pyspark 数据框进行分组以组合renewal_mo 值,但似乎无法弄清楚。

我有这个数据框:

+--------------+----------+----------+---------+----------+---------+
|First_Purchase|Renewal_Mo|second_buy|third_buy|fourth_buy|fifth_buy|
+--------------+----------+----------+---------+----------+---------+
|6             |1         |1         |0        |0         |0        |
|6             |12        |36        |0        |0         |0        |
|6             |24        |4         |0        |0         |0        |
|6             |18        |2         |0        |0         |0        |
|6             |3         |6         |0        |0         |0        |
|6             |2         |8         |0        |0         |0        |
|6             |36        |1         |0        |0         |0        |
|6             |6         |12        |0        |0         |0        |
|6             |12        |0         |1        |0         |0        |
|6             |3         |0         |1        |0         |0        |
|6             |2         |0         |7        |0         |0        |
|6             |6         |0         |1        |0         |0        |
|6             |1         |0         |0        |1         |0        |
|6             |12        |0         |0        |1         |0        |
+--------------+----------+----------+---------+----------+---------+

并希望合并renewal_mo中的值,因此没有重复并生成此数据框:

|First_Purchase|Renewal_Mo|second_buy|third_buy|fourth_buy|fifth_buy|
+--------------+----------+----------+---------+----------+---------+
|6             |1         |1         |0        |1         |0        |
|6             |12        |36        |1        |1         |0        |
|6             |24        |4         |0        |0         |0        |
|6             |18        |2         |0        |0         |0        |
|6             |3         |6         |1        |0         |0        |
|6             |2         |8         |7        |0         |0        |
|6             |36        |1         |0        |0         |0        |
|6             |6         |12        |1        |0         |0        |
+--------------+----------+----------+---------+----------+---------+

但是 groupby 似乎是错误的方法,因为它需要传递一个聚合函数。我可以以某种方式使用Windows分区吗?能不能有别的办法?我在这里想念什么?

如果我尝试

foo.groupby('First_Purchase','Renewal_Mo').count().show(truncate=False)

我当然会丢失购买列,它只计算 Renewal_Mo 的实例。我不知道如何解决这个问题以立即获得所需的数据框

+--------------+----------+-----+
|First_Purchase|Renewal_Mo|count|
+--------------+----------+-----+
|6             |1         |2    |
|6             |12        |3    |
|6             |24        |1    |
|6             |18        |1    |
|6             |3         |2    |
|6             |2         |2    |
|6             |36        |1    |
|6             |6         |2    |
+--------------+----------+-----+

标签: apache-sparkpysparkpyspark-dataframes

解决方案


我不明白你为什么说 groupby 是一种错误的方法,因为它需要一个聚合函数。我这样做的唯一方法是分组和聚合,有一个内置函数 sum 可以完全满足您的要求:

df.groupBy('First_Purchase','Renewal_Mo') \
    .agg({'second_by': 'sum',
          'third_by':  'sum'}) # So on with remaining columns

唯一发生的事情是此方法更改了列名,但您可以使用多种方法轻松解决它。


推荐阅读