之前一直在做算法开发,程序都是面向过程的(python,matlab),为了让自己离程序媛的梦想更进一步,开始学习Spark,打算在简书上记录自己超级菜菜菜菜菜鸟的学习历程,环境是IntelliJ IDEA 2017 + scala(好不容易请小伙伴帮忙建好环境,过程仍然不是很懂,等完全搞明白再补一篇建环境的日志)。
参考书目是《Spark快速大数据分析》,薄薄一本,刚见这本书的时候还怀疑这么薄的书怎么可能把Spark讲清楚。自己浏览过一遍后才发觉真是一本入门好书,对于有编程和数据分析经验而没有用过Spark的人来说,形象易懂,能迅速理解Spark的核心功能和用法,又不拖沓。
感觉学习一门新语言或工具最困难的阶段就时完成第一个完整小程序,磕磕绊绊,不过总算是搞明白了经典的词数统计例程。完整代码如下:
import org.apache.spark.SparkContext
import org.apache.spark.SparkContext._
import org.apache.spark.SparkConf
object WordCount {
def main(args: Array[String]) {
val conf = new SparkConf().setAppName("WordCount").setMaster("local")
val sc = new SparkContext(conf)
// 创建RDD最简单的方式就是把程序中一个已有的集合传给SparkContext的parallelize()方法。
// 这种方式在学习Spark时非常有用,不过,除了开发原型和测试时,这种方式用的不多,毕竟这种方式需要把你的整个数据集先放在一台机器的内存中。
val input = sc.parallelize(List("Hello world ! Welcome to Spark world . Let's study Spark together !"))
// flatMap():把输入字符串切分为单词,可以把flatMap()看做将返回的迭代器“拍扁”,这样就得到了一个由各列表中的元素组成的RDD,而不是一个由列表组成的RDD。
// split():通过指定分隔符对字符串进行切片,例程中的分隔符为空格
val words = input.flatMap(line => line.split(" "))
// map():我的理解就是建立一种映射关系
// word => (word, 1):创建Pair RDD,word是键, 1是初始值,例程中代表每个单词出现一次(有重复的)
// reduceByKey((a, b) => a + b):合并具有相同键的值,例程中就是将相同单词的“值”相加,以实现计数的功能
val counts = words.map(word => (word, 1)).reduceByKey((a, b) => a + b)
counts.foreach(println)
}
}
输出结果:
(Spark,2)
(Hello,1)
(.,1)
(Welcome,1)
(to,1)
(Let's,1)
(!,2)
(together,1)
(study,1)
(world,2)
网友评论