<Spark快速大数据分析>读书笔记(三)
PART 5 数据读取与保存
1.文件格式与文件系统:
Spark支持的一些常见文件格式:

1.1文本文件:
读取:文本文件的读取通过textFile(),如果需要读取整个文件夹,可以使用wholeTextFiles(),该方法会返回一个pair RDD,键为文件名
保存:saveAsTextFile()传入一个文件保存的路径,Spark会将该路径视为目录,在该目录下保存多个文件,这样Spark就可以从各个节点并行保存了。这个过程不能控制哪个节点输出到哪个文件,但是可以对输出格式进行控制。
1.2JSON:
读取:
1 #在Python中读取非结构化的JSON 2 import json 3 data = input.map(lambda x: json.loads(x))
保存:
1 #Python将数据保存为JSON格式 2 import json 3 data.map(lambda x: json.dumps(x)).saveAsTextFile(outputFile)
1.3逗号分隔值(CSV)与制表符分隔值:
读取:
#在Python中使用textFile()读取csv import csv from StringIO import StringIO def loadRecord(line): inputLine = StringIO.StringIO(line) reader = csv.DictReader(inputLine, fieldnames=['names', 'favoriateAnimals']) return reader input = sc.textFile(inputFile).map(loadRecord) #如果字段中嵌有换行符,则需要完整读入整个文件,python读取整个csv文件如下 def loadRecord(fileNameContents): inputFile = StringIO.StringIO(fileNameContents) reader = csv.DictReader(inputFile, fieldnames=['name', 'favoriateAnimal']) return reader fullFileData = sc.wholeTextFiles(inputFile).map(loadRecord)
保存:
1 #Python保存csv文件 2 import csv 3 from io import StringIO 4 5 def writeRecords(records): 6 outputs = StringIO.StringIO() 7 writer = csv.DictWriter(outputs, fieldnames=['name', 'favoriateAnimal']) 8 for record in records: 9 writer.writerow(record) 10 return [outputs.getvalue()] 11 12 inputFile.mapPartitions(writeRecords).saveAsTextFile(outputFile)
1.4SequenceFile:
SequenceFile是由没有相对关系结构的键值对文件构成的常用Hadoop格式。
SequenceFile有同步标记,Spark可以用它来定位文件中的某个点,然后再与记录的便捷对齐。这可以让Spark通过多个节点高效地并行读取SequenceFile。(???)
读取:
1 #Python读取SequenceFile 2 data = sc.SequenceFile(inFile, "org.apache.hadoop.io.Text", "org.apache.hadoop.io.InWritable")
1.5对象文件:
对象文件看起来像是对SequenceFile文件的简单封装,它允许存储只包含值的RDD,和SequenceFile不一样的是,对象文件是通过java序列化写出来的。对象文件在python中无法使用,不过python中的RDD和SparkContext支持saveAsPickleFIle()和pickleFile()方法作为替代
1.6Hadoop输入输出格式:
除了Spark封装的格式以外,也可以与任何Hadoop支持的格式交互
2.Spark SQL中的结构化数据源:
2.1 Apache Hive:
Apache Hive是hadoop上一种常见的结构化数据源,Hive可以在HDFS或者其他存储系统上存储多种格式的表。Spark SQL可以读取Hive支持的任何表
1 #用Python创建HiveContext并查询数据 2 from pyspark.sql import HiveContext 3 4 hiveCtx = HiveContext(sc) 5 rows = hiveCtn.sql("SELECT name, age FROM users") 6 firstRow = rows.first() 7 print(firstRow.name)
2.2JSON:
1 #在Python中使用Spark SQL读取JSON文件 2 tweets = hiveCtx.jsonFile("tweets.json") 3 tweets = registerTempTable("tweets") 4 results = hiveCtx.sql("SELECT user.name, text FROM tweets")
3.数据库与键值存储:
通过数据库提供的Hadoop连接器或者Spark连接器,Spark可以访问一些常用的数据库系统。
3.1Java数据库连接:
Spark可以从任何支持java连接的关系型数据(JDBC)中读取数据,例如MySQL、Postgre等
3.2Cassandra:
暂不支持python中使用
3.3其他:诸如HBase,Elasticsearch

浙公网安备 33010602011771号