配置单元中带有枚举的avro

kadbb459  于 2021-06-26  发布在  Hive
关注(0)|答案(1)|浏览(488)

我有这个(缩短的)avro模式:

{
  "type": "record",
  "name": "license_upsert",
  "namespace": "data.model",
  "fields": [
    { "name": "upsert", "type":
      {
        "name":    "EventType",
        "type":    "enum",
        "symbols": ["INSERT", "UPDATE"]
      }
    }
  ]
}

它刚刚定义了一个枚举。
我可以轻松地从一些json数据创建avro文件:

{
  "upsert": "INSERT"
}

使用avro工具,无论是从avro到avro,都可以正常工作。
现在,这些avro文件被加载到hive的一个外部表中,然后boom,hive告诉我:
java.io.ioexception:org.apache.avro.avrotypeexception:找到字符串,应为data.model.eventtype
根据文档,hive实际上不支持enum,但是如果我 DESCRIBE 在表中,字段被视为字符串:

col_name | data_type | comment
-------------------------------
upsert   |   string  |    ""

我有没有办法告诉hive它应该使用字符串?即使我运行的查询没有选择upsert字段,我也会得到相同的错误。

注1:

我创建表如下:

CREATE EXTERNAL TABLE IF NOT EXISTS events.event
PARTITIONED BY (year INT, month INT, day INT, hour INT)
ROW FORMAT SERDE 'org.apache.hadoop.hive.serde2.avro.AvroSerDe'
WITH SERDEPROPERTIES (
  'avro.schema.url'='file:///path/to/event.avsc'
)
STORED AS AVRO
LOCATION '/events/event'
;

注2:

如果我从avro工具生成数据( random 命令)数据完全加载到配置单元中。
我实际使用的数据是由confluent创建的。

isr3a4wc

isr3a4wc1#

原因是,正如问题的最后一行所说:
我实际使用的数据是由confluent创建的。
结果是在hdfs接收器的输出上, ENUM s转换为 String s。当我在配置单元中基于原始模式创建外部表时,出现了一个差异。现在,如果我只是从hdfs接收器创建的文件中提取模式,并在表定义中使用这个模式,那么一切都会正常工作。

相关问题