基于内置Schema的Avro文件创建Hive外部表报错求助
解决Hive Avro外部表创建报错的问题
嘿,我来帮你搞定这个报错的问题!先看看你给出的建表语句,首先就有个很明显的语法小错误,然后再说说适配Avro内置Schema的正确写法:
1. 先修复基础语法问题
你写的语句里,LOCATION路径的单引号没闭合哦!原语句最后是'hdfs:///user/hive/;,少了一个收尾的单引号,这直接导致SQL解析失败。另外表名sampe_table应该是sample_table吧?虽然这不是报错的直接原因,但也顺手改了避免后续麻烦,修正后的基础语句是:
CREATE EXTERNAL TABLE sample_table STORED AS AVRO LOCATION 'hdfs:///user/hive/';
2. 适配Avro内置Schema的正确姿势
如果你的Avro文件本身就内置了Schema,仅仅用STORED AS AVRO有时候可能不足以让Hive正确识别文件里的Schema。更稳妥的写法是明确指定Avro对应的SerDe和输入输出格式,让Hive自动读取文件里的内置Schema来生成表结构:
CREATE EXTERNAL TABLE sample_table ROW FORMAT SERDE 'org.apache.hadoop.hive.serde2.avro.AvroSerDe' STORED AS INPUTFORMAT 'org.apache.hadoop.hive.ql.io.avro.AvroContainerInputFormat' OUTPUTFORMAT 'org.apache.hadoop.hive.ql.io.avro.AvroContainerOutputFormat' LOCATION 'hdfs:///user/hive/';
3. 额外要注意的几个点
- 确保你的Hive环境已经集成了Avro相关的依赖包(比如
hive-avro的jar包),像CDH、HDP这类发行版通常默认就有,但如果是自己搭的环境,可能得手动加一下依赖。 - 检查HDFS路径
hdfs:///user/hive/是不是真的存在,而且Hive用户有读取这个路径的权限,权限不够也会导致DDL执行失败。 - 如果你的Avro Schema特别复杂,或者Hive版本比较老,实在没法自动读取内置Schema,也可以手动在表属性里指定Schema,比如:
CREATE EXTERNAL TABLE sample_table ROW FORMAT SERDE 'org.apache.hadoop.hive.serde2.avro.AvroSerDe' STORED AS INPUTFORMAT 'org.apache.hadoop.hive.ql.io.avro.AvroContainerInputFormat' OUTPUTFORMAT 'org.apache.hadoop.hive.ql.io.avro.AvroContainerOutputFormat' LOCATION 'hdfs:///user/hive/' TBLPROPERTIES ('avro.schema.literal' = '{ "type": "record", "name": "SampleRecord", "fields": [ {"name": "id", "type": "int"}, {"name": "name", "type": "string"} ] }');
不过如果文件本身已经带了Schema,这一步其实没必要哈。
内容的提问来源于stack exchange,提问作者Kareem
相关产品推荐
相关产品推荐

