菜单
本页目录

SparkSQL写出

在 SparkSQL 中,可以将 DataFrame 写出为多种格式,包括 ParquetJSONORCCSVText。每种格式有自己的特点和配置选项。下面是每种格式的详细说明、如何写出,以及常见的规则。

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')

规则和选项:

  • 模式:与其他格式一致,支持 overwriteappendignoreerror
  • 压缩:可以使用 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') 来指定压缩方式。
  • 模式:支持 overwriteappendignoreerror
  • 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') 来启用压缩。
  • 模式:与其他格式相同,支持 overwriteappendignoreerror
  • CSV 格式不带有模式(schema),需要手动指定数据类型,或者在读取时让 Spark 自动推断模式。
  • 适用于简单的数据存储和交换场景,但不适合大规模、高性能的数据分析。

5. Text 格式

Text 格式是最简单的文件格式,每行是一个字符串,没有特定的结构化数据类型。这通常用于存储单列的文本数据,比如日志文件或简单的输出。

写出 Text 格式:

df.write \
    .mode('overwrite') \
    .format('text') \
    .save('hdfs://mycluster/sparkdata/data.txt')

规则和选项:

  • 压缩:可以通过 option('compression', 'gzip') 来启用压缩。
  • 模式:支持 overwriteappendignoreerror
  • 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 等格式。常见压缩方式包括 gzipsnappybzip2 等。

每种文件格式都有其独特的优势和适用场景,您可以根据具体的数据处理需求选择合适的格式。Parquet 和 ORC 适用于大规模数据分析,JSON 和 CSV 适合轻量级的数据存储和交换,而 Text 格式适合处理简单的文本数据。