格式选项
格式选项
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'
);评论
登录后参与评论
KnowForge