首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >单元外部表排除违反数据类型的记录

单元外部表排除违反数据类型的记录
EN

Stack Overflow用户
提问于 2015-06-04 20:27:35
回答 2查看 4.1K关注 0票数 2

我在Hive中有一个外部表,它使用serde来处理json记录。偶尔会有一个与表ddl数据类型不匹配的值,例如表字段定义为int,json有一个字符串值。在查询执行期间,由于类型不匹配,Hive将正确抛出元数据异常错误:

代码语言:javascript
复制
java.lang.RuntimeException: org.apache.hadoop.hive.ql.metadata.HiveException: 
Hive Runtime Error while processing writable

是否有一种方法可以让Hive忽略那些存在数据类型冲突的记录?

注意,json是有效的语法,因此设置serde属性(例如忽略格式错误的json )是不适用的。

示例DDL:

代码语言:javascript
复制
CREATE EXTERNAL TABLE IF NOT EXISTS test_tbl (
acd         INT,
tzo         INT
 )
ROW FORMAT SERDE 'org.apache.hive.hcatalog.data.JsonSerDe'
STORED AS TEXTFILE
;
ALTER TABLE test_tbl  SET SERDEPROPERTIES ( "ignore.malformed.json" =  "true");

示例数据- TZO = alpha记录将导致错误:

代码语言:javascript
复制
{"acd":6,"tzo":4}
{"acd":6,"tzo":7}
{"acd":6,"tzo":"alpha"}
EN

回答 2

Stack Overflow用户

回答已采纳

发布于 2015-06-04 21:18:44

您可以设置Hive以容忍可配置的大量故障。

代码语言:javascript
复制
SET mapred.skip.mode.enabled = true;
SET mapred.map.max.attempts = 100; 
SET mapred.reduce.max.attempts = 100;
SET mapred.skip.map.max.skip.records = 30000;
SET mapred.skip.attempts.to.start.skipping = 1

这不是特定于蜂巢的,也可以应用于普通的MapReduce。

票数 4
EN

Stack Overflow用户

发布于 2015-06-04 21:10:40

我想还没有办法在蜂巢里处理这件事。我认为您可能需要一个中间步骤,使用MR,Pig等,以确保数据是健全的,然后从该结果输入。

这里可能有一个配置参数,您可以使用https://cwiki.apache.org/confluence/display/Hive/Configuration+Properties#ConfigurationProperties-SerDes

我认为您可能可以编写自己的异常处理程序来捕获该异常,并继续使用hive.io.exception.handlers指定自定义处理程序。

或者,如果您可以将其存储为ORC文件而不是文本文件。可以使用HiveQL语句指定ORC文件格式,如下所示:

代码语言:javascript
复制
CREATE TABLE ... STORED AS ORC
ALTER TABLE ... [PARTITION partition_spec] SET FILEFORMAT ORC

然后,在运行作业时,可以使用“跳过”设置:

代码语言:javascript
复制
set hive.exec.orc.skip.corrupt.data=true
票数 0
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/30653513

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档