1.RDD 对不同类型数据的支持
目标
- 理解 RDD 对 Key-Value 类型的数据是有专门支持的
- 理解 RDD 对数字类型也有专门的支持
一般情况下 RDD 要处理的数据有三类
- 字符串
- 键值对
- 数字型
RDD 的算子设计对这三类不同的数据分别都有支持
- 对于以字符串为代表的基本数据类型是比较基础的一些的操作, 诸如 map, flatMap, filter 等基础的算子
- 对于键值对类型的数据, 有额外的支持, 诸如 reduceByKey, groupByKey 等 byKey 的算子
- 同样对于数字型的数据也有额外的支持, 诸如 max, min 等
RDD 对键值对数据的额外支持
键值型数据本质上就是一个二元元组, 键值对类型的 RDD 表示为 RDD[(K, V)]
RDD 对键值对的额外支持是通过隐式支持来完成的, 一个 RDD[(K, V)]
, 可以被隐式转换为一个 PairRDDFunctions
对象, 从而调用其中的方法.
既然对键值对的支持是通过 PairRDDFunctions
提供的, 那么从 PairRDDFunctions
中就可以看到这些支持有什么
类别 | 算子 |
---|---|
聚合操作 | reduceByKey |
foldByKey | |
combineByKey | |
分组操作 | cogroup |
groupByKey | |
连接操作 | join |
leftOuterJoin | |
rightOuterJoin | |
排序操作 | sortBy |
sortByKey | |
Action | countByKey |
take | |
collect |
RDD 对数字型数据的额外支持
对于数字型数据的额外支持基本上都是 Action 操作, 而不是转换操作
算子 | 含义 |
---|---|
count | 个数 |
mean | 均值 |
sum | 求和 |
max | 最大值 |
min | 最小值 |
variance | 方差 |
sampleVariance | 从采样中计算方差 |
stdev | 标准差 |
sampleStdev | 采样的标准差 |
val rdd = sc.parallelize(Seq(1, 2, 3))
// 结果: 3
println(rdd.max())
2. 总结
- 通过本节,能够理解 RDD 的一般使用步骤
// 1. 创建 SparkContext
val conf = new SparkConf().setMaster("local[6]").setAppName("stage_practice1")
val sc = new SparkContext(conf)
// 2. 创建 RDD
val rdd1 = sc.textFile("dataset/BeijingPM20100101_20151231_noheader.csv")
// 3. 处理 RDD
val rdd2 = rdd1.map { item =>
val fields = item.split(",")
((fields(1), fields(2)), fields(6))
}
val rdd3 = rdd2.filter { item => !item._2.equalsIgnoreCase("NA") }
val rdd4 = rdd3.map { item => (item._1, item._2.toInt) }
val rdd5 = rdd4.reduceByKey { (curr, agg) => curr + agg }
val rdd6 = rdd5.sortByKey(ascending = false)
// 4. 行动, 得到结果
println(rdd6.first())
通过上述代码可以看到, 其实 RDD 的整体使用步骤如下