目前提供两种方法解决数据库中的字段值为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值,若空值需要存储,则根据情况修改为其他的存储格式
第二种
解决方法: 通过开源工具sqoop在后台服务器上进行导入
①部署完sqoop客户端
②修改HIVE表的属性
alter table ${table_name} SET SERDEPROPERTIES('serialization.null.format' = '\N');
③执行sqoop导入命令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的该类列的值 --null-non-string 如果指定列为非字符串类型,使用指定字符串替换值为null的该类列的值
使用限制:导入的hive目标表需要提前建好,sqoop的方式是设定了'\N'来表示NULL值,若本身源数据中存了'\N',则不能使用"\N"来代替NULL,需要修改--null-string,--null-non-string,以及serialization.null.format的值为其他代替值