SparkSQL写出
在 SparkSQL 中,可以将 DataFrame
写出为多种格式,包括 Parquet、JSON、ORC、CSV 和 Text。每种格式有自己的特点和配置选项。下面是每种格式的详细说明、如何写出,以及常见的规则。
1. Parquet 格式
Parquet 是一种列式存储格式,适用于大规模数据处理,特别是查询性能要求较高的场景。它具有压缩和高效读取的特点,特别适合大数据分析。
写出 Parquet 格式:
df.write \
.mode('overwrite') \
.format('parquet') \
.save('hdfs://mycluster/sparkdata/data.parquet')
规则和选项:
- 压缩:Parquet 默认支持压缩,可以通过
option('compression', 'snappy')
指定压缩方式(默认是snappy
)。 - 模式:
overwrite
:覆盖现有文件。append
:追加数据。ignore
:如果文件存在,则忽略。error
:如果文件存在,则抛出错误。
注意:
- Parquet 是自带模式(schema)的文件格式,不需要手动定义数据类型。
- 使用 SparkSQL 读取 Parquet 文件时,Spark 会自动推断数据类型。
2. JSON 格式
JSON 格式是一种基于文本的轻量级数据交换格式,易于人和机器读取和编写。它常用于结构化和半结构化数据。
写出 JSON 格式:
df.write \
.mode('overwrite') \
.format('json') \
.save('hdfs://mycluster/sparkdata/data.json')
规则和选项:
- 模式:与其他格式一致,支持
overwrite
、append
、ignore
和error
。 - 压缩:可以使用
option('compression', 'gzip')
来启用压缩(默认无压缩)。 multiLine
选项:如果 JSON 数据格式比较复杂,可以设置option('multiLine', True)
来启用多行解析。
- JSON 格式适合处理半结构化数据。
- SparkSQL 可以自动推断 JSON 文件的模式(schema)。
3. ORC 格式
ORC(Optimized Row Columnar)格式是一种高效的列式存储格式,类似于 Parquet,通常用于 Hive 和 Hadoop 生态系统中,适合大规模数据处理。
写出 ORC 格式:
df.write \
.mode('overwrite') \
.format('orc') \
.save('hdfs://mycluster/sparkdata/data.orc')
规则和选项:
- 压缩:ORC 格式默认使用
zlib
压缩,可以通过option('compression', 'snappy')
来指定压缩方式。 - 模式:支持
overwrite
、append
、ignore
和error
。
- ORC 和 Parquet 格式相似,适用于大规模数据的高效存储和读取。
- ORC 文件可以和 Hive 整合得很好,常用于大规模数据处理。
4. CSV 格式
CSV(Comma-Separated Values)是一种常用的文本格式,广泛用于数据交换和存储,但它没有复杂的数据模式和类型支持。
写出 CSV 格式:
df.write \
.mode('overwrite') \
.format('csv') \
.option('sep', ',') \
.option('header', True) \
.save('hdfs://mycluster/sparkdata/data.csv')
规则和选项:
sep
:指定字段分隔符,默认为逗号(,
)。header
:设置为True
表示写入时包含列名。- 压缩:可以使用
option('compression', 'gzip')
来启用压缩。 - 模式:与其他格式相同,支持
overwrite
、append
、ignore
和error
。
- CSV 格式不带有模式(schema),需要手动指定数据类型,或者在读取时让 Spark 自动推断模式。
- 适用于简单的数据存储和交换场景,但不适合大规模、高性能的数据分析。
5. Text 格式
Text 格式是最简单的文件格式,每行是一个字符串,没有特定的结构化数据类型。这通常用于存储单列的文本数据,比如日志文件或简单的输出。
写出 Text 格式:
df.write \
.mode('overwrite') \
.format('text') \
.save('hdfs://mycluster/sparkdata/data.txt')
规则和选项:
- 压缩:可以通过
option('compression', 'gzip')
来启用压缩。 - 模式:支持
overwrite
、append
、ignore
和error
。
text
格式仅支持单列数据。默认情况下,每行存储为字符串。- 如果需要写出多列数据到文本文件中,需要将数据转换为单列(例如使用
selectExpr("concat_ws(',', *) as value")
)。
各种格式的比较:
格式 | 特点 | 压缩支持 | 是否带有模式(Schema) | 适用场景 |
---|---|---|---|---|
Parquet | 列式存储,高效读写,压缩好 | 支持(默认 snappy ) | 是 | 大规模数据分析、高效查询 |
JSON | 文本格式,适合半结构化数据 | 支持 | 否 | 轻量级数据交换,半结构化数据 |
ORC | 列式存储,主要用于 Hive | 支持(默认 zlib ) | 是 | 大数据处理,Hive 集成 |
CSV | 简单的文本格式,不带有模式 | 支持 | 否 | 简单数据存储和交换,表格数据 |
Text | 最简单的文本格式,仅支持单列 | 支持 | 否 | 处理简单的文本数据,日志文件等 |
通用规则:
-
写出模式(
mode
):'overwrite'
:覆盖现有文件。'append'
:追加数据。'ignore'
:文件存在时不写入。'error'
或'errorifexists'
:文件存在时抛出错误。
-
压缩选项(
compression
):- 适用于 Parquet、JSON、ORC、CSV、Text 等格式。常见压缩方式包括
gzip
、snappy
、bzip2
等。
- 适用于 Parquet、JSON、ORC、CSV、Text 等格式。常见压缩方式包括
每种文件格式都有其独特的优势和适用场景,您可以根据具体的数据处理需求选择合适的格式。Parquet 和 ORC 适用于大规模数据分析,JSON 和 CSV 适合轻量级的数据存储和交换,而 Text 格式适合处理简单的文本数据。