目前提供两种方法解决数据库中的字段值为NULl导入到HIVE中后变成空字符串的方法,使用以下方法可以保障在mysql中存储的是NULL,导入到HIVE表后也是NULL
第一种
解决方法: 直接修改hive表的属性,让hive表中为空的值显示为NULL
alter table ${table_name} SET SERDEPROPERTIES('serialization.null.format' = '');
${table_name}填写你实际的hive表名
使用限制: 若原始数据中有本身为空的值在HIVE表中也会显示为NULL。根据HIVE的设计原理,这是不可避免的情况,在HIVE中必须要指定一种方式来表示NULL值,若空值需要存储,则根据情况修改为其他的存储格式
第二种
PS:此方法依赖sqoop工具,若用户是在TBDS中使用则需要按照如下文档部署sqoop组件。https://cloud.tencent.com/developer/article/1454899
解决方法: 通过开源工具sqoop在后台服务器上进行导入
①部署完sqoop客户端
②修改HIVE表的属性
alter table ${table_name} SET SERDEPROPERTIES('serialization.null.format' = 'N');
③执行sqoop导入命令
代码语言:javascript复制sqoop import
--connect "jdbc:mysql://x.x.x.x:3306/easytest"
--username xxx
--password xxx
--table xxx
--null-string 'N'
--null-non-string 'N'
--hive-import
-m 1
--hive-database easytest1
--hive-table test1
--target-dir /tmp/easytest/test1
注:--target-dir目录不能已经存在,否则会报错
--null-string <null-string>如果指定列为字符串类型,使用指定字符串替换值为null的该类列的值
--null-non-string <null-string>如果指定列为非字符串类型,使用指定字符串替换值为null的该类列的值
使用限制:导入的hive目标表需要提前建好,sqoop的方式是设定了'N'来表示NULL值,若本身源数据中存了'N',则不能使用"N"来代替NULL,需要修改--null-string,--null-non-string,以及serialization.null.format的值为其他代替值