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

Spark Scala 2.11.11日期列统计报错,求实现Top100包裹用户统计

问题排查与修正代码

你的代码主要存在以下几个问题:

  • 逻辑目标偏离:你要统计用户的包裹接收量,但原注释代码错误地按Month分组,丢失了用户身份信息,且后续试图把date列重命名为包裹数量,这完全不符合需求。
  • 操作顺序错误:分组统计应该在列重命名之前完成,且统计维度应为用户(姓名+Package ID)而非月份。
  • 缺少排序和取前100的逻辑。

以下是修正后的代码,完全匹配你的需求:

df
  .join(df2, Seq("pId"))
  .select("pId", "firstName", "lastName") // 不需要保留date,统计数量只需要分组用户维度
  .groupBy("pId", "firstName", "lastName")
  .count() // 统计每个用户的包裹数量
  .withColumnRenamed("pId", "Package ID")
  .withColumnRenamed("count", "Number of Packages")
  .withColumnRenamed("firstName", "First Name")
  .withColumnRenamed("lastName", "Last Name")
  .orderBy(col("Number of Packages").desc) // 按包裹数量降序排序
  .limit(100) // 取前100名
  .show(false)

代码说明

  1. 连接DataFrame后只保留用户和包裹ID相关列,不需要date(若你需要按日期范围统计,可在select中保留并添加过滤条件)。
  2. 按pId、firstName、lastName分组,调用count()得到每个用户的包裹总数。
  3. 对列名进行重命名,匹配你需要的展示名称。
  4. 按包裹数量降序排序,用limit(100)获取接收量最多的前100人。

如果需要按月份统计用户的包裹量(比如每月的Top100),可以调整代码如下:

import org.apache.spark.sql.functions.{month, year, concat, lit}

df
  .join(df2, Seq("pId"))
  .select("pId", "date", "firstName", "lastName")
  .withColumn("Year-Month", concat(year(col("date")), lit("-"), month(col("date")))) // 生成年月维度
  .groupBy("Year-Month", "pId", "firstName", "lastName")
  .count()
  .withColumnRenamed("pId", "Package ID")
  .withColumnRenamed("count", "Number of Packages")
  .withColumnRenamed("firstName", "First Name")
  .withColumnRenamed("lastName", "Last Name")
  .orderBy(col("Year-Month").desc, col("Number of Packages").desc)
  .limit(100)
  .show(false)

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.08.07 03:01:11