Hive External Table 排除违反数据类型的记录
Hive External Table exclude records that violate data type
我在 Hive 中有一个外部 table,它使用 serde 来处理 json 记录。偶尔会有一个与 table ddl 数据类型不匹配的值,例如table字段定义为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"}
我认为目前还没有办法在 Hive 中处理这个问题。我认为您可能需要使用 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
您可以设置 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。
我在 Hive 中有一个外部 table,它使用 serde 来处理 json 记录。偶尔会有一个与 table ddl 数据类型不匹配的值,例如table字段定义为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"}
我认为目前还没有办法在 Hive 中处理这个问题。我认为您可能需要使用 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
您可以设置 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。