Key-Value类型
1.partitionBy
函数说明
def partitionBy(partitioner: Partitioner): RDD[(K, V)]
将数据按照指定 Partitioner 重新进行分区。Spark 默认的分区器是 HashPartitioner
2.groupByKey
函数说明
def groupByKey(): RDD[(K, Iterable[V])]
def groupByKey(numPartitions: Int): RDD[(K, Iterable[V])]
def groupByKey(partitioner: Partitioner): RDD[(K, Iterable[V])]
将数据源的数据根据 key 对 value 进行分组
3. reduceByKey
函数说明
def reduceByKey(func: (V, V) => V): RDD[(K, V)]
def reduceByKey(func: (V, V) => V, numPartitions: Int): RDD[(K, V)]
可以将数据按照相同的 Key 对 Value 进行聚合
reduceByKey 和 groupByKey 的区别:
从 shuffle 的角度:reduceByKey 和 groupByKey 都存在 shuffle 的操作, reduceByKey可以在 shuffle 前对分区内相同 key 的数据进行预聚合(combine)功能,这样会减少落盘的数据量,而 groupByKey 只是进行分组,不存在数据量减少的问题,reduceByKey 性能比较高。
从功能的角度:reduceByKey 其实包含分组和聚合的功能。GroupByKey 只能分组,不能聚
合。
4.aggregateByKey
函数说明
def aggregateByKey[U: ClassTag](zeroValue: U)(seqOp: (U, V) => U,
combOp: (U, U) => U): RDD[(K, U)]
将数据根据不同的规则进行分区内计算和分区间计算
5.aggregateByKey
函数说明
def aggregateByKey[U: ClassTag](zeroValue: U)(seqOp: (U, V) => U,
combOp: (U, U) => U): RDD[(K, U)]
将数据根据不同的规则进行分区内计算和分区间计算
6. combineByKey
函数说明
def combineByKey[C](
createCombiner: V => C,//将当前值作为参数进行附加操作并返回
mergeValue: (C, V) => C,// 在分区内部进行,将新元素V合并到第一步操作得到的C中
mergeCombiners: (C, C) => C): RDD[(K, C)]//将第二步操作得到的C进行分区间计算
最通用的对 key-value 型 rdd 进行聚集操作的聚集函数(aggregation function)。类似于
aggregate(),combineByKey()允许用户返回值的类型与输入不一致。
4.sortByKey:根据键值进行排序,支持升序和降序。
函数说明
def join[W](other: RDD[(K, W)]): RDD[(K, (V, W))]
join:返回两个RDD中相同键对应的所有元素,结果为嵌套形式。
leftOuterJoin:左外连接,以元RDD为主。
rightOuterJoin:右外连接,以参数RDD为主。
行动算子的应用
collect
作用:将RDD中的所有元素收集到驱动端并返回数组。
注意事项:仅适用于小数据集,大数据集可能导致内存溢出。
RDD行动算子
reduce
作用:聚合RDD中的所有元素,返回一个具体值。
示例代码:展示了如何使用reduce进行累加操作。
foreach
函数签名
def foreach(f: T => Unit): Unit = withScope {
val cleanF = sc.clean(f)
sc.runJob(this, (iter: Iterator[T]) => iter.foreach(cleanF))
}
函数说明
分布式遍历 RDD 中的每一个元素,调用指定函数
示例
count
作用:返回RDD中元素的个数,使用Long类型以防止溢出。
示例
first
作用:返回RDD中的第一个元素。
take
作用:返回RDD中的前N个元素组成的数组。
示例
takeOrdered
作用:返回RDD排序后的前N个元素组成的数组。
分区操作
分区计算
分区内计算:对每个分区内的数据进行计算。
分区间计算:对所有分区的数据进行汇总计算。
示例代码:展示了如何指定分区并进行分区内和分区间计算。
其他注意事项
RDD的执行
转换算子:不会立即执行,只有在行动算子触发时才会执行。
行动算子:触发实际计算并返回结果。
示例
数据类型
Long vs Int:使用Long类型来存储可能非常大的计数值,以防止溢出。
Spark的三大数据结构
RDD
RDD(Resilient Distributed Dataset) 是 Apache Spark 的核心抽象,代表一个不可变、分区的分布式数据集合,支持并行操作并具备容错性
累加器
可用于executor端变量信息聚合到java端程序定义的变量中。
每个task会得到变量副本并更新后传回driver端。
示例:
代码示例
广播变量
用于高效分发较大只读值。
是只读变量,多个spark操作可使用同一个。
创建累加器时要创建.class文件,作为类进行调用。