【问题标题】:Hive External Table exclude records that violate data typeHive 外部表排除违反数据类型的记录
【发布时间】:2015-08-19 15:15:24
【问题描述】:

我在 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"}

【问题讨论】:

    标签: json hadoop hive


    【解决方案1】:

    我认为在 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
    

    【讨论】:

      【解决方案2】:

      您可以设置 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。

      【讨论】:

      • 在将数据从一个配置单元表插入另一个表时,我仍然遇到问题。我正在尝试使用此查询将数据(超过 3 亿行)从 hive 表复制到 Elasticsearch:- insert overwrite table TableNameES select * from HiveTableName; & 插入一些行后,我得到了这个异常。我知道这是因为 ES 中映射的数据类型不同......我想跳过插入那些给出错误的行,不仅这个异常可能是其他异常。
      猜你喜欢
      • 2017-04-07
      • 2021-04-15
      • 1970-01-01
      • 2018-05-18
      • 2018-08-30
      • 1970-01-01
      • 2016-02-16
      • 2019-12-04
      • 2022-01-15
      相关资源
      最近更新 更多