尝试在没有聚合的情况下对 Pyspark df 进行分组(我认为)

Trying to groupby Pyspark df without aggregation (i think)

我正在尝试对以下 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    |
+--------------+----------+-----+

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

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

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

我也觉得groupBy有道理

from pyspark.sql.functions import *
import builtins as p

df.groupBy('First_Purchase', 'Renewal_Mo') \
  .agg(*[max(c).alias(c) for c in df.columns[2:]]) \
  .show()

+--------------+----------+----------+---------+----------+---------+
|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|
+--------------+----------+----------+---------+----------+---------+