You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

在PySpark DataFrame中用withColumn按分区统计唯一user_id数量

解决方案

步骤说明

根据您提供的期望输出,un_count列实际为每个user_id在对应(plan, name)分组内的出现次数。我们可以使用PySpark的窗口函数实现需求:按plan、name和user_id分区,统计每个用户在分组内的出现次数,将结果作为新列添加到原DataFrame中。

如果您实际需要的是每个(plan, name)分组内唯一user_id的总数(即分组内不同用户的数量),可以参考文末的补充说明。

完整代码

from pyspark.sql import SparkSession
from pyspark.sql import Window
from pyspark.sql.functions import count

# 初始化SparkSession
spark = SparkSession.builder.appName("user_count_example").getOrCreate()

# 构造示例输入DataFrame
data = [
    ("FWE", "QRS", 123, 10),
    ("FWE", "QRS", 123, 20),
    ("FWE", "QRS", 223, 30),
    ("RWE", "QRS", 223, 40)
]
df = spark.createDataFrame(data, ["plan", "name", "user_id", "dollars"])

# 定义窗口:按plan、name、user_id分区,统计当前用户在分组内的出现次数
window_spec = Window.partitionBy("plan", "name", "user_id")

# 添加un_count列
result_df = df.withColumn("un_count", count("user_id").over(window_spec))

# 查看结果
result_df.show()

输出结果

执行代码后会得到与您期望一致的DataFrame:

plannameuser_iddollarsun_count
FWEQRS123102
FWEQRS123202
FWEQRS223301
RWEQRS223401

补充:如果需要分组内唯一user_id的总数

如果您的真实需求是统计每个(plan, name)分组内的唯一用户数量(即分组内不同user_id的个数),只需调整窗口和统计函数:

from pyspark.sql.functions import countDistinct

# 窗口改为仅按plan、name分区
window_spec_total = Window.partitionBy("plan", "name")
result_total_df = df.withColumn("un_count", countDistinct("user_id").over(window_spec_total))
result_total_df.show()

此时输出的un_count列会是每个分组的唯一用户总数,比如FWE-QRS分组的所有行un_count都为2。

内容的提问来源于stack exchange,提问作者Ashfand

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.06.28 07:51:00