Parquet 数据
Parquet 是一种面向列的文件格式。Vertica 拥有一个可以利用列式布局的解析器。
在 COPY 语句中,请按如下所示指定解析器。请注意,这不是通常的 PARSER parser-name 语法;COPY 直接支持 Parquet:
=> COPY tableName FROM path PARQUET[(...)];
该解析器会使用多个可选参数;请参阅 PARQUET 参考页面。
请注意,如果您在同一个 COPY 语句中从多个文件加载数据,而其中任何一个加载被中止,那么整个加载都会中止。这种行为与分隔文件的行为不同,分隔文件中的 COPY 语句会加载其可以加载的数据并忽略剩余数据。
架构匹配
默认情况下,Parquet 解析器使用强架构匹配。这意味着加载必须按照列在数据中出现的顺序来使用 Parquet 数据中的所有列。但是,您可以改为使用弱架构匹配,以便选择所需的列而忽略剩余列。弱架构匹配取决于数据中列的名称而非其顺序,因此表中的列名称必须与数据中的列名称匹配。类型必须匹配或可进行强制设置。有关如何使用宽泛的架构匹配的详细信息,请参阅 PARQUET 参考页面上的弱架构匹配。
您可以对基元类型的列和基元类型的一维数组使用弱架构匹配。对于其他复杂类型,请改用可变复杂类型。请参阅可变复杂类型。
使用 do_soft_schema_match_by_name
参数指定弱架构匹配。在以下示例中,Parquet 数据包含的列多于表中使用的列。
=> CREATE EXTERNAL TABLE restaurants(name VARCHAR, cuisine VARCHAR)
AS COPY FROM '/data/rest*.parquet'
PARQUET(do_soft_schema_match_by_name='True');
=> SELECT * from restaurant;
name | cuisine
-------------------+----------
Bob's pizzeria | Italian
Bakersfield Tacos | Mexican
(2 rows)
元数据缓存
Parquet 文件包含 Vertica 在加载数据时使用的元数据。为避免重复获提取此数据,尤其是从远程源或 API 调用会产生财务成本的情况下,Vertica 会在计划阶段将此元数据缓存在每个参与节点上,以供在执行阶段使用。
仅当 TEMP 存储位于本地文件系统上时,Vertica 才会将 TEMP 存储用于缓存。
您可以通过设置 ParquetMetadataCacheSizeMB 配置参数来限制缓存的大小。默认值为 4GB。
支持的数据类型
Vertica 可以本机读取所有 Hive 原始数据类型的列。有关完整列表,请参阅 HIVE 数据类型(特别是数字、日期/时间、字符串和其他列表)。Vertica 还可以加载 UUID 和 复杂类型(任意组合的数组和结构)。
您为 COPY 或 CREATE EXTERNAL TABLE AS COPY 指定的数据类型必须与数据中的类型完全匹配,但 Vertica 允许在兼容的数字类型之间进行隐式转换。
仅对于 Parquet 格式,您可以使用可变复杂类型,而不是完全指定复杂类型的架构。请参阅可变复杂类型。
时间戳和时区
要正确报告时间戳,Vertica 必须知道将数据写入的时区。Hive 不会记录写入者所在的时区。Vertica 假设时间戳值是在本地时区写入的,并在查询时报告警告。
在写入 Parquet 文件时,Hive 提供了用于在本地时区中记录时间戳的选项。如果您使用以这种方式记录时间的 Parquet 文件,请将 UseLocalTzForParquetTimestampConversion 配置参数设置为 0 以禁用由 Vertica 完成的转换。(请参阅常规参数。)