第五章_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() }