mysql导入hive的NULL值处理方案

2019-07-02 17:21:25 浏览数 (1)

目前提供两种方法解决数据库中的字段值为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的值为其他代替值

0 人点赞