Spark算子系列文章------------Spark算子:RDD基本转换操作(1)–map、flatMap、distinct

Spark算子系列文章------------Spark算子:RDD基本转换操作(1)–map、flatMap、distinct

关键字:Spark算子、Spark RDD基本转换、map、flatMap、distinct

  • map

               将一个RDD中的每个数据项,通过map中的函数映射变为一个新的元素。

                输入分区与输出分区一对一,即:有多少个输入分区,就有多少个输出分区。

hadoop fs -cat /tmp/lyys/1.txt

                        hello world

                        hello spark

                        hello hive

 

 

//读取HDFS文件到RDD

scala> var data = sc.textFile("/tmp/yys/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

 

//运算map算子结果

scala> mapresult.collect

res0: Array[Array[String]] = Array(Array(hello, world), Array(hello, spark), Array(hello, hive))

 

 

  • flatMap

                 属于Transformation算子,第一步和map一样,最后将所有的输出分区合并成一个。

/使用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)

 

使用flatMap时候需要注意:
                         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)

 

再看:

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)

 

这次的结果好像是预期的,最终结果里面并没有把字符串当成字符数组。
这是因为这次map函数中返回的类型为Array[String],并不是String。
flatMap只会将String扁平化成字符数组,并不会把Array[String]也扁平化成字符数组。

参考:
http://alvinalexander.com/scala/collection-scala-flatmap-examples-map-flatten

 

  • 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)

 

评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值