PARQUET

使用包含 COPY 语句的 PARQUET 解析器以 Parquet 格式加载数据。将数据加载到 Vertica 时,可读取所有基元类型、UUID 和复杂类型

默认情况下,Parquet 解析器使用强架构匹配,这意味着数据中的列必须与使用数据的表中的列完全匹配。您可以选择使用弱架构匹配

加载 Parquet 数据时,Vertica 会缓存 Parquet 元数据以提升效率。此缓存使用本地 TEMP 存储,如果 TEMP 为远程存储,则不使用。请参阅 ParquetMetadataCacheSizeMB 配置参数来更改缓存的大小。

此解析器不支持分摊加载或协作解析

语法

PARQUET ( [ parameter=value[,...] ] )

参数

所有参数均为可选参数。

hive_partition_cols
以逗号分隔的列列表,这些列是数据中的分区列。
allow_no_match
Boolean。是否接受包含的 glob 没有匹配文件的路径并在查询结果中报告 0 行。如果未设置此参数,当 FROM 子句中的路径与至少一个文件不匹配时,Vertica 将返回错误。
allow_long_varbinary_match_complex_type
Boolean。是否启用灵活的列类型(请参阅可变复杂类型)。如果为 true,Parquet 解析器将允许数据中的复杂类型与定义为 LONG VARBINARY 的表列匹配。如果为 false,Parquet 解析器将需要使用复杂类型的强类型。对于参数集,仍然可以使用强类型。如果您希望将使用灵活的列视为错误,请将此参数设置为 false。
do_soft_schema_match_by_name
Boolean。是否启用弱架构匹配 (true),而不是使用基于表定义和 parquet 文件中的列顺序的严格匹配(false,默认值)。有关详细信息,请参阅弱架构匹配
reject_on_materialized_type_error
布尔值,仅在 do_soft_schema_match_by_name 为 true 时适用。指定在使用弱架构匹配且无法将值从数据强制转换为目标列类型时要执行的操作。值为 true(默认值)表示拒绝行;值为 false 表示使用 NULL 作为值,或者截断(对于过长的字符串)。有关强制转换类型映射,请参阅类型强制转换表

弱架构匹配

默认情况下,Parquet 解析器使用强架构匹配。这意味着必须按照与数据中相同的顺序加载 Parquet 数据中的所有列。但是,有时您只想提取某些列,或者您希望能够适应未来 Parquet 架构中的一些更改。

使用 do_soft_schema_match_by_name 参数启用弱架构匹配。此设置具有以下影响:

  • 数据中的列通过名称与表中的列匹配。名称必须完全匹配,但不区分大小写。

  • 在 Parquet 数据中存在但不属于表定义的列将被忽略。

  • 在表定义中存在但不属于 Parquet 数据的列将用 NULL 填充。解析器在 QUERY_EVENTS 中记录 UNMATCHED_TABLE_COLUMNS_PARQUETPARSER 事件。

  • 如果 Parquet 数据中存在多个不区分大小写的相同列名,解析器将使用最后一个。(当使用通过区分大小写的工具写入的数据时,可能会出现这种情况。)

  • 列类型不需要完全匹配,只要可以将 Parquet 文件中的数据类型强制转换为表使用的类型即可。如果无法强制转换某个类型,解析器会在 QUERY_EVENTS 中记录 TYPE_MISMATCH_COLUMNS_PARQUETPARSER 事件。如果 reject_on_materialized_type_error 为 true,解析器将拒绝行。如果为 false,解析器将使用 NULL,或者对于过长的字符串值,将截断该值。

  • 可以定义但不能查询使用复杂类型(基元类型的一维数组除外)的列。

数据类型

Parquet 解析器将 Parquet 数据类型映射到 Vertica 数据类型,如下所示。

以下逻辑类型不受支持:

  • EnumLogicalType
  • IntervalLogicalType
  • JSONLogicalType
  • BSONLogicalType
  • UnknownLogicalType

Parquet 解析器支持以下物理类型的映射:

类型强制转换和弱架构匹配支持以下映射。

Vertica 仅支持 3 级编码的数组,不支持 2 级编码的数组。

示例

PARQUET 子句不使用 PARSER 选项:

=> COPY sales FROM 's3://DataLake/sales.parquet' PARQUET;

在以下示例中,数据目录不包含文件:

=> CREATE EXTERNAL TABLE customers (...)
    AS COPY FROM 'webhdfs:///data/*.parquet' PARQUET;
=> SELECT COUNT(*) FROM customers;
ERROR 7869: No files match when expanding glob: [webhdfs:///data/*.parquet]

要读取零行而不是生成错误,请使用 allow_no_match 参数:

=> CREATE EXTERNAL TABLE customers (...)
    AS COPY FROM 'webhdfs:///data/*.parquet'
       PARQUET(allow_no_match='true');
=> SELECT COUNT(*) FROM customers;
 count
-------
     0
(1 row)

要允许将复杂类型(在此示例中为菜单)作为灵活的列类型进行读取,请使用 allow_long_varbinary_match_complex_type 参数:

=> CREATE EXTERNAL TABLE restaurants
    (name VARCHAR, cuisine VARCHAR, location_city ARRAY[VARCHAR], menu LONG VARBINARY)
    AS COPY FROM '/data/rest*.parquet'
    PARQUET(allow_long_varbinary_match_complex_type='True');

要仅读取餐厅数据中的某些列,请使用弱架构匹配:

=> CREATE EXTERNAL TABLE restaurants(name VARCHAR, cuisine VARCHAR)
    AS COPY FROM '/data/rest*.parquet'
    PARQUET(allow_long_varbinary_match_complex_type='True',
            do_soft_schema_match_by_name='True');

=> SELECT * from restaurant;
       name        | cuisine
-------------------+----------
 Bob's pizzeria    | Italian
 Bakersfield Tacos | Mexican
(2 rows)