如何基于 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|
+-------+---------+---------+---------+
所以基本上我有一个包含两行的数据框:第一行是用户数量,第二行是他们的转化率,就像这里显示的 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|
+-------+---------+---------+---------+