Spark算子:transformation之map、flatMap和distinct

1、map

将RDD中的每个元素通过map中的函数映射为一个新的元素,并返回一个新类型的RDD。输入时的分区数与输出时的分区数保持一致。

//HDFS上的txt文件
hadoop fs -cat /tmp/1.txt
hello world
hello spark
hello hive
 
//读取HDFS文件到RDD
scala> var data = sc.textFile("/tmp/1.txt")
data: org.apache.spark.rdd.RDD[String] = MapPartitionsRDD[1] at textFile at :21
 
//使用map算子
scala> var mapresult = data.map(line => line.split("\\s+"))
mapresult: org.apache.spark.rdd.RDD[Array[String]] = MapPartitionsRDD[2] at map at :23
其中Array[String]=Array(hello, world), Array(hello, spark), Array(hello, hive)

//运算map算子结果
scala> mapresult.collect
res0: Array[Array[String]] = Array(Array(hello, world), Array(hello, spark), Array(hello, hive))

2、flatMap

(1)分两步:第一步map,第二步flat即将所有的输出分区结果合并到一个分区。

/使用flatMap算子
scala> var flatmapresult = data.flatMap(line => line.split("\\s+"))
flatmapresult: org.apache.spark.rdd.RDD[String] = MapPartitionsRDD[3] at flatMap at :23
 
//运算flagMap算子结果
scala> flatmapresult.collect
res1: Array[String] = Array(hello, world, hello, spark, hello, hive)

(2)flatMap会将字符串当做一个数组

scala> data.map(_.toUpperCase).collect
res32: Array[String] = Array(HELLO WORLD, HELLO SPARK, HELLO HIVE, HI SPARK)
scala> data.flatMap(_.toUpperCase).collect
res33: Array[Char] = Array(H, E, L, L, O,  , W, O, R, L, D, H, E, L, L, O,  , S, P, A, R, K, H, E, L, L, O,  , H, I, V, E, H, I,  , S, P, A, R, K)

(3)map与flatMap的处理结果对比

scala> data.map(x => x.split("\\s+")).collect
res34: Array[Array[String]] = Array(Array(hello, world), Array(hello, spark), Array(hello, hive), Array(hi, spark))
 
scala> data.flatMap(x => x.split("\\s+")).collect
res35: Array[String] = Array(hello, world, hello, spark, hello, hive, hi, spark)

flatMap只会将String扁平化成字符数组,并不会把Array[String]也扁平化成字符数组

3、distinct

对RDD中的元素去重。

scala> data.flatMap(line => line.split("\\s+")).collect
res61: Array[String] = Array(hello, world, hello, spark, hello, hive, hi, spark)
 
scala> data.flatMap(line => line.split("\\s+")).distinct.collect
res62: Array[String] = Array(hive, hello, world, spark, hi)

 

你可能感兴趣的:(spark,scala)