Spark SQL入门与实践指南
上QQ阅读APP看书,第一时间看更新

3.2 RDD简单实例—wordcount

通过3.1节RDD基础的理论讲解,相信读者对于在Spark上编程模式(RDD)有了一定的了解,接下来我们通过一个实例来看看如何利用RDD编程来统计一篇文章的词频度,从而更加直观地理解RDD。

在该实例中,首先借助SparkContext提供的textFile()函数从HDFS(Hadoop分布式文件系统)读取要统计词频的文件转化为记录着每一行内容的RDD[String](fileRDD),此时的RDD是由表示每一行内容的字符串对象组成的集合。.flapMap(line=>line.split(""))将每一行的单词按空格分隔,从而形成了记录着文本文件所有单词的RDD,此时RDD的每一个元素对应着某一个单词。.map(word=>(word,1))将上一步得到的记录着每一个单词的RDD转化为(word,1)这种记录着每一个单词出现一次的键值(key-value)对RDD,以方便下一步采用reduceByKey(_+_)来按照键(key)将相同的单词出现次数进行相加,进而求出每个词的词频,最后通过.saveAsTextFile()函数将结果存入HDFS中。

以上的分析过程中,我们也可以看出flapMap(func)和map(func)的区别和联系,同为遍历RDD所有元素并使用传入函数func对每一个元素进行处理的函数,最大的不同在于RDD一个元素经flapMap处理后会变成一个或多个元素,正如上述实例记录着每一行内容的RDD被转化为记录着每一个单词的RDD,而map处理后仍为一对一的关系。

另外上面的示例中.flapMap、.map、.reduceByKey在写法上可写为紧凑的一行,即:

请读者不要误解,虽写法不同,但依然表示三个连续的转化操作,下一个转化操作的父RDD便是上一个转化操作的结果RDD。

补充:SparkContext——Spark编程主入口点

SparkContext是Spark编程的主入口点,SparkContext负责与Spark集群的连接,可以被用于在集群上创建RDDs、累加器(accumulators)和广播变量(broadcast variables)。在Spark-shell中,SparkContext已经被系统默认创建以供用户使用,为sc,如图3-2所示。

图3-2

可以看到通过简单的编程就可以分析出这篇文章每个词的频度,但你想过吗,假如这个需要统计词频的文件有10TB大小呢,远远超过单机存储、计算的能力,这种情况我们可以使用Spark简单的构建分布式应用程序,解决复杂的大数据处理问题,而不用去考虑底层(通信、容错,等等)实现的细节,这就是Spark的强大之处。