在avro serde中创建的配置单元表的更新架构导致错误

时间:2019-04-30 14:50:02

标签: hive schema avro

我已使用以下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,所以为什么会遇到此错误?如何避免该错误?

0 个答案:

没有答案