阅读 5759

Spark 三大数据结构 之 RDD的行动算子

这是我参与更文挑战的第4天,活动详情查看:更文挑战

介绍

  • RDD算子从对数据操作来讲大致分为两类: 转换(transformations)和行动(action)

    • 转换算子: 将一个RDD转换为另一个RDD,仅仅只是功能叠加,并不会真正去执行。(装饰者设计模式)
    • 行动算子: 行动算子会真正触发 SparkContext 提交 Job 作业。

本文讲述其中的 行动算子

1. reduce

聚集RDD中的所有元素,先聚合分区内数据,再聚合分区间数据

//使用例子

val sc: SparkContext = new SparkContext(
    new SparkConf()
        .setMaster("local")
        .setAppName("RddMem")
)

val rdd: RDD[Int] = sc.makeRDD(
    List(1, 2, 4, 5, 6)
)
//聚合
val sum = rdd.reduce(_ + _)
println(sum)

sc.stop()
复制代码

2. collect

在驱动程序(Driver)中,以数组Array的形式返回数据集的所有元素

//使用例子

val sc: SparkContext = new SparkContext(
    new SparkConf()
        .setMaster("local")
        .setAppName("RddMem")
)

val rdd: RDD[Int] = sc.makeRDD(
    List(1, 2, 4, 5, 6), 3
)

val list = rdd.collect()
println(list.mkString(","))

sc.stop()
复制代码

3. count

取RDD中元素的个数

//使用例子

val sc: SparkContext = new SparkContext(
    new SparkConf()
        .setMaster("local")
        .setAppName("RddMem")
)

val rdd: RDD[Int] = sc.makeRDD(
    List(1, 2, 4, 5, 6), 3
)

val count = rdd.count()
println(count)

sc.stop()
复制代码

4. first

取RDD中的第一个元素

//使用例子

val sc: SparkContext = new SparkContext(
    new SparkConf()
        .setMaster("local")
        .setAppName("RddMem")
)

val rdd: RDD[Int] = sc.makeRDD(
    List(1, 2, 4, 5, 6), 3
)
//取第一个
val firstNum = rdd.first()
println(firstNum)

sc.stop()

复制代码

5. take

取一个由RDD的前n个元素组成的数组

//使用例子

val sc: SparkContext = new SparkContext(
    new SparkConf()
        .setMaster("local")
        .setAppName("RddMem")
)

val rdd: RDD[Int] = sc.makeRDD(
    List(1, 2, 4, 5, 6), 3
)
//取前三个
val numList = rdd.take(3)
println(numList.mkString(","))

sc.stop()
复制代码

6. takeOrdered

取RDD排序后的前n个元素组成的数组

//使用例子

val sc: SparkContext = new SparkContext(
    new SparkConf()
        .setMaster("local")
        .setAppName("RddMem")
)

val rdd: RDD[Int] = sc.makeRDD(
    List(1, 7, 4, 5, 6), 3
)

//升序
//val numList = rdd.takeOrdered(3)
//降序
val numList = rdd.takeOrdered(3)(Ordering.Int.reverse)
println(numList.mkString(","))

sc.stop()
复制代码

7. aggregate

分区的数据通过初始值和分区内的数据进行聚合,然后再和初始值进行分区间的数据聚合

//使用例子

val sc: SparkContext = new SparkContext(
    new SparkConf()
        .setMaster("local")
        .setAppName("RddMem")
)

val rdd: RDD[Int] = sc.makeRDD(
    List(1, 7, 4, 5), 2
)

// 0+1 + 7 =8
// 0+4 + 5 =9
// 0+9 + 10=90
val res: Int = rdd.aggregate(0)(
    (i: Int, j: Int) => {
        i + j
    }
    , (i: Int, j: Int) => {
        i + j
    }
)
println(res)

// 1+1 + 7 =9
// 1+4 + 5 =10
// 1*9 * 10=90
val res2: Int = rdd.aggregate(1)(_ + _, _ * _)
println(res2)

sc.stop()
复制代码

8. fold

聚集RDD中的所有元素,先聚合分区内数据,再聚合分区间数据,分区内和合分区计算规则一样

相当于aggregate简化写法

//使用例子

val sc: SparkContext = new SparkContext(
    new SparkConf()
        .setMaster("local")
        .setAppName("RddMem")
)

val rdd: RDD[Int] = sc.makeRDD(
    List(1, 7, 4, 5), 2
)

//与rdd.aggregate(0)(_ + _, _ + _)
val res: Int = rdd.fold(0)(_ + _)
println(res)

sc.stop()
复制代码

9. countByKey

统计每种key的个数

//使用例子

val sc: SparkContext = new SparkContext(
    new SparkConf()
        .setMaster("local")
        .setAppName("RddMem")
)

val rdd: RDD[(String,Int)] = sc.makeRDD(
    List(("a", 1), ("b", 2), ("a", 1), ("b", 2)), 2
)

val res = rdd.countByKey()
println(res)

sc.stop()
复制代码

10. saveXxxxx

将数据保存到不同格式的文件中

//使用例子

val sc = new SparkContext(
    new SparkConf().setMaster("local[*]").setAppName("MapPartitions")
)

val rdd = sc.makeRDD(List(
    ("a", 1), ("a", 2), ("b", 3), ("b", 3), ("b", 3)
), 1)

/**
 * text文件
 */
rdd.saveAsTextFile("text")

/**
 * Sequence文件
 */
rdd.saveAsSequenceFile("sequence")

/**
 * object文件
 */
rdd.saveAsObjectFile("object")

sc.stop()
复制代码

11. foreach

分布式遍历RDD中的每一个元素,调用指定函数

//使用例子

val sc = new SparkContext(
    new SparkConf().setMaster("local[*]").setAppName("MapPartitions")
)

val rdd = sc.makeRDD(List(
    ("a", 1), ("a", 2), ("b", 3), ("b", 3), ("b", 3)
), 1)

//分布式遍历
rdd.foreach(println(_))

sc.stop()
复制代码
文章分类
后端
文章标签