开发者学堂课程【大数据 Spark 2020版(知识精讲与实战演练)第三阶段:Spark 原理_总结介绍_案例编写】学习笔记,与课程紧密联系,让用户快速学习知识。
课程地址:https://developer.aliyun.com/learning/course/689/detail/12005
Spark 原理_总结介绍_案例编写
编写 word count作为案例,原因有二。通过案例学习 spark 原理,要将目标放在原理上,使得案例尽可能简单,且案例中的算子要丰富。重新编写 word count 案例,基于 spark 原理始终,包括 RDD 的生成和执行,物理都基于案例进行,所以复习 word count 很有必要。
进入笔记,案例如下图:
打开 idea,创建 Scala class,命名为 sourceanalysis,命名方法 test,定义为 Word count,进行编写。
步骤如下:
1. 创建 sc 对象
创建 conf 对象,new sparkconf().设置两个参数,
valconf=newSparkConf().setMaster("local[6]").setAppName("wordcount source")
val sc=new SparkContext(conf)
2.创建数据集
命名为 test,通过 sc 生成 RDD,接受字符串,
val textRDD=sc.parallelize(Seq("hadoop spark", "hadoop flume", "spark sqoop"))
3、数据处理
步骤如下:
拆词。一句话拆成单词,一个字符串要拆成多个词,多个单词是一个数组,使用 flatmap 展开,对于 item 进行split,item 可以换成下划线,这是Scala的语法,命名为 splitRDD,
val splitRDD =textRDD.flatMap(_.split(regex=""))
赋予初始词频。将 splitRDD 每个单词转化为单词对应
一的形式,使用 splitRDD,生成词频。指定对象名字,命名为 tupleRDD,为原组的意思。
splitRDD.map((_
,1))
聚合统计词频。使用 curr+agg,简写为_+_,第一个_
代表 curr,第二个_代表 agg,当_在函数简写形式中出现两次,代表两个参数,而不是同一个参数的两次,生成的RDD 为 reduceRDD,
val reduceRDD=tupleRDD.reduceByKey(_+_)
4.将结果转为字符串 额外要求,要看到字符串需要进行转换。
将 reduceRDD 转化成字符串,map 接受了一个参数,生成字符串,加一个 s,生成 s 字符串,使用$,_+_.1意为取唯一的参数当中的第一个参数,而此时不适合使用_,原因是后面的_2,指代第二个参数却没有参数,所以选择传统方式,(item—>),转成字符串加s,两个部分。
字符串生成后,第一位是 k,第二位是 value。取名为 strRDD。
val strRDD =reduceRDD.map( item => s"${item._1}
,${item._2}")
5. 结果获取。
使用 strRDD,进行结果获取,item 转为_形式,
strRDD.collect().foreach(println(_))
6. 关闭 sc,执行。
Sc.stop()
运行代码,结果如下:
从第一项开始取,结果正确。
字符串的生成是相对应的,从reduce的第一项开始取,只第二项的 value,即为词频,
在一个简写形式当中,出现了两个下划线,指代的不是同一个参数的两次出现,而是两个参数。因此此函数中无法使用下划线,无法只取一个函数。