在 withColumn pyspark / python 中使用总和

Using sum in withColumn pyspark / python

我在一个小问题上需要你的帮助,我实际上是通过手动方式解决的,但我希望它“正确”

数据:

customer_id gender
abc m
def w

等等

现在它通过以下方式获取聚合:

gender_count = data.groupBy('gender').agg(F.countDistinct('customer_id').alias('amount'))

gender_count:

gender amount
m 4
w 6

现在,我想创建一个包含客户总数的新列,以计算各个性别的份额。 但是,我找不到适用于“withColumn”的函数。所以我做的是总结之前的客户数量,然后将其作为文字值插入:

gender_count = gender_count.withColumn('total', F.lit(10)).withColumn('share', (F.col('amount') / F.col('total')))

结果:

gender amount total share
m 4 10 0.4
w 6 10 0.6

你知道我如何替换 F.lit(10) 吗?这将为我节省一个手动步骤和一个潜在的错误来源。

谢谢!

您可以在数据帧上使用 count()。

total_items = data.count()

gender_count = gender_count.withColumn('total', F.lit(total_items)).withColumn('share', (F.col('amount') / F.col('total')))

您可以在聚合之前将count用作window函数以计算所有记录。

from pyspark.sql import functions as F
from pyspark.sql import Window as W

(df
    .withColumn('count', F.count('*').over(W.partitionBy(F.lit(1))))
    .groupBy('gender', 'count')
    .agg(F.countDistinct('customer_id').alias('amount'))
    .withColumn('share', F.col('amount') / F.col('count'))
    .show()
)

+------+-----+------+-----+
|gender|count|amount|share|
+------+-----+------+-----+
|     m|   10|     4|  0.4|
|     w|   10|     6|  0.6|
+------+-----+------+-----+