Hive外部表排除违反数据类型的记录

时间:2015-06-04 20:27:36

标签: json hadoop hive

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

java.lang.RuntimeException: org.apache.hadoop.hive.ql.metadata.HiveException: 
Hive Runtime Error while processing writable

有没有办法让Hive只是忽略这些违反数据类型的记录?

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

示例DDL:

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记录将导致错误:

{"acd":6,"tzo":4}
{"acd":6,"tzo":7}
{"acd":6,"tzo":"alpha"}

2 个答案:

答案 0 :(得分:3)

您可以将Hive设置为容忍可配置的故障数量。

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

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

答案 1 :(得分:0)

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

您可以使用此处的配置参数 https://cwiki.apache.org/confluence/display/Hive/Configuration+Properties#ConfigurationProperties-SerDes

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

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

CREATE TABLE ... STORED AS ORC
ALTER TABLE ... [PARTITION partition_spec] SET FILEFORMAT ORC

然后当你运行你的工作时,你可以使用跳过设置:

set hive.exec.orc.skip.corrupt.data=true