如何按日期分组取唯一作者并统计其favCount每日总和(支持PySpark/Pandas/SQL)
每日发布帖子作者favCount总和统计方案
核心逻辑:同一作者单日发布多篇帖子会导致连接后的数据集出现重复的作者记录,因此需要先按date和authorId两个字段去重,保证每个作者在同一天仅保留一条有效记录,再按日期分组对favCount求和即可得到预期结果。
注意:请勿直接使用SUM(DISTINCT favCount)计算,不同作者可能有相同的favCount数值,会导致求和结果错误。
PySpark 实现
假设你连接后的DataFrame名为joined_df,实现代码如下:
from pyspark.sql.functions import col, sum # 1. 先将favCount转换为整数类型(示例中为字符串格式,可根据实际类型跳过该步) processed_df = joined_df.withColumn("favCount", col("favCount").cast("int")) # 2. 按日期和作者ID去重后分组求和 result = processed_df \ .dropDuplicates(["date", "authorId"]) \ .groupBy("date") \ .agg(sum("favCount").alias("sum(favCount)")) \ .orderBy("date") # 查看结果 result.show()
Pandas 实现
同样假设连接后的DataFrame名为joined_df,实现代码如下:
import pandas as pd # 转换favCount为数值类型 joined_df["favCount"] = pd.to_numeric(joined_df["favCount"]) # 去重后分组求和 result = joined_df \ .drop_duplicates(subset=["date", "authorId"]) \ .groupby("date", as_index=False)["favCount"] \ .sum() \ .rename(columns={"favCount": "sum(favCount)"}) # 查看结果 print(result)
SQL 实现
如果通过SQL直接查询连接后的表,可使用如下语句:
SELECT date, SUM(favCount) AS `sum(favCount)` FROM ( -- 子查询先按日期、作者ID去重,保留唯一的favCount SELECT DISTINCT date, authorId, CAST(favCount AS UNSIGNED) AS favCount FROM joined_table ) t GROUP BY date ORDER BY date;
如果直接从原始posts和authors表查询,也可以写为:
SELECT p.date, SUM(CAST(a.favCount AS UNSIGNED)) AS `sum(favCount)` FROM posts p INNER JOIN authors a ON p.authorId = a.authorId GROUP BY p.date, p.authorId GROUP BY p.date ORDER BY p.date;
内容的提问来源于stack exchange,提问作者Abdalla
相关产品推荐
相关产品推荐

