记录下学习过程
初学spark,之前一直弄不懂map和flatmap的区别
测试文本
text.txt
hello world
hello spark
hello hive
map
将一个RDD中的每个数据项,通过map中的函数映射变为一个新的元素。
输入分区与输出分区一对一,即:有多少个输入分区,就有多少个输出分区。
@Test
def mapTest(): Unit = {
val mapRDD: RDD[Array[String]] = sc
.textFile("src\\main\\resources\\text.txt")
.map(line => line.split(" "))
mapRDD.foreach(println)
//Array(Array(hello, world), Array(hello, spark), Array(hello, hive))
mapRDD.foreach(elem => {
for (i <- 0 until elem.length){
println(elem(i))
}
})
}
输出结果:
[Ljava.lang.String;@65c908a0
[Ljava.lang.String;@590e109
[Ljava.lang.String;@458800ed
hello
hive
hello
world
hello
spark
即三个数组对象
调用map方法后RDD的返回类型是 RDD[Array[String]],RDD本身是一个集合,
集合里又嵌套了一个Aray数组
直接foreach输出的就是数组对象
然后我用最笨的方法直接遍历输出了所有元素
flatMap
对RDD每个元素转化,然后再扁平化,将所有对象合并成一个对象,会抛弃null值
@Test
def flatmapTest() = {
val flatmapRDD: RDD[String] = sc
.textFile("src\\main\\resources\\text.txt")
.flatMap(line => line.split(" "))
// Array(hello, world, hello, spark, hello, hive)
flatmapRDD.foreach(println)
}
输出结果
hello
hello
hive
world
hello
spark
即一个RDD集合对象,RDD[String]
再foreach遍历输出