FAVROPARSER

解析来自 Avro 文件的数据。需要满足以下要求:

  • Avro 文件必须以 Avro 二进制序列化编码格式进行编码,如 Apache Avro 标准中所述。解析器还支持 Snappy 和 deflate 压缩。

  • FAVROPARSER 不支持包含单独架构文件的 Avro 文件。Avro 文件必须包含架构。

您可以使用强类型加载 Avro 源(数组、结构或组合)中的复杂类型,或将其作为灵活的复杂类型进行加载。将灵活的复杂类型加载到 VMap 列中的操作与加载到 Flex 表中一样。要加载复杂类型作为 VMap 列,请将列类型指定为 LONG VARBINARY。要保留复杂类型的索引,请将 flatten_maps 设置为 false。

加载到 Flex 表中时,Vertica 会将所有数据加载到 __raw__ (VMap) 列中,包括数据中的复杂类型。

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

语法

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

参数

flatten_maps
布尔值,是否平展所有 Avro 映射。键名必须通过嵌套层连接起来。该值为递归值,且会影响加载中的所有数据。

此参数仅适用于 Flex 表或 VMap 列,且会在加载强类型复杂类型时被忽略。

默认值:true

flatten_arrays
布尔值,是否平展所有 Avro 数组。键名必须通过嵌套层连接起来。该值为递归值,且会影响加载中的所有数据。

此参数仅适用于 Flex 表或 VMap 列,且会在加载强类型复杂类型时被忽略。

默认值:false

flatten_records
布尔值,是否平展所有 Avro 记录。键名必须通过嵌套层连接起来。该值为递归值,且会影响加载中的所有数据。

此参数仅适用于 Flex 表或 VMap 列,且会在加载强类型复杂类型时被忽略。

默认值:true

reject_on_materialized_type_error

布尔值,是否拒绝包含无法强制转换为兼容数据类型的实体化列值的数据行。如果值为 false 且无法强制类型,则解析器将该列中的值设置为 null。

如果该列是强类型复杂类型,而不是可变复杂类型,则复杂类型中的类型不匹配将导致整个列被视为不匹配。解析器不会部分加载复杂类型。

默认值:false

基元数据类型

FAVROPARSER 支持以下基元数据类型,包括复杂类型中的元素类型和字段值。

Avro 逻辑类型

FAVROPARSER 支持以下 Avro 逻辑类型。目标列必须使用支持逻辑类型的 Vertica 数据类型。当尝试使用无效的逻辑类型加载数据时,将忽略此逻辑类型并使用基础 Avro 类型。

Avro 复杂数据类型

Avro 格式支持某些复杂数据类型。加载到强类型列时,您可以使用 ROWARRAY 类型来表示这些类型。例如,Avro Record 和 Enums 为结构 (ROW);请参阅 Avro 规范

您可以使用 ARRAY[ROW] 来匹配 Avro 映射。必须将 ROW 字段命名为 keyvalue。这些是 Avro 格式用于数据中的字段的名称,解析器通过字段名称将数据与表列进行匹配。

当加载到 Flex 表或使用灵活的复杂类型时,此解析器会按如下方式处理 Avro 复杂类型:

Record

各字段的名称被用作虚拟列名称。如果 flatten_records 为 true,且存在几个嵌套级别,Vertica 将连接 record 名称以创建键名。

Map

每个 map 键的值被用作虚拟列名称。如果 flatten_maps 为 true,且存在几个嵌套级别,Vertica 将连接所有键名以创建键名。

Enum

Vertica 将 Avro Enum 视为 record,将 Enum 的名称作为键,将其值作为值。

Array

Vertica 将 Avro Array 视为键/值对。默认情况下,每个元素的索引作为键。在以下示例中,product_detail 是一个包含字段 product_category 的 Record,即一个 Array:

=> CREATE FLEX TABLE products;
CREATE TABLE

=> COPY products FROM :datafile WITH PARSER FAVROPARSER();
 Rows Loaded
-------------
           2
(1 row)

=> SELECT MAPTOSTRING(__raw__) FROM products ORDER BY __identity__;
                    maptostring
--------------------------------------------------------------------------------
 {
    "__name__": "Order",
    "customer_id": "111222",
    "order_details": {
        "0.__name__": "OrderDetail",
        "0.product_detail.__name__": "Product",
        "0.product_detail.price": "46.21",
        "0.product_detail.product_category": {
            "0": "electronics",
            "1": "printers",
            "2": "computers"
        },
        "0.product_detail.product_description": "hp printer X11ew description :\
P",
        "0.product_detail.product_hash": "\u0000\u0001\u0002\u0003\u0004",
        "0.product_detail.product_id": "999012",
        "0.product_detail.product_map.one": "1.1",
        "0.product_detail.product_map.two": "1.1",
        "0.product_detail.product_name": "hp printer X11ew",
        "0.product_detail.product_status": "ONLY_FEW_LEFT",
        "0.quantity": "3",
        "0.total": "354.34"
    },
    "order_id": "2389646",
    "total": "132.43"
}
...

如果 flatten_arrays 为 true,且存在几个嵌套级别,Vertica 将连接索引以创建键名。

=> COPY products FROM :datafile WITH PARSER FAVROPARSER(flatten_arrays=true);
 Rows Loaded
-------------
           2
(1 row)

=> SELECT MAPTOSTRING(__raw__) FROM products ORDER BY __identity__;
                    maptostring
--------------------------------------------------------------------------------

 {
    "__name__": "Order",
    "customer_id": "111222",
    "order_details.0.__name__": "OrderDetail",
    "order_details.0.product_detail.__name__": "Product",
    "order_details.0.product_detail.price": "46.21",
    "order_details.0.product_detail.product_category.0": "electronics",
    "order_details.0.product_detail.product_category.1": "printers",
    "order_details.0.product_detail.product_category.2": "computers",
    "order_details.0.product_detail.product_description": "hp printer X11ew des\
cription :P",
    "order_details.0.product_detail.product_hash": "\u0000\u0001\u0002\u0003\u0\
004",
    "order_details.0.product_detail.product_id": "999012",
    "order_details.0.product_detail.product_map.one": "1.1",
    "order_details.0.product_detail.product_map.two": "1.1",
    "order_details.0.product_detail.product_name": "hp printer X11ew",
    "order_details.0.product_detail.product_status": "ONLY_FEW_LEFT",
    "order_details.0.quantity": "3",
    "order_details.0.total": "354.34",
    "order_id": "2389646",
    "total": "132.43"
}
...

Union

Vertica 将 Avro Union 视为 Array。

示例

此示例演示了如何使用 favroparser 创建 Flex 表并将 Avro 数据加载到其中。加载数据后,您可以查询虚拟列:

=> CREATE FLEX TABLE avro_basic();
CREATE TABLE

=> COPY avro_basic FROM '/home/dbadmin/data/weather.avro' PARSER FAVROPARSER();
Rows Loaded
-------------
5
(1 row)

=> SELECT station, temp, time FROM avro_basic;
station | temp |     time
---------+------+---------------
mohali  | 0    | -619524000000
lucknow | 22   | -619506000000
norwich | -11  | -619484400000
ams     | 111  | -655531200000
baddi   | 78   | -655509600000
(5 rows)

有关详细信息,请参阅Avro 数据