zoukankan      html  css  js  c++  java
  • spark学习进度06(RDD的Map算子、FlatMap算子、ReduceByKey算子)

    一、Map算子:

     作用

    把 RDD 中的数据 一对一 的转为另一种形式

    调用

    def map[U: ClassTag](f: T ⇒ U): RDD[U]

    参数

    f → Map 算子是 原RDD → 新RDD 的过程, 这个函数的参数是原 RDD 数据, 返回值是经过函数转换的新 RDD 的数据

    注意点

    Map 是一对一, 如果函数是 String → Array[String] 则新的 RDD 中每条数据就是一个数组

    @Test
      def mapTest():Unit={
        //先创建一个RDD
        val rdd1 = sc.parallelize(Seq(1,2,3))
        //执行map
        val rdd2 = rdd1.map(item => item*10)
        //得到结果
        val result = rdd2.collect()
        //结果输出
        result.foreach(item => println(item))
      }

    二、FlatMap算子:

     作用

    FlatMap 算子和 Map 算子类似, 但是 FlatMap 是一对多

    调用

    def flatMap[U: ClassTag](f: T ⇒ List[U]): RDD[U]

    参数

    f → 参数是原 RDD 数据, 返回值是经过函数转换的新 RDD 的数据, 需要注意的是返回值是一个集合, 集合中的数据会被展平后再放入新的 RDD

    注意点

    flatMap 其实是两个操作, 是 map + flatten, 也就是先转换, 后把转换而来的 List 展开

      //flatmap算子
      @Test
      def flatMapTest():Unit={
        //创建RDD
        val rdd1 = sc.parallelize(Seq("Hello lilty","hello wen","lilty Hello"))
        //处理数据
        val rdd2 = rdd1.flatMap(item => item.split(" "))
        //得到结果
        val result=rdd2.collect()
        //打印
        result.foreach(item => println(item))
        //关闭sc
        sc.stop()
      }

    flatMap也是转换,他可以把数组和集合展开,并且flatMap中的函数一般也是集合或者数组

    三、ReduceByKey算子:

     作用

    首先按照 Key 分组, 接下来把整组的 Value 计算出一个聚合值, 这个操作非常类似于 MapReduce 中的 Reduce

    调用

    def reduceByKey(func: (V, V) ⇒ V): RDD[(K, V)]

    参数

    func → 执行数据处理的函数, 传入两个参数, 一个是当前值, 一个是局部汇总, 这个函数需要有一个输出, 输出就是这个 Key 的汇总结果

    注意点

    • ReduceByKey 只能作用于 Key-Value 型数据, Key-Value 型数据在当前语境中特指 Tuple2

    • ReduceByKey 是一个需要 Shuffled 的操作

    • 和其它的 Shuffled 相比, ReduceByKey是高效的, 因为类似 MapReduce 的, 在 Map 端有一个 Cominer, 这样 I/O 的数据便会减少

       //reduceByKey算子
        @Test
        def reduceByKeyTest():Unit={
          //创建RDD
          val rdd1 = sc.parallelize(Seq("Hello lilty","hello wen","lilty Hello"))
          //处理数据
          val rdd2 = rdd1.flatMap(item => item.split(" ")).map(item => (item,1)).reduceByKey((curr,agg)=>curr+agg)
          //得到结果
          val result=rdd2.collect()
          //打印
          result.foreach(item => println(item))
          //关闭sc
          sc.stop()
        }

       reduceByKey第一步是按照Key进行分组,然后对每一组进行聚合得到结果

  • 相关阅读:
    动态规划算法介绍——概念、意义及应用、例题
    两个大数相减
    删除apache的签名的shell脚本
    C++中智能指针的设计和使用
    eclipse save action不起作用
    [leetcode]51. N-QueensN皇后
    [leetcode]33. Search in Rotated Sorted Array旋转过有序数组里找目标值
    [leetcode]88. Merge Sorted Array归并有序数组
    [leetcode]636. Exclusive Time of Functions函数独占时间
    [leetcode]257. Binary Tree Paths二叉树路径
  • 原文地址:https://www.cnblogs.com/dazhi151/p/14253295.html
Copyright © 2011-2022 走看看