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 支持以下基元数据类型,包括复杂类型中的元素类型和字段值。
注意
Vertica 不具有显式 4 字节(32 位整数)或较小类型。相反,Vertica 编码和压缩可自动降低需要小于 64 位的值的存储开销。Avro 逻辑类型
FAVROPARSER 支持以下 Avro 逻辑类型。目标列必须使用支持逻辑类型的 Vertica 数据类型。当尝试使用无效的逻辑类型加载数据时,将忽略此逻辑类型并使用基础 Avro 类型。
Avro 复杂数据类型
Avro 格式支持某些复杂数据类型。加载到强类型列时,您可以使用 ROW 和 ARRAY 类型来表示这些类型。例如,Avro Record 和 Enums 为结构 (ROW);请参阅 Avro 规范。
您可以使用 ARRAY[ROW] 来匹配 Avro 映射。必须将 ROW 字段命名为 key
和 value
。这些是 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 数据。