Spark系列:RDD对不同数据类型的支持与演示

501 阅读2分钟

1.RDD 对不同类型数据的支持

目标

  1. 理解 RDD 对 Key-Value 类型的数据是有专门支持的
  2. 理解 RDD 对数字类型也有专门的支持

一般情况下 RDD 要处理的数据有三类

  • 字符串
  • 键值对
  • 数字型

RDD 的算子设计对这三类不同的数据分别都有支持

  • 对于以字符串为代表的基本数据类型是比较基础的一些的操作, 诸如 map, flatMap, filter 等基础的算子
  • 对于键值对类型的数据, 有额外的支持, 诸如 reduceByKey, groupByKey 等 byKey 的算子
  • 同样对于数字型的数据也有额外的支持, 诸如 max, min 等

RDD 对键值对数据的额外支持

键值型数据本质上就是一个二元元组, 键值对类型的 RDD 表示为 RDD[(K, V)]

RDD 对键值对的额外支持是通过隐式支持来完成的, 一个 RDD[(K, V)], 可以被隐式转换为一个 PairRDDFunctions 对象, 从而调用其中的方法.

3b365c28403495cb8d07a2ee5d0a6376

既然对键值对的支持是通过 PairRDDFunctions 提供的, 那么从 PairRDDFunctions 中就可以看到这些支持有什么

类别算子
聚合操作reduceByKey
foldByKey
combineByKey
分组操作cogroup
groupByKey
连接操作join
leftOuterJoin
rightOuterJoin
排序操作sortBy
sortByKey
ActioncountByKey
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. 总结

  1. 通过本节,能够理解 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 的整体使用步骤如下

20190518105630