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)
代码说明
- 连接DataFrame后只保留用户和包裹ID相关列,不需要
date(若你需要按日期范围统计,可在select中保留并添加过滤条件)。 - 按
pId、firstName、lastName分组,调用count()得到每个用户的包裹总数。 - 对列名进行重命名,匹配你需要的展示名称。
- 按包裹数量降序排序,用
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
相关产品推荐
相关产品推荐

