spark常用算子有两种:
- transformation:RDD中所有转换算子都是延迟加载,从一个RDD到另一个RDD转换没有立即转换,仅记录数据的逻辑操作,只有要求结果还回到Driver时的动作时才会真正运行。
-
action:触发action时才会真正的执行action操作动作
transformation常用算子类型如下:
1.textFile (path: String) : RDD[String] 读取hdfs的文本数据,还回String元素的RDD,文本一行即为RDD一行;
val lineRdd: RDD[String] = sc.textFile(file_path, numPartitions)
2.reduceByKey (func: (V, V) => V, numPartitions: Int): RDD[(K, V)] 相同的key对value做聚合,先分区内再整体做聚合,还回与value相同的数据类型;
val rdd2 = rdd1.reduceByKey((pre, after) => (pre + after))
3.mapPartitionsWithIndex [U: ClassTag](f: (Int, Iterator[T]) => Iterator[U],preservesPartitioning: Boolean = false): RDD[U] f函数参数包含分区编号和该分区对应的数据集合两个参数,在转换的时候可以把分区index数据加上;参数preservesPartitioning表示是否保留父RDD的partitioner分区信息。
val rdd = sc.parallelize(List(12, 13, 14, 15,22,33,45,67,18,98),6)
val partitionIndex = (index: Int, iter: Iterator[Int]) => {
iter.toList.map(item => "index:" + index + ": value: " + item).iterator
}
rdd.mapPartitionsWithIndex(partitionIndex,true)
未完待续