题目
使用Spark计算数字平方和
信息
- 类型:问答
- 难度:⭐
考点
RDD创建,转换算子(map),行动算子(reduce)
快速回答
使用Spark计算1到10的平方和需要三个步骤:
- 创建包含1-10的RDD:
sc.parallelize(1 to 10) - 使用
map转换算子计算平方:.map(x => x * x) - 使用
reduce行动算子求和:.reduce(_ + _)
完整代码:sc.parallelize(1 to 10).map(x => x*x).reduce(_+_)
解析
原理说明
Spark计算分为转换(Transformations)和行动(Actions)两类操作:
- RDD创建:通过
parallelize将本地集合转为分布式数据集 - map转换:对每个元素独立执行平方计算(惰性操作)
- reduce行动:触发实际计算并聚合结果(立即执行)
代码示例
// 创建SparkContext(假设已初始化)
val sc: SparkContext = ...
// 完整计算流程
val result = sc.parallelize(1 to 10) // 创建RDD
.map(x => x * x) // 转换:计算平方
.reduce((a, b) => a + b) // 行动:求和
println(result) // 输出:385最佳实践
- 数据分区:
parallelize可指定分区数,如sc.parallelize(1 to 10, 4) - Lambda简化:
map(_ * _)比完整Lambda更简洁 - 缓存优化:若多次使用平方结果,可添加
.persist()
常见错误
| 错误 | 说明 | 修正 |
|---|---|---|
| 忘记行动算子 | 仅用map无输出(惰性求值) | 必须调用reduce等行动算子 |
| 混淆算子类型 | 误用reduceByKey(用于键值对) | 单值RDD用reduce |
| 闭包问题 | 在map中使用外部变量导致序列化失败 | 使用广播变量或确保变量可序列化 |
扩展知识
- 其他行动算子:
collect()(返回数组)、count()(计数) - 转换算子对比:
flatMap(一对多映射)与map(一对一映射)区别 - 执行流程:Driver程序调度任务,Executor在集群节点执行计算