文件读写
读写文本文件
PySpark可以直接将一个文本文件读取进来,变成一个RDD,将文件的每一行作为RDD中的一个元素。比如读取一个Markdown文件:
from pyspark import SparkConf, SparkContext
conf = SparkConf().setMaster('local').setAppName('MyApp')
sc = SparkContext(conf=conf)
rdd = sc.textFile('/Users/data/README.md')
使用saveAsTextFile()可以将数据保存为文本文件。PySpark会将传入路径作为文件夹,从多个节点在其下并行输出多个文件,因此数据的每一个部分输出到哪个文件中往往是不受控的。
rdd.saveAsTextFile('/Users/data/output_folder')
读写JSON文件
PySpark可以通过SparkSession直接读取JSON文件,在之前的文章《PySpark大数据分析(1):Spark的安装与文件读取》中有Yelp数据集的例子。如果需要使用RDD完成操作的话,则可以用文本读写的方式加上JSON的序列化库共同完成。
import json
# read json file
rdd = sc.textFile('/Users/data/archive/yelp_academic_dataset_review.json')
# parse the file
yelp = rdd.map(lambda x: json.loads(x))
# save rdd as a json file
yelp.map(lambda x: json.dumps(x)).saveAsTextFile('yelp.json')
读写CSV文件
和JSON文件一样,CSV格式的文件也可以通过文本文件读写结合解析CSV格式的库的方式完成读写操作,或者使用SparkSession直接读取变成DataFrame。
读写SequenceFile
SequenceFile是Hadoop常用格式的一种。由于Hadoop的设计是用来存储大文件的,大量的小文件存储会产生大量的元信息,导致Hadoop存储压力上升。因此,Hadoop使用了SequenceFile以二进制键值对的方式对小文件进行集中管理。在结构上,SequenceFile有一个header与多个record组层。其中header用于存放键值的类、压缩算法、同步标记等等,PySpark可以依靠同步标记并行读取SequenceFile;record存储记录长度、键的长度、键、以及值。在SparkContext中,可以调用sequenceFile()读取SequenceFile,调用时除了指定路径外,还需要注意这里的键值都是Hadoop的Writable类。
data = sc.sequenceFile(
path='/Users/data/sequence_file',
keyClass='org.apache.hadoop.io.Text',
valueClass='org.apache.hadoop.io.IntWritable'
)
将PySpark中的一个RDD保存为SequenceFile同样可以直接调用API,同时还可以指定Hadoop的编码方式,默认为None。
data.saveAsSequenceFile(path='sequence_file', compressionCodecClass='org.apache.hadoop.io.compress.GzipCodec')
读写对象文件
Hadoop输入输出格式
文件压缩
文件系统读写
Amazon S3
HDFS
Spark SQL
Spark SQL可以处理传入的SQL查询,并返回一个由Row对象组成的RDD作为查询的结果。在PySpark中,我们可以使用row[column_number]或者row.column_name访问指定元素。
Hive
Hive是最常见的结构化数据源之一,使用Spark SQL连接Hive需要将Hive的配置文件hive-site.xml放到Spark的配置目录下,一般为/etc/spark/conf/。配置完成后,创建HiveContext对象,就可以使用HQL进行查询了。返回值是由Row组成的RDD。
from pyspark.sql import HiveContext
hiveCtx = HiveContext(sc)
rows = hiveCtx.sql('SELECT UserID, Gender FROM users')
print(rows.first().UserID)
# 1
Parquet
JSON
数据库
JDBC
Cassandra
HBase
Elasticsearch