题目
统计订单数据中不同状态的数量
信息
- 类型:问答
- 难度:⭐
考点
DataFrame创建, 过滤操作, 聚合操作, 结果展示
快速回答
使用Spark DataFrame API完成以下步骤:
- 创建包含订单状态的DataFrame
- 过滤出状态为'completed'的订单
- 按状态分组统计数量
- 展示结果
问题场景
假设有一个订单数据集,包含订单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()查看物理执行计划