SQL 参考

格式选项

师成师成· 更新于 2026-09-28· 阅读 20 分钟· 0 次阅读

登录后可跨设备保存划线和私人笔记登录

格式选项

DataFusion 支持在执行 COPY、INSERT INTO 或 CREATE EXTERNAL TABLE 语句时,自定义数据从磁盘读取或写入磁盘的方式。选项分为几类:一些特殊选项、与文件格式(例如 CSV 或 Parquet)相关的特定选项,以及 Parquet 列级选项。在某些情况下,选项可以通过多种方式指定,并遵循一定的优先级顺序。

指定选项与优先级顺序

与格式相关的选项可以通过三种方式指定,按优先级从高到低依次为:

  • CREATE EXTERNAL TABLE 语法
  • COPY 选项元组
  • 会话级配置默认值

有关支持的会话级配置默认值列表,请参阅配置设置。这些默认值适用于所有操作,但优先级最低。

如果要创建外部表,可以在建表时使用 OPTIONS 子句指定该表特有的格式选项:

CREATE EXTERNAL TABLE
  my_table(a bigint, b bigint)
  STORED AS csv
  LOCATION '/tmp/my_csv_table/'
  OPTIONS(
    NULL_VALUE 'NAN',
    'has_header' 'true',
    'format.delimiter' ';'
  );

执行 INSERT INTO my_table ... 时,会遵循 CREATE TABLE 中的选项(例如 gzip 压缩、特殊分隔符以及包含表头行)。请注意,压缩、表头和分隔符设置也可以在 OPTIONS 元组列表中指定。SQL 语句中的专用语法始终优先于任意选项元组,因此如果两者都已指定,OPTIONS 中的设置将被忽略。

例如,针对上面定义的表,执行以下命令:

INSERT INTO my_table VALUES(1,2);

使用指定的选项生成一个新的 CSV 文件:

$ cat /tmp/my_csv_table/bmC8zWFvLMtWX68R_0.csv
a;b
1;2

最后,在执行 COPY 命令时也可以传入选项。

COPY source_table
  TO 'test/table_with_options'
  PARTITIONED BY (column3, column4)
  OPTIONS (
    format parquet,
    compression snappy,
    'compression::column1' 'zstd(5)',
  )

在本示例中,我们将整个 source_table 写入一个 Parquet 文件目录。查询的每个分区都会并行地向该目录写入一个 Parquet 文件。接下来的选项 compression 设置为 snappy,表示除非另有说明,所有列都应使用 snappy 压缩编码。选项 compression::col1 设置了一个覆盖值,使 Parquet 文件中的 col1 列使用压缩级别为 5 的 ZSTD 压缩编码。通常,支持针对特定列进行设置的 Parquet 选项可以使用语法 OPTION::COLUMN.NESTED.PATH 来指定。

可用选项

JSON 格式选项

读取或写入 JSON 文件时,可以使用以下选项。注意:如果指定了任何不受支持的选项,将会抛出错误并导致查询失败。

选项描述默认值
COMPRESSION设置应用于整个 JSON 文件的压缩方式。支持的值有 GZIP、BZIP2、XZ、ZSTD 和 UNCOMPRESSED。UNCOMPRESSED

示例:

CREATE EXTERNAL TABLE t(a int)
STORED AS JSON
LOCATION '/tmp/foo/'
OPTIONS('COMPRESSION' 'gzip');

CSV 格式选项

在读取或写入 CSV 文件时,可以使用以下选项。注意:如果指定了任何不支持的选项,系统将抛出错误,查询也会失败。

