我有这个(缩短的)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创建的。
1条答案
按热度按时间isr3a4wc1#
原因是,正如问题的最后一行所说:
我实际使用的数据是由confluent创建的。
结果是在hdfs接收器的输出上,
ENUM
s转换为String
s。当我在配置单元中基于原始模式创建外部表时,出现了一个差异。现在,如果我只是从hdfs接收器创建的文件中提取模式,并在表定义中使用这个模式,那么一切都会正常工作。