问题
因业务需求,需要每日定时将业务数据库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' = ''); # 需要再次设置
-
-
再次查看表结构
最后将上述方法应用到正式表后问题完美解决!!