sqoop导出hive数据到mysql避免空值

Posted hulifang

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了sqoop导出hive数据到mysql避免空值相关的知识,希望对你有一定的参考价值。

sqoop导入导出问题

sqoop export --connect jdbc:mysql://ip:3306/eqpt_base_db?characterEncoding=utf8 --username root --password secret_password --table A_JQZ_T_GAS_GET_ORDER_NUM_INFO_S  --export-dir  /user/hive/warehouse/origin_ennenergy_energytrade.db/a_jqz_t_gas_get_order_num_info_s  --input-null-string ‘\N‘ --input-null-non-string ‘\N‘ --fields-terminated-by ‘ ‘

为了避免空值时,没有数据,需要以下命令:

--input-null-string ‘\N‘ --input-null-non-string ‘\N‘ --fields-terminated-by ‘ ‘

 

 

由sqoop导入失败发现的hive的空值问题

先说基础知识
hive中空值分两种
(1)NULL
hive中null实际在HDFS中默认存储为‘N‘,通过查询显示的是‘NULL‘。

这时如果查询为空值的字段可通过语句:aaa is null 或者 aaa =‘N‘ 实现。
此时可用hive中与null有关的函数,如nvl,coalesce,is null等判断是否为null是为true。

产生NULL值,一般都是由hive外链接引起的。

(2)‘‘
‘‘ 表示的是字段不为null且为空字符串,此时用 aaa is null 是无法查询这种值的,必须通过 aaa ==‘‘ 或者 length(aaa)=0 查询

产生‘‘值,一般都是源数据为空。

之前项目中用到sqoop工具从HDFS中往数据库中导数据时,任务失败。不得已,用二分法导数据,去排查问题,看看是哪一条数据导致任务报错。最后排查到数据文件中有字段的值为空。但是奇怪的是,在hive sql里面已经加为null判断了。再看数据文件,发现其中的值不是通常的NULL,或者是N,而是‘‘。

所以得到原因,用判断null的nvl函数并不能排除‘‘的情况,需要用IF(aaa == ‘‘,‘未知‘,aaa) AS aaa 来判断。

 
 

以上是关于sqoop导出hive数据到mysql避免空值的主要内容,如果未能解决你的问题,请参考以下文章

Sqoop hive导出到mysql[转]

使用Hive表名将Sqoop导出hive表导出到RDBMS

有多个'。 sqoop 将数据从 Mysql 导出到 hive datetime 类型后的 0'

利用sqoop将hive数据导入导出数据到mysql

使用Sqoop把ADS层数据导出到MySQL

Sqoop导出Hive数据到Mysql时异常问题解决