07 Spark RDD编程 综合实例 英文词频统计

1. 用Pyspark自主实现词频统计过程。

>>> s = txt.lower().split()
>>> dd = {}
>>> for word in s:
... if word not in dd:
... dd[word] = 1
... else:
... dd[word] = dic[word] + 1
...
>>> ss = sorted(dd.items(),key=operator.itemgetter(1),reverse=True)
Traceback (most recent call last):
File "<stdin>", line 1, in <module>
NameError: name 'operator' is not defined
>>> import operator
>>> ss = sorted(dditems(),key=operator.itemgetter(1),reverse=True)
>>> print(ss)
[('the', 136), ('and', 111), ('of', 82), ('to', 71), ('our', 68), ('we', 59), ('that', 49), ('a', 46), ('is', 36), ('in', 26), ('this', 24), ('for', 23), ('are', 22), ('but', 20), ('--', 17), ('they', 17), ('on', 17), ('it', 17), ('will', 17), ('not', 16), ('have', 15), ('us', 14), ('has', 14), ('can', 13), ('with', 13), ('who', 13), ('be', 12), ('as', 11), ('or', 11), ('(applause.)', 11), ('those', 11), ('nation', 10), ('you', 10), ('their', 10), ('new', 9), ('these', 9), ('us,', 9), ('so', 8), ('by', 8), ('than', 8), ('must', 8), ('because', 8), ('what', 8), ('every', 8), ('all', 8), ('its', 8), ('been', 7), ('at', 7), ('when', 7), ('no', 6), ('less', 6), ('cannot', 6), ('let', 6), ('too', 6), ('common', 6), ('was', 5), ('time', 5), ('people', 5), ('only', 5), ('know', 5), ('nor', 5), ('now', 5), ('from', 5), ('seek', 4), ('work', 4), ('greater', 4), ('whether', 4), ('america', 4), ('more', 4), ('before', 4), ('power', 4), ('which', 4), ('long', 4), ('through', 4), ('men', 4), ('meet', 4), ('women', 4), ('journey', 3), ('up', 3), ('between', 3), ('were', 3), ('say', 3), ('where', 3), ('an', 3), ('god', 3), ('may', 3), ('last', 3), ('economy', 3), ('hard', 3), ('do', 3), ('today', 3), ('there', 3), ('founding', 3), ('hope', 3), ('crisis', 3), ('words', 3), ('carried', 3), ('them', 3), ('future', 3), ('come', 3), ('shall', 3), ('most', 3), ('generation', 3), ('day,', 3), ('you.', 3), ('things', 3), ('upon', 3), ('force', 3), ('i', 3), ('spirit', 3), ('just', 3), ('over', 3), ('father', 3), ('question', 3), ('your', 3), ('once', 3), ('across', 3), ('face', 2), ('better', 2), ('do,', 2), ('why', 2),

2. 并比较不同计算框架下编程的优缺点、适用的场景。

–Python

Python优缺点
优点
1、简单:Python是一种代表简单主义思想的语言。阅读一个良好的Python程序就感觉像是在读
英语一样,尽管这个英语的要求非常严格!Python的这种伪代码本质是它最大的优点之一。
它使你能够专注于解决问题而不是去搞明白语言本身。
2、易学:就如同你即将看到的一样,Python极其容易上手。前面已经提到了,Python有极其简
单的语法。
3、免费、开源:Python是FLOSS(*/开放源码软件)之一。简单地说,你可以*地发布这
个软件的拷贝、阅读它的源代码、对它做改动、把它的一部分用于新的*软件中。FLOSS
是基于一个团体分享知识的概念。这是为什么Python如此优秀的原因之一——它是由一群希
望看到一个更加优秀的Python的人创造并经常改进着的。
4、高层语言:当你用Python语言编写程序的时候,你无需考虑诸如如何管理你的程序使用的内
存一类的底层细节。
5、可移植性:由于它的开源本质,Python已经被移植在许多平台上(经过改动使它能够工作在
不同平台上)。如果你小心地避免使用依赖于系统的特性,那么你的所有Python程序无需修
改就可以在下述任何平台上面运行。这些平台包括Linux、Windows、FreeBSD、
Macintosh、Solaris、OS/2、Amiga、AROS、AS/400、BeOS、OS/390、z/OS、Palm
OS、QNX、VMS、Psion、Acom RISC OS、VxWorks、PlayStation、Sharp Zaurus、
Windows CE甚至还有PocketPC、Symbian以及Google基于linux开发的Android平台!
6、解释型语言:一个用编译型语言比如C或C++写的程序可以从源文件(即C或C++语言)转换
到一个你的计算机使用的语言(二进制代码,即0和1)。这个过程通过编译器和不同的标
记、选项完成。当你运行你的程序的时候,连接/转载器软件把你的程序从硬盘复制到内存中
并且运行。而Python语言写的程序不需要编译成二进制代码。你可以直接从源代码运行程
序。在计算机内部,Python解释器把源代码转换成称为字节码的中间形式,然后再把它翻译
成计算机使用的机器语言并运行。事实上,由于你不再需要担心如何编译程序,如何确保连接
转载正确的库等等,所有这一切使得使用Python更加简单。由于你只需要把你的Python程序
拷贝到另外一台计算机上,它就可以工作了,这也使得你的Python程序更加易于移植。
7、面向对象:Python既支持面向过程的编程也支持面向对象的编程。在“面向过程”的语言中,程
序是由过程或仅仅是可重用代码的函数构建起来的。在“面向对象”的语言中,程序是由数据和
功能组合而成的对象构建起来的。与其他主要的语言如C++和Java相比,Python以一种非常
强大又简单的方式实现面向对象编程。
8、可扩展性:如果你需要你的一段关键代码运行得更快或者希望某些算法不公开,你可以把你的
部分程序用C或C++编写,然后在你的Python程序中使用它们。
9、丰富的库:Python标准库确实很庞大。它可以帮助你处理各种工作,包括正则表达式、文档
生成、单元测试、线程、数据库、网页浏览器、CGI、FTP、电子邮件、XML、XML-RPC、
HTML、WAV文件、密码系统、GUI(图形用户界面)、Tk和其他与系统有关的操作。记住,
只要安装了Python,所有这些功能都是可用的。这被称作Python的“功能齐全”理念。除了标准
库以外,还有许多其他高质量的库,如wxPython、Twisted和Python图像库等等。
10、规范的代码:Python采用强制缩进的方式使得代码具有极佳的可读性。

缺点
Python语言非常完善,没有明显的短板和缺点,唯一的缺点就是执行效率慢,这个是解释型语言
所通有的,同时这个缺点也将被计算机越来越强大的性能所弥补。

Python应用场景
1、Web应用开发
Python经常被用于Web开发。比如,通过mod_wsgi模块,Apache可以运行用Python编写的
Web程序。Python定义了WSGI标准应用接口来协调Http服务器与基于Python的Web程序之间
的通信。一些Web框架,如Django,TurboGears,web2py,Zope等,可以让程序员轻松地开发
和管理复杂的Web程序。
2、操作系统管理、服务器运维的自动化脚本
在很多操作系统里,Python是标准的系统组件。 大多数Linux发行版以及NetBSD、OpenBSD
和Mac OS X都集成了Python,可以在终端下直接运行Python。有一些Linux发行版的安装器
使用Python语言编写,比如Ubuntu的Ubiquity安装器,Red Hat Linux和Fedora的Anacond

–MapReduce

优点:
1)MapReduce易于编程
如果要编写分布式程序,只需实现一些简单接口,与编写普通程序类似,避免了复杂过程。这个分布式程序可以分布到大量廉价的 PC 机器上运行。也就是说你写一个分布式程序,跟写一个简单的串行程序是一模一样的。就是因为这个特点使得 MapReduce 编程变得非常流行。
2)良好的扩展性
当计算资源不能得到满足的时候,可以通过简单的增加机器来扩展它的计算能力。
3)高容错性
MapReduce设计的初衷就是使程序能够部署在廉价的 PC 机器上,廉价的 PC 机器坏的概率相对较高,这就要求它具有很高的容错性。比如其中一台机器挂了,它可以把上面的计算任务转移到另外一个节点上运行,不至于这个任务运行失败,而且这个过程不需要人工参与,而完全是由 Hadoop 内部完成的。
4)适合PB级以上海量数据的离线处理
这里的“离线”可以理解为存在本地,非实时处理,离线计算往往需要一段时间,比如几分钟或几个小时。可以实现上干台服务器集群并发工作,提供数据处理能力。
缺点:
1)不擅长实时计算
MapReduce 不适合在毫秒或者秒级内返回结果。
2)不擅长流式计算
流式计算的输入数据是动态的,而 MapReduce 的输入数据集是静态的,不能动态变化。这是因为 MapReduce 自身的设计特点决定了数据源必须是静态的。
3)不擅长DAG(有向图)计算
多个应用程序存在依赖关系,后一个应用程序的输入为前一个的输出。在这种情况下,MapReduce 并不是不能做,而是使用后,每个 MapReduce 作业的输出结果都会写入到磁盘,会造成大量的磁盘 IO,导致性能非常的低下。
典型应用场景
1)单词统计
2)简单的数据统计,比如网站PV和UV统计
3)搜索引擎建立索引
4)搜索引擎中,统计最流行的K个搜索词
5)统计搜索词的频率,帮助优化搜索词提示
6)复杂数据分析算法实现

