Spark零基础学习笔记(一)——Python版

由于Scala才刚刚开始学习,还是对python更为熟悉,因此在这记录一下自己的学习过程,主要内容来自于spark的官方帮助文档,这一节的地址为:

http://spark.apache.org/docs/latest/quick-start.html

文章主要是翻译了文档的内容,但也在里边加入了一些自己在实际操作中遇到的问题及解决的方案,和一些补充的小知识,一起学习。

环境:Ubuntu 16.04 LTS,Spark 2.0.1, Hadoop 2.7.3, Python 3.5.2,

利用spark shell进行交互式分析

1. 基础

首先打开spark与python交互的API

$ cd /usr/local/spark
$ ./bin/pyspark

Spark最重要的一个概念就是RDD(Resilient Distributed Dataset),弹性分布式数据集。RDD可以利用Hadoop的InputFormats创建,或者从其他RDD转换。

这里,作为入门,我们利用spark安装后文件夹中自带的README.md(此文件位置为/usr/local/spark/README.md)文件作为例子,学习如何创建一个新的RDD。

创建新的RDD:

>>> textFile = sc.textFile(“README.md”)

RDD支持两种类型的操作,actions和transformations:

actions: 在数据集上运行计算后返回值

transformations: 转换, 从现有数据集创建一个新的数据集

RDD可以有执行一系列的动作(actions),这些动作可以返回值(values),转换(transformations),或者指向新的RDD的指针。下边学习RDD的一些简单的动作:

>>> textFile.count()  # 计数,返回RDD中items的个数,这里就是README.md的总行# 数
99
>>> textFile.first()  # RDD中的第一个item,这里就是文件README.md的第一行
u‘# Apache Spark‘

注意:如果之前是从/usr/local/spark启动pyspark,然后读取README.md文件的,如果执行count语句,会出现以下错误:

py4j.protocol.Py4JJavaError: An error occurred while calling z:org.apache.spark.api.python.PythonRDD.collectAndServe.

: org.apache.hadoop.mapred.InvalidInputException: Input path does not exist: hdfs://localhost:9000/user/spark/README.md

这是因为在使用相对路径时,系统默认是从hdfs://localhost:9000/目录下读取README.md文件的,但是README.md文件并不在这一目录下,所以sc.textFile()必须使用绝对路径,此时代码修改为:

>>> textFile = sc.textFile(“file:///usr/local/spark/README.md”)
99

下边尝试使用一个转换(transformation)。例如,使用filter这一转换返回一个新的RDD,这些RDD中的items都含有“Spark”字符串。

>>> linesWithSpark = textFile.filter(lambda line: “Spark” in line)

我们还可以将actions和transformation链接起来:

>>> textFile.filter(lambda line: “Spark” in line).count()  # 有多好行含有“Spark”这一字符串
19

2. 更多的RDD操作

利用RDD的动作和转换能够完成很多复杂的计算。例如,我们希望找到含有最后单词的一句话:

>>> textFile.map(lambda line: len(line.split())).reduce(lambda a, b: a if (a>b) else b)
22

这个语句中,map函数将len(line.split())这一语句在所有line上执行,返回每个line所含有的单词个数,也就是将line都map到一个整数值,然后创建一个新的RDD。然后调用reduce,找到最大值。map和reduce函数里的参数是python中的匿名函数(lambda),事实上,我们这里也可以传递python中更顶层的函数。比如,我们先定义一个比较大小的函数,这样我们的代码会更容易理解:

>>> def max(a, b):
. . .     if a > b:
. . .         return a
. . .     else:
. . .         return b
. . .
>>> textFile.map(lambda line: len(line.split())).reduce(max)
22

Hadoop掀起了MapReduce的热潮。在spark中,能够更加容易的实现MapReduce

>>> wordCounts = textFile.flatMap(lambda line: line.split()).map(lambda word: (word, 1)).reduceByKey(lambda a, b: a+b)

上述语句中,利用flatMap, map和reduceByKey三个转换,计算文件README.md中每个单词出现的个数,并返回一个新的RDD,每个item的格式为(string, int),即单词和对应的出现次数。其中,

flatMap(func):与map相似,但是每个输入的item能够被map到0个或者更多的输出items上,也就是说func的返回值应当是一个Seq,而不是一个单独的item,上述语句中,匿名函数返回的就是一句话中所含的每个单词

reduceByKey(func):可以作用于使用“键-值”(K, V)形式存储的数据集上并返回一组新的数据集(K, V),其中,每个键的值为聚合使用func操作的结果,这里相当于python中字典的含义。上述语句中,相当于当某个单词出现一次时,就在这个单词的出现次数上加1,每个单词就是一个Key,reducByKey中的匿名函数计算单词的出现次数。

要收集上述语句的计算结果,可以使用collect这一动作:

>>> wordCounts.collect()
[(u‘when‘, 1), (u‘R,‘, 1), (u‘including‘, 3), (u‘computation‘, 1), ...]

3. 缓存Caching

Spark也支持将数据集存入集群范围的内存缓存中。这对于需要进行重复访问的数据非常有用,比如我们需要在一个小的数据集中执行查询操作,或者需要执行一个迭代算法(例如PageRank)。下面,利用之前命令中得到的linesWithSpark数据集,演示缓存这一操作过程:

>>> linesWithSpark.cache()
PythonRDD[26] at RDD at PythonRDD.scala:48
>>> linesWithSpark.count()
19
>>> linesWithSpark.count()
19

利用Spark去缓存一个100行的文件可能并没什么意义。但是有趣的是,这一系列的操作可以用于非常大的数据集上,甚至含有成千上万的节点的数据集。

4. 自含式应用程序(self-contained applications)

假设我们希望利用Spark API写一个自含式应用程序,我们可以利用Scala,Java或者Python完成。

下边,简单介绍一下怎样利用Python API (PySpark)写一个应用程序,命名为SimpleApp.py.

在spark所在目录下输入:

./bin/spark-submit --master local[4] SimpleApp.py

输出为:

Lines with a: 61, Lines with b: 27

此外,Spark自带很多例子,可以在spark目录下输入下列指令查看:

# For Scala and Java, use run-example:

./bin/run-example SparkPi

# For Python examples, use spark-submit directly:

./bin/spark-submit examples/src/main/python/pi.py

# For R examples, use spark-submit directly:

./bin/spark-submit examples/src/main/r/dataframe.R
时间: 2024-10-27 03:50:02

Spark零基础学习笔记(一)——Python版的相关文章

零基础学习什么是python列表(list)

今天马哥教育要跟大家分享的文章是零基础学习什么是Python列表(list)?Python中没有数组,list是一种有序的集合可以随时添加和删除其中的元素,可以添加不同类型的数据. Python入门新手和正在Python学习的小伙伴快来看一看吧,希望能够对大家有所帮助 ! 列表元组用索引来访问,索引从0开始 用len()函数可以获得list元素的个数 <img src="http://www.magedu.com/wp-content/uploads/2019/11/20190522134

Spark (Python版) 零基础学习笔记(二)—— Spark Transformations总结及举例

1. map(func) 将func函数作用到数据集的每个元素,生成一个新的分布式的数据集并返回 1 >>> a = sc.parallelize(('a', 'b', 'c')) 2 >>> a.map(lambda x: x+'1').collect() 3 ['a1', 'b1', 'c1'] 2. filter(func) 选出所有func返回值为true的元素,作为一个新的数据集返回 1 >>> a = sc.parallelize(rang

零基础学习python-搭建python开发环境

不管用什么工具开发Python程序,都必须安装Python的运行环境.由于Python是跨平台的,所以在安装之前,先要确定在哪一个操作系统平台上安装,目前最常用的是Windows.Mac OS X和Linux三大平台,这里主要讲下Windows平台中搭建python环境. 1.Python的下载 首先需要去python官网下载python安装包 下载后,双击下载包,进入 Python 安装向导,安装非常简单,你只需要使用默认的设置一直点击"下一步"直到安装完成即可 2.环境变量配置 在

Python零基础学习系列之二--Python介绍及环境搭建

1-1.Python简介: Python是一种解释型.面向对象.动态数据类型的高级程序设计语言.Python由Guido van Rossum于1989年底发明,第一个公开发行版发行于1991年.像Perl语言一样, Python 源代码同样遵循 GPL(GNU General Public License)协议. Python(英国发音:/?pa?θ?n/ 美国发音:/?pa?θɑ?n/), 是一种面向对象的解释型计算机程序设计语言,由荷兰人Guido van Rossum于1989年发明,第

零基础学习Python需要用什么开发工具?

最近有不少读者私信我,这不刚开始学习Python就开始遇到难题了,对于Python IDE都比较纠结,希望找到一些适合自己的.Python开发工具.本篇给大家分享几款Python开发工具,供正在纠结用哪种开发工具的小伙伴们参考~ 对于学习Python的小伙伴,小编首推的Pycharm. 首先,PyCharm用于一般IDE具备的功能,比如, 调试.语法高亮.Project管理.代码跳转.智能提示.自动完成.单元测试.版本控制 另外,PyCharm还提供了一些很好的功能用于Django开发,同时支持

零基础学习openstack【完整中级篇】及openstack资源汇总

1.你是如何学习openstack的?2.你对openstack的组件了解多少?3.你认为openstack该如何学习? 一直想写关于openstack的方面的内容,今天终于整理完成.算是完成一桩心事,内容整合来自: 零基础学习openstack(上)[中级篇] 零基础学习openstack(下)[中级篇] 是在 零基础学习openstack[初级篇]基础上的一个继续: 初级篇,我们主要是有这么一个概念,openstack的组成openstack由哪些部分来组成: Identity(代号为“Ke

零基础学习 Hadoop 如何下手

想学习hadoop,可是苦于自己没有任何的基础,不知道该如何下手,也不知道自己能不能学会.其实零基础学习hadoop,没有想象的那么困难.曾经我也是一位小白,刚接触到云计算,想过培训,但是培训机构的选择也让我很纠结,就自己开始去摸索学习,现在我把自己的学习思路整理一下,希望对大家有帮助. 首先整体说一下学习过程给大家借鉴: 一.了解hadoop: 这里不具体阐述概念,有兴趣的同学可以自己上网去查.我们知道hadoop,有单机安装,伪分布安装和分布安装.同时hadoop的环境是Linux,所以我们

零基础学习IOS开发(二)- 使用cocos2d-x3.0 执行Hello world

关于开发框架,依据网上检索来的信息,感觉cocos2d-x的ios游戏开发框架非常不错,并且有非常强的可移植性,因此打算尝试一下. 截止写下此文章,最新的cocos2d-x的版本号为v3.0稳定版(几天前刚刚公布),下载地址为:http://www.cocos2d-x.org/filedown/cocos2d-x-3.0-cn 安装方式例如以下: 1.解压程序压缩包(所在路径不能有中文哦,由于是python,你懂的...) 2.sudo python setup.py 安装cocos2d-x,依

零基础学习hadoop到上手工作线路指导(编程篇)

问题导读:1.hadoop编程需要哪些基础?2.hadoop编程需要注意哪些问题?3.如何创建mapreduce程序及其包含几部分?4.如何远程连接eclipse,可能会遇到什么问题?5.如何编译hadoop源码? 阅读此篇文章,需要些基础下面两篇文章零基础学习hadoop到上手工作线路指导(初级篇) 零基础学习hadoop到上手工作线路指导(中级篇)如果看过的话,看这篇不成问题,此篇讲hadoop编程篇. hadoop编程,hadoop是一个Java框架,同时也是编程的一次革命,使得传统开发运