我用的是ubuntu系统,打开“终端”,进入Shell命令提示符状态,然后,在“/usr/local/spark/mycode”目录下,新建一个wordcount子目录,并在“/usr/local/spark/mycode/wordcount”目录下新建一个包含了一些语句的文本文件word.txt(你可以在文本文件中随意输入一些单词,用空格隔开)。打开“终端”(可以在Linux系统中使用Ctrl+Alt+T组合键开启终端),进入shell命令提示符状态,然后执行以下命令进入pyspark:
- 文本文件:不是结构化,普通的文本文件,每一行一条记录
- JSON: 半结构化,常见的基于文本的格式,半结构化;大多数库都要求每行一条记录。
- CSV:结构化,非常常见的基于文本的格式,通常在电子表格应用中使用。
- SequenceFile:结构化,一种用于键值对数据的常见Hadoop文件格式。
- Protocol buffers:结构化,一种快速的,节约空间的跨语言格式。
- 对象文件:用来将Spark作业中的数据存储下来以让共享的代码读取。改变类的时候它会失效,因为他依赖于java序列化。
下面分别介绍本地文件系统的数据读写和分布式文件系统HDFS的数据读写。
>>> input = sc.textFile("file:///usr/local/spark/mycode/wordcount/word.txt")
注意,要加载本地文件,必须采用“file:///”开头的这种格式。执行上上面这条命令以后,并不会马上显示结果,因为,Spark采用惰性机制,只有遇到“行动”类型的操作,才会从头到尾执行所有操作。所以,下面我们执行一条“行动”类型的语句,就可以看到结果:
>>>input.first()
first()是一个“行动”(Action)类型的操作,会启动真正的计算过程,从文件中加载数据到变量textFile中,并取出第一行文本。屏幕上会显示很多反馈信息,这里不再给出,你可以从这些结果信息中,找到word.txt文件中的第一行的内容。
为了能够读取HDFS中的文件,请首先启动Hadoop中的HDFS组件。下面,我们把本地文件系统中的“/usr/local/spark/mycode/wordcount/word.txt”上传到分布式文件系统HDFS中(放到hadoop用户目录下):
./bin/hdfs dfs -put /usr/local/spark/mycode/wordcount/word.txt .
现在,让我们切换回到pyspark窗口,编写语句从HDFS中加载word.txt文件,并显示第一行文本内容:
>>> val input = sc.textFile("hdfs://localhost:9000/user/hadoop/word.txt")
>>> input.first()
下面,我们再把textFile的内容写回到HDFS文件系统中(写到hadoop用户目录下):
>>> val input = sc.textFile("word.txt")
>>> input.saveAsTextFile("writeback.txt")
saveAsTextFile()是一个“行动”(Action)类型的操作,所以,马上会执行真正的计算过程,从word.txt中加载数据到变量input中,然后,又把input中的数据写回到writeback.txt中。
JSON(JavaScript Object Notation) 是一种轻量级的数据交换格式。
Spark提供了一个JSON样例数据文件,存放在“/usr/local/spark/examples/src/main/resources/people.json”中。people.json文件的内容如下:
{"name":"Michael"}
{"name":"Andy", "age":30}
{"name":"Justin", "age":19}
在编写解析程序之前,我们首先来看一下把本地文件系统中的people.json文件加载到RDD中以后,数据是什么形式,请在spark-shell中执行如下操作:
>>> jsonStr = sc.textFile("file:///usr/local/spark/examples/src/main/resources/people.json")
>>> jsonStr.foreach(print)
{"name":"Michael"}
{"name":"Andy", "age":30}
{"name":"Justin", "age":19}
逗号分隔值Comma-Separated Values(CSV)文件每行都有固定数目的字段,字段间用逗号隔开(在制表符分隔值文件,即TSV文件中用制表符隔开)。记录通常是一行一条。
读取CSV/TSV 数据和读取JSON 数据相似,都需要先把文件当作普通文本文件来读取数据,再对数据进行处理。
在python中使用textFIle()读取CSV
import CSV
import StringIO
def loadRecord(line):
"""解析一行CSV记录"""
input=StringIO.StringIO(line)
reader=CSV.DictReader(input,fieldnames=["name","favouriteAnimal"])
return reader.next()
input=sc.textFile(inputFile).map(loadRecord)