选项说明默认值
COMPRESSION设置应用于整个 CSV 文件的压缩方式。支持的取值有 GZIP、BZIP2、XZ、ZSTD 和 UNCOMPRESSED。UNCOMPRESSED
HAS_HEADER设置 CSV 文件是否应包含列标题。若未设置,则使用会话或系统默认值。None
DELIMITER设置 CSV 文件中用作列分隔符的字符。,(逗号)
QUOTE设置 CSV 文件中用于对值进行引用的字符。"(双引号)
TERMINATOR设置 CSV 文件中用作行终止符的字符。None
ESCAPE设置 CSV 文件中用于转义特殊字符的字符。None
DOUBLE_QUOTE设置引号字段内的引号是否应通过加倍来转义(例如 "aaa""bbb")。None
NEWLINES_IN_VALUES设置是否支持带引号值中的换行符。若未设置,则使用会话或系统默认值。None
DATE_FORMAT设置 CSV 文件中日期的编码格式。None
DATETIME_FORMAT设置 CSV 文件中日期时间的编码格式。None
TIMESTAMP_FORMAT设置 CSV 文件中时间戳的编码格式。None
TIMESTAMP_TZ_FORMAT设置 CSV 文件中带时区时间戳的编码格式。None
TIME_FORMAT设置 CSV 文件中时间的编码格式。None
NULL_VALUE设置 CSV 文件中用于表示空值的字符串。None
NULL_REGEX设置加载 CSV 时用于匹配空值的正则表达式模式。None
SCHEMA_INFER_MAX_REC设置用于推断模式(schema)的最大扫描记录数。若设置为 0,则禁用模式推断,所有字段都将被推断为 Utf8(字符串)类型。None
COMMENT设置 CSV 文件中用于标识注释行的字符。None

示例:

CREATE EXTERNAL TABLE t (col1 varchar, col2 int, col3 boolean)
STORED AS CSV
LOCATION '/tmp/foo/'
OPTIONS('DELIMITER' '|', 'HAS_HEADER' 'true', 'NEWLINES_IN_VALUES' 'true');

Parquet 格式选项

读取或写入 Parquet 文件时可以使用以下选项。如果指定了任何不支持的选项,系统将抛出错误并导致查询失败。如果针对不存在的列指定了特定列的选项,该选项将被忽略,不会报错。

