如何基于 date/month 将 pyspark 数据框中同一列的行相乘?

How to multiply the rows on a same column in a pyspark dataframe based on date/month?

所以基本上我有一个包含两行的数据框:第一行是用户数量,第二行是他们的转化率,就像这里显示的 table:

df.show()
+---------+----------+----------+----------+                                       
| month   | company_1| company_2| company_3|
+---------+----------+----------+----------+
| 02-2022 | 1000     | 5000     | 500      |
| 02-2022 | 0.08     | 0.13     | 0.45     |
+---------+----------+----------+----------+

我需要用转化率乘以用户数,这样我就可以得到每个月在该公司购买商品的客户数量,如此处显示的 table:

df.show()
+---------+----------+----------+----------+                                       
| month   | company_1| company_2| company_3|
+---------+----------+----------+----------+
| 02-2022 | 80       | 650      | 225      |
+---------+----------+----------+----------+

我不知道我该怎么做,你们能帮帮我吗?

谢谢!

在此处对产品使用 groupby:

文档:https://spark.apache.org/docs/latest/api/python/reference/api/pyspark.sql.functions.product.html

df.groupBy("month").agg(*[F.product(col).alias(col) for col in cols]).show()

+-------+---------+---------+---------+
|  month|company_1|company_2|company_3|
+-------+---------+---------+---------+
|02-2022|     80.0|    650.0|    225.0|
+-------+---------+---------+---------+

对于旧版本的 pyspark,您可以使用 spark 2.4+

提供的高阶函数来执行类似的操作
cols = [col for col in df.columns if col!= "month"]
out = df.groupBy("month").agg(*[F.expr(f"""aggregate(collect_list({col}),
                                cast(1 as double),(value, acc) -> value * acc, 
                                acc -> acc) as {col}""") for col in cols])

out.show()
+-------+---------+---------+---------+
|  month|company_1|company_2|company_3|
+-------+---------+---------+---------+
|02-2022|     80.0|    650.0|    225.0|
+-------+---------+---------+---------+