我已使用以下create命令在Hive的avro serde中创建了一个表
CREATE EXTERNAL TABLE IF NOT EXISTS mydb.mytable(
personid string,
name string,
batch string,
sex string
)
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
'/data/gaurav/test/mytable'
TBLPROPERTIES ('avro.schema.url'='/data/gaurav/schema/mytable.avsc');
下面是模式
{
"namespace": "mydb",
"name": "mytable",
"type": "record",
"fields": [
{ "name":"personId", "type":["null","string"], "default": "null" },
{ "name":"name", "type":["null","string"], "default": "null" },
{ "name":"batch", "type":["null","string"], "default": "null" },
{ "name":"sex", "type":["null","string"], "default": "null" }
]
}
我想在mytable中添加两个字段,因此我更新了avro.schema.url以指向具有这两个额外字段的新架构文件。以下是我用于更新架构的命令。
alter table mytable set tblproperties('avro.schema.url'='/data/gaurav/schema/mytable_new.schema')
这是新的架构
{
"namespace": "mydb",
"name": "mytable",
"type": "record",
"fields": [
{ "name":"personId", "type":["null","string"], "default": "null" },
{ "name":"name", "type":["null","string"], "default": "null" },
{ "name":"batch", "type":["null","string"], "default": "null" },
{ "name":"sex", "type":["null","string"], "default": "null" },
{ "name":"fname", "type":["null","string"], "default": "null" },
{ "name":"mname", "type":["null","string"], "default": "null" }
]
}
到目前为止很好。当我描述mytable时,我可以查看我的新字段,但是当我在表上触发select count(*)
查询时,它会错误显示为
错误:处理语句时出错:失败:执行错误, 从org.apache.hadoop.hive.ql.exec.mr.MapRedTask返回代码2 (状态= 08S01,代码= 2)。当我检查此任务的日志时,我发现了 引起原因:org.apache.avro.AvroTypeException:非空默认值 对于null类型:“ null”。
在创建架构时,我已经明确提到默认值为null,所以为什么会遇到此错误?如何避免该错误?