–Hive

优点:
(1)简单容易上手:提供了类SQL查询语言HQL
(2)可扩展:为超大数据集设计了计算/扩展能力(MR作为计算引擎,HDFS作为存储系统)
一般情况下不需要重启服务Hive可以*的扩展集群的规模。
(3)提供统一的元数据管理
(4)延展性:Hive支持用户自定义函数,用户可以根据自己的需求来实现自己的函数
(5)容错:良好的容错性,节点出现问题SQL仍可完成执行
缺点:
(1)hive的HQL表达能力有限
1)迭代式算法无法表达,比如pagerank
2)数据挖掘方面,比如kmeans
(2)hive的效率比较低
1)hive自动生成的mapreduce作业,通常情况下不够智能化
2)hive调优比较困难,粒度较粗
3)hive可控性差
应用场景:
(1)数据仓库:数据抽取、数据加载、数据转换 (2)数据汇总:每天/每周用户点击数、流量统计 (3)非实时分析:日志分析、文本分析 (4)数据挖掘:用户行为分析、兴趣分区、区域展示

–Spark

spark的优势:(1)图计算,迭代计算(训练机器学习算法模型做广告推荐,点击预测,同时基于spark的预测模型能做到分钟级)(2)交互式查询计算(实时)
缺点:1.资源调度方面,Spark和Hadoop不同,执行时采用的是多线程模式,Hadoop是多进程,多线程模式会减少启动时间,但也带来了无法细粒度资源分配的问题。但本质上讲其实这也不能算是Spark的缺点,只不过是tradeoff之后的结果而已。2.其实Spark这种利用内存计算的思想的分布式系统你想要最大发挥其性能优势的话对集群资源配置要求较高,比如内存(当然内存不足也能用)
spark的主要应用场景:(1)推荐系统,实时推荐 (2)交互式实时查询
spark特点:(1)分布式并行计算框架(2)内存计算,不仅数据加载到内存,中间结果也存储内存(中间结果不需要落地到hdfs)
还有一个特点:Spark在做Shuffle时,在Groupby,Join等场景下去掉了不必要的Sort操作,相比于MapReduce只有Map和Reduce二种模式,Spark还提供了更加丰富全面的运算操作如filter,groupby,join等。

上一篇:05 RDD练习:词频统计,学习课程分数


下一篇:04 RDD编程练习