侧边栏壁纸
博主头像
colo

欲买桂花同载酒

  • 累计撰写 1823 篇文章
  • 累计收到 0 条评论

统计订单数据中不同状态的数量

2025-12-12 / 0 评论 / 4 阅读

题目

统计订单数据中不同状态的数量

信息

  • 类型:问答
  • 难度:⭐

考点

DataFrame创建, 过滤操作, 聚合操作, 结果展示

快速回答

使用Spark DataFrame API完成以下步骤:

  1. 创建包含订单状态的DataFrame
  2. 过滤出状态为'completed'的订单
  3. 按状态分组统计数量
  4. 展示结果
## 解析

问题场景

假设有一个订单数据集,包含订单ID和状态字段。需要统计状态为'completed'的订单数量,并展示所有状态的订单分布。

解决方案

import org.apache.spark.sql.SparkSession
import org.apache.spark.sql.functions._

object OrderAnalysis {
  def main(args: Array[String]): Unit = {
    val spark = SparkSession.builder().appName("OrderAnalysis").getOrCreate()
    import spark.implicits._

    // 1. 创建DataFrame
    val orders = Seq(
      (1, "completed"),
      (2, "pending"),
      (3, "completed"),
      (4, "cancelled")
    ).toDF("order_id", "status")

    // 2. 过滤completed订单
    val completedOrders = orders.filter(col("status") === "completed")

    // 3. 按状态分组统计
    val statusCounts = orders.groupBy("status").count()

    // 4. 展示结果
    println("Completed orders count: " + completedOrders.count())
    statusCounts.show()
  }
}

关键点说明

  • DataFrame创建:使用Seq.toDF()创建测试数据,实际开发中常用spark.read.csv()
  • 过滤操作filter(col("status") === "completed") 或等效的 filter($"status" === "completed")
  • 聚合操作groupBy("status").count() 是Spark SQL的标准聚合模式
  • 结果展示count()返回Long类型数值,show()以表格形式打印DataFrame

最佳实践

  • 优先使用Column函数(如col()/$语法)而非字符串表达式
  • 对于大数据集,避免多次count()操作,可缓存中间结果
  • 生产环境应使用spark.read加载真实数据源(HDFS/S3等)

常见错误

  • 忘记导入函数:import org.apache.spark.sql.functions._
  • 错误的条件语法:使用==(Scala原生)代替===(Spark专用)
  • 误用collect():大数据集应使用show()或写入存储系统

扩展知识

  • 多种过滤方式filter("status = 'completed'")(SQL字符串)或where()filter别名)
  • 聚合增强:使用agg(count("*").alias("total"))实现复杂聚合
  • 执行计划:通过statusCounts.explain()查看物理执行计划