第五章_Spark核心编程_Rdd_转换算子_Value型_flatMap算子

1. 说明

    /*
    * 1.定义
    *     def flatMap[U: ClassTag](f: T => TraversableOnce[U]): RDD[U]
    *
    * 2.功能
    *     1.先将元素转换成一个迭代器
    *     2.再遍历迭代器 返回新的集合
    * 
    * 3.调用流程
    *     参数: 定义一个函数,作用分区的每个元素,函数调度返回值 必须是一个集合类型
    *     返回值: 返回一个新RDD,元素为 对集合拉平的结果
    * */
/* flatMap 算子 */
object RddTransitionOperator_flatMap extends App {
  private val sc: SparkContext = CommonUtils.getSparkContext("mapPartitionsWithIndex operator")
  
  val rdd: RDD[List[Any]] = sc.makeRDD(List(List(1, 2), List(List(8, 9), List(10, 11)), List(3, 4)), 2)

  //只会做一级拉平
  private val rdd1: RDD[Any] = rdd.flatMap(_.iterator)

  rdd1.collect().foreach(println(_))
  //  1
  //  2
  //  List(8, 9)
  //  List(10, 11)
  //  3
  //  4

  val rdd2 = sc.makeRDD(List("Helle Scala", "Hello Java", "Hello Spark"))

  private val Str_rdd: RDD[String] = rdd2.flatMap(_.split(" "))

  Str_rdd.collect().foreach(println(_))
  
  sc.stop()
}

2.  Scala中的 flatMap

  object flatMapScala extends App {
    /*
    * 作用 : 1.先将元素进行转换,转换成一个迭代器
    *       2.再遍历迭代器 返回新的集合
    *
    * */
    var list: List[List[Int]] = List(List(1, 2), List(3, 4))

    private val ints: List[Int] = list.flatMap(_.toIterable)
  }

3. 需求 : 将 List(List(1,2),3,List(4,5))进行扁平化操作

  object flatMapTestByComplex extends App {
    val sparkconf: SparkConf = new SparkConf().setMaster("local").setAppName("mapPartitionsWithIndexTest")

    val sc: SparkContext = new SparkContext(sparkconf)

    //Rdd元素类型 不一致
    val rdd: RDD[Any] = sc.makeRDD(List(List(1, 2), 3, List(4, 5)))

    // 通过模式匹配 根据Rdd元素数据类型 将Rdd拉平
    private val absRdd: RDD[Any] = rdd.flatMap(
      e => {
        e match {
          case list: List[_] => list
          case dat => List(dat)
        }
      }

    )

    println(s"rdd1 :${absRdd.collect().mkString(",")}")

    sc.stop()
  }

 

posted @ 2022-03-23 07:56  学而不思则罔!  阅读(49)  评论(0)    收藏  举报