选项是否可按列指定说明OPTIONS 键默认值
COMPRESSION是设置数据页内部的 Parquet 压缩编解码器,可选地包含压缩级别。若不带 ::col 设置则全局生效,若使用 'compression::column_name' 设置则仅对该列生效。有效值:uncompressed、snappy、gzip(level)、brotli(level)、lz4、zstd(level)、lz4_raw。'compression' 或 'compression::col'zstd(3)
ENCODING是设置数据页的编码方案。有效值:plain、plain_dictionary、rle、bit_packed、delta_binary_packed、delta_length_byte_array、delta_byte_array、rle_dictionary、byte_stream_split。在 OPTIONS 中使用键 'encoding' 或 'encoding::col'。'encoding' 或 'encoding::col'无
DICTIONARY_ENABLED是设置是否全局或对特定列启用字典编码。'dictionary_enabled' 或 'dictionary_enabled::col'true
STATISTICS_ENABLED是设置要写入的统计信息级别(none、chunk、page)。'statistics_enabled' 或 'statistics_enabled::col'page
BLOOM_FILTER_ENABLED是设置是否为特定列写入布隆过滤器。'bloom_filter_enabled::column_name'无
BLOOM_FILTER_FPP是设置布隆过滤器的误判率(全局或按列)。'bloom_filter_fpp' 或 'bloom_filter_fpp::col'无
BLOOM_FILTER_NDV是设置布隆过滤器的不同值数量(全局或按列)。'bloom_filter_ndv' 或 'bloom_filter_ndv::col'无
MAX_ROW_GROUP_SIZE否设置每个行组的最大行数。更大的行组需要更多内存,但可以提高压缩率和扫描效率。'max_row_group_size'1048576
MAX_ROW_GROUP_BYTES否设置每个行组的最大字节大小。当此项与 MAX_ROW_GROUP_SIZE 同时设置时,任一限制达到后即刷新行组。对应 parquet-mr 中的 parquet.block.size。目前仅在 allow_single_file_parallelism 为 false 时生效;默认情况下并行文件写入器会忽略该设置。'max_row_group_bytes'无
ENABLE_PAGE_INDEX否若为 true,则读取 Parquet 数据页级别的元数据(即 Page Index,如果存在),以减少 I/O 和解码开销。'enable_page_index'true
PRUNING否若为 true,则启用基于最小/最大统计信息的行组裁剪。'pruning'true
SKIP_METADATA否若为 true,则跳过文件 schema 中的可选嵌入式元数据。'skip_metadata'true
METADATA_SIZE_HINT否设置获取 Parquet 文件元数据的大小提示(以字节计)。'metadata_size_hint'无
PUSHDOWN_FILTERS否若为 true,则在 Parquet 解码期间启用过滤条件下推。'pushdown_filters'false
REORDER_FILTERS否若为 true,则在 Parquet 解码期间启用过滤器的启发式重排序。'reorder_filters'false
SCHEMA_FORCE_VIEW_TYPES否若为 true,则将 Utf8/Binary 列作为视图类型读取。'schema_force_view_types'true
BINARY_AS_STRING否若为 true,则将 Binary 列作为字符串读取。'binary_as_string'false
DATA_PAGESIZE_LIMIT否设置数据页的最大字节数(尽力而为)。'data_pagesize_limit'1048576
DATA_PAGE_ROW_COUNT_LIMIT否设置数据页的最大行数(尽力而为)。'data_page_row_count_limit'20000
DICTIONARY_PAGE_SIZE_LIMIT否设置字典页的最大大小(以字节计,尽力而为)。'dictionary_page_size_limit'1048576
WRITE_BATCH_SIZE否以行为单位设置 write_batch_size。'write_batch_size'1024
WRITER_VERSION否设置 Parquet 写入器版本(1.0 或 2.0)。'writer_version'1.0
SKIP_ARROW_METADATA否若为 true,则跳过将 Arrow schema 信息写入 Parquet 文件元数据。'skip_arrow_metadata'false
CREATED_BY否设置 Parquet 文件元数据中的“created by”字符串。'created_by'datafusion version X.Y.Z
COLUMN_INDEX_TRUNCATE_LENGTH否设置列索引中最小/最大值的截断长度(以字节计)。'column_index_truncate_length'64
STATISTICS_TRUNCATE_LENGTH否设置统计信息的截断长度。'statistics_truncate_length'无
BLOOM_FILTER_ON_WRITE否设置默认是否为所有列写入布隆过滤器(可按列覆盖)。'bloom_filter_on_write'false
ALLOW_SINGLE_FILE_PARALLELISM否启用单个文件内各列的并行序列化。'allow_single_file_parallelism'true
MAXIMUM_PARALLEL_ROW_GROUP_WRITERS否并行行组写入器的最大数量。'maximum_parallel_row_group_writers'1
MAXIMUM_BUFFERED_RECORD_BATCHES_PER_STREAM否每个流中缓冲的 record batch 的最大数量。'maximum_buffered_record_batches_per_stream'2
CONTENT_DEFINED_CHUNKING_ENABLED否在写入 Parquet 文件时启用实验性的内容定义分块(content-defined chunking)。启用后,每个输出文件将使用顺序写入器,以便分块器状态可在行组之间保持。参见 Parquet 内容定义分块。'content_defined_chunking.enabled'false
CONTENT_DEFINED_CHUNKING_MIN_CHUNK_SIZE否滚动哈希可以选择分块边界之前的最小逻辑大小(以字节计)。'content_defined_chunking.min_chunk_size'262144 (256 KiB)
CONTENT_DEFINED_CHUNKING_MAX_CHUNK_SIZE否写入器强制分块边界之前的最大逻辑大小(以字节计)。必须大于 content_defined_chunking.min_chunk_size。'content_defined_chunking.max_chunk_size'1048576 (1 MiB)
CONTENT_DEFINED_CHUNKING_NORM_LEVEL否控制分块边界选择的激进程度。较高的值可以提高去重效果,但会增加碎片。推荐范围为 -3 到 3。'content_defined_chunking.norm_level'

示例:

CREATE EXTERNAL TABLE t (id bigint, value double, category varchar)
STORED AS PARQUET
LOCATION '/tmp/parquet_data/'
OPTIONS(
  'COMPRESSION::user_id' 'snappy',
  'ENCODING::col_a' 'delta_binary_packed',
  'MAX_ROW_GROUP_SIZE' '1000000',
  'BLOOM_FILTER_ENABLED::id' 'true'
);

评论

登录后参与评论

正在加载评论…