<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

posted @ 2018-02-05 19:32  McConor  阅读(548)  评论(0)    收藏  举报