解决dataX导入hive时null值变成空字符串的问题

问题

因业务需求,需要每日定时将业务数据库mysql中的表数据导入hive(当备份用)但是导入完成后发现,mysql中为null的值在hive中全部变成了空字符串如下所示:

  • mysql中
  • 使用datax导入hdfs后映射到hive上后显示的(原本的null值变成了空字符串)

原因

  • 默认情况下,在datax中HFDS Writer会将null值存储为空字符串=> '',而Hive默认的null值存储格式为\N。所以后期将DataX同步的文件导入Hive表就会出现问题,hive会认为这个空字符串就是一个单纯的字符串而不是null值

解决

  • 最简单的方法就是在建表时设置hive表的null值格式
  • CREATE TABLE daily_test.test_info
    (
        id           INT,
        tag_name     STRING,
        tag_group_id INT
    ) COMMENT '测试表'
        ROW FORMAT DELIMITED FIELDS TERMINATED BY '\t'
        null defined as '';  # 此处设置null值存储格式为空字符串

  • 然后问题就来了,我的hive版本是3.12,按照上述设置后发现没有用,依旧还是显示为空字符串,(****!),后来耐下心看了一下表的元数据

  • 最后一番捣鼓发现只通过null defined as '' 好像不行,也不知道咋回事只能当成版本的bug了,经过不断试错发现需要再设置:tblproperties ('serialization.null.format' = '')才行

    • CREATE TABLE daily_test.test_info2
      (
          id           INT,
          tag_name     STRING,
          tag_group_id INT
      ) COMMENT '测试表2'
          ROW FORMAT DELIMITED FIELDS TERMINATED BY '\t'
          null defined as ''
          tblproperties ('serialization.null.format' = ''); # 需要再次设置

  • 再次查看表结构

最后将上述方法应用到正式表后问题完美解决!!

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值