文本数据读取 → Spark操作 → 处理后数据写入
0. 目的
目前为止,所展示的示例都是从本地集合或者普通文件中进行数据读取和保存的。但有时候,数据量可能大到无法放在一台机器中,这时就需要探索别的数据读取和保存的方法了。
Spark 支持很多种输入输出源
三类常见的数据源:
- 文件格式与文件系统.
- 本地文件系统或分布式文件系统(比如 NFS、 HDFS、 Amazon S3 等)中的数据;
- 文件格式,包括文本文件、 JSON、 SequenceFile,以及 protocol buffer。
- Spark SQL中的结构化数据源.
- 数据库与键值存储.
Part 1 文件格式
Spark 对很多种文件格式的读取和保存方式都很简单。
从诸如文本文件的非结构化的文件,到诸如 JSON 格式的半结构化的文件,再到诸如 SequenceFile 这样的结构化的文件,Spark都可以支持.
格式名称 | 结构化 | 备注 |
---|---|---|
文本文件 | 否 | 普通的文本文件,每行一条记录 |
JSON | 半结构化 | 常见的基于文本的格式,半结构化;大多数库都要求每行一条记录 |
CSV | 是 | 非常常见的基于文本的格式,通常在电子表格应用中使用 |
SequenceFiles | 是 | 一种用于键值对数据的常见 Hadoop 文件格式 |
Protocol buffers | 是 | 一种快速、节约空间的跨语言格式 |
对象文件 | 是 | 用来将 Spark 作业中的数据存储下来以让共享的代码读取。改变类的时候它会失效,因为它依赖于 Java 序列化** |
1.1 文件格式
单个文本:
一个文本文件读取为 RDD 时,输入的每一行都会成为 RDD 的一个元素。多个文本:
将多个完整的文本文件一次性读取为一个 pair RDD,其中键是文件名,值是文件内容。
1. 读取文本文件
只需要使用文件路径作为参数调用 SparkContext 中的 textFile() 函数,就可以读取一个文本文件.
如果要控制分区数的话,可以指定 minPartitions。
// Python 中读取一个文本文件
input = sc.textFile("file:///home/holden/repos/spark/README.md")
如果多个输入文件以一个包含数据所有部分的目录的形式出现,可以用两种方式来处理。
仍使用 textFile 函数,传递目录作为参数,这样它会把各部分都读取到 RDD中;
如果文件足够小,那么可以使用 SparkContext.wholeTextFiles() 方法,该方法会返回一个 pair RDD,其中键是输入文件的文件名。
wholeTextFiles() 在每个文件表示一个特定时间段内的数据时非常有用。如果有表示不同阶段销售数据的文件,则可以很容易地求出每个阶段的平均值.
Spark 支持读取给定目录中的所有文件,