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()
}