Avro 数据

使用 FAVROPARSER 可加载 Avro 数据文件。此解析器支持列式表和 Flex 表。

列可以是任何标量类型、强类型复杂类型可变复杂类型。可变复杂类型意味着您没有完全指定该列的架构。您将表中的这些列定义为 LONG VARBINARY,并且可以使用 Flex 函数从中提取值。

需要满足以下要求:

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

  • Avro 文件必须在正在加载的文件中包含其相关架构;FAVROPARSER 不支持具有单独架构文件的 Avro 文件。

在 COPY 语句中,使用 PARSER 参数可指定 Avro 解析器,如下例所示:

=> COPY weather FROM '/home/dbadmin/data/weather.avro' PARSER FAVROPARSER()

此解析器有几个可选参数,其中一些专门用于 Flex 表和可变复杂类型。

Avro 架构和列式表

Avro 将架构包含在数据中。将 Avro 数据加载到列式表中时,数据中架构中的列名称必须与表中的列名称匹配。您不需要加载数据中的所有列。

例如,以下 Avro 架构使用 Avro 记录类型来表示用户配置文件:

{
  "type": "record",
  "name": "Profile",
  "fields" : [
      {"name": "UserName", "type": "string"},
      {"name": "Email", "type": "string"},
      {"name": "Address", "type": "string"}
   ]
}

要使用此架构成功地将数据加载到列式表中,每个目标列名称必须与架构中的“名称”值匹配。在以下示例中,profiles 表不会加载与架构的 Email 字段对应的值,因为目标列名为 EmailAddr

=> COPY profiles FROM '/home/dbadmin/data/user_profile.avro' PARSER FAVROPARSER();

=> SELECT * FROM profiles;
     UserName    |     EmailAddr      |       Address
-----------------+--------------------+---------------------
    dbadmin      |                    |    123 Main St.

强类型复杂类型

Avro 数据可以包含数组、结构和两者的组合。可以将这些数据作为可变 (VMap) 列或强类型来读取。强类型允许您直接查询值,而无需使用函数来解压 VMap 列。

像往常一样,在表定义中使用 ARRAYROW 类型:

=> CREATE EXTERNAL TABLE rest
  (name VARCHAR, cuisine VARCHAR,
   location_city ARRAY[VARCHAR(80)],
   menu ARRAY[ ROW(item VARCHAR(80), price FLOAT) ]
  )
AS COPY FROM :avro_file PARSER FAVROPARSER();

您可以在外部表和原生表中使用强类型。

可变复杂类型可以替代复杂类型的强类型。

拒绝包含实体化列类型错误的数据

默认情况下,如果 FAVROPARSER 无法将数据值强制转换为与列定义匹配的类型,它会将值设置为 NULL。您可以选择使用 reject_on_materialized_type_error 参数来拒绝这些值。如果此参数为 true,则 COPY 拒绝此类行并报告错误。

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

如果 Flex 表具有实体化列,则加载的数据必须强制转换为该列的类型。例如,如果实体化列声明为 FLOAT 而您尝试为该键加载 VARCHAR 值,则 FAVROPARSER 拒绝该数据行。

另请参阅