题目:已知:list1 = [“My name is Peter”, “How are you”]
1.计算list1中各个元素的长度
scala> val rdd1=sc.parallelize(List("My name is Peter", "How are you"))
rdd1: org.apache.spark.rdd.RDD[String] = ParallelCollectionRDD[0] at parallelize at <console>:24
scala> rdd1.map(_.length).collect
res0: Array[Int] = Array(16, 11)
解释:
第一行代码使用Spark的RDD(弹性分布式数据集)创建了一个名为rdd1的分布式数据集。它包含了两个字符串元素:"My name is Peter"和"How are you",sc.parallelize()是Spark中的一个函数,用于将一个已有的集合(如列表或数组)转换为一个分布式数据集(RDD)
第二行代码中rdd1是一个RDD对象,map
是RDD的一个转换操作,它将RDD中的每个元素应用于给定的函数。在这种情况下,_.length
表示对每个元素调用length
方法,以获取元素的长度。接下来,collect
是RDD的一个动作操作,它将RDD中的所有元素收集到驱动程序中,并以数组的形式返回结果。这段代码的意思是对RDD中的每个元素获取其长度,并将结果以数组的形式返回。
所以返回结果Array(16, 11)分别表示 My name is Peter, How are you的长度。
2.计算list1中各个元素中各个单词的长度。
scala> rdd1.flatMap(line=>line.split(" ")).map(_.length).foreach(println)
2
4
2
5
3
3
3
解释:
这段代码的执行过程如下:
- 对rdd1中的每个元素(即每一行)进行flatMap操作,将每行按照空格进行切分,得到一个单词列表。
- 对切分后的单词列表进行map操作,将每个单词转换为它的长度。
- 对转换后的长度进行foreach操作,将每个长度打印出来。
3.计算list1中各个元素中各个单词的长度,并输出对应单词。
scala> rdd1.flatMap(line=>line.split(" ")).map(word=>(word,word.length)).collect().foreach(println)
(My,2)
(name,4)
(is,2)
(Peter,5)
(How,3)
(are,3)
(you,3)
解释
与上一题类似,不同的地方是用了map(word=>(word,word.length))对一个包含单词的集合进行映射操作,将每个单词和它的长度作为一个键值对返回。
使用RDD编写词频统计
word内容如图
#读取文本并创建RDD
scala> val lines = sc.textFile("data/word.txt")
#对每一行进行单词拆分,并创建包含所有单词的RDD
scala> val words = lines.flatMap(line=>line.split(" "))
# 对每个单词计数为1,并创建包含(word, 1)键值对的RDD
scala> val word_counts = words.map(word=>(word, 1))
# 对相同单词的计数进行累加
scala> val word_frequency = word_counts.reduceByKey(_+_)
#打印词频统计结果
scala> word_frequency.collect()
运行结果:
已知:numList = [[1, 3], [2, 4], [3, 5], [4, 6]] ,请编程输出: [[1, 30], [2, 40], [3, 50], [4, 60]]
代码如下:
scala> val rdd1 = sc.parallelize(List((1, 3), (2, 4), (3, 5), (4, 6)))
scala> rdd1.map(x => (x._1, x._2*10)).collect()