1. 首页
  2. 大数据
  3. Sqoop教程

【Sqoop教程】(四)Sqoop import详解之RDBMS数据导入HIVE

本文讲解如何将RDBMS中的数据导入到HIVE表中,命令较为简单,不过需要注意空值的处理。

首先,既然都是import,显然上篇(教程三)的命令参数绝大部分也适合本篇文章。只不过导入到hive多了一些HIVE固定的参数。

HIVE参数概览

Hive arguments:
   --create-hive-table                         导入的时候创建hive表
   --hive-database <database-name>             指定hive的database
   --hive-drop-import-delims                   原表字段中可能含有\n\r等一些特殊字符 将其drop掉
   --hive-delims-replacement <arg>             替换掉那些特殊字符
   --hive-home <dir>                           覆盖$HIVE_HOME
   --hive-import                               导入表到hive中
   --hive-overwrite                            如果hive中表已经存在就覆盖
   --hive-partition-key <partition-key>        指定partition的key
   --hive-partition-value <partition-value>    指定partition的value
   --hive-table <table-name>                   指定hive的table

案例1:Mysql导入到HIVE

[root@master bin]# ./sqoop import --connect jdbc:mysql://master:3306/weblog \
--username root --password 123456 --table stu \
--hive-import \
--hive-database default --hive-table stu \
-m 1

现在去查询HIVE表会发现已经导入了Mysql的数据!

案例2:导入时覆盖原有数据

案例1中,原来hive的stu表已经存在的数据,是不会被覆盖的。即假设hive的Stu表原来有5条数据,现在导入5条,一共是10条。可是如果使用overwrite那么只会有5条。

[root@master bin]# ./sqoop import --connect jdbc:mysql://master:3306/weblog \
--username root --password 123456 --table stu \
--hive-import \
--hive-database default --hive-table stu \
--hive-overwrite \
-m 1

案例3:hive空值处理

注意:sqoop会自动把NULL转换为null处理,但是hive中默认是把\N来表示null,所以是不会生效的。

mysql> select * from stu where name is null;
+------+------+---------------------+
| id   | name | last_mod            |
+------+------+---------------------+
|    8 | NULL | 2018-05-05 10:16:59 |
+------+------+---------------------+
./sqoop import --connect jdbc:mysql://master:3306/weblog --username root --password 123456 --table stu --hive-import --hive-database default --hive-table stu  -m 1 --hive-overwrite
hive (default)> select * from stu where name is null;
OK
stu.id  stu.name
Time taken: 0.109 seconds

可以看到,mysql中明明有null的值,我们导入后去hive中查,竟然是没有的。那么使用–null-string 和 –null-non-string来处理空值。

[root@master bin]# ./sqoop import --connect jdbc:mysql://master:3306/weblog \
--username root --password 123456 --table stu \
--hive-import \
--hive-database default --hive-table stu \
-m 1 \
--hive-overwrite \
--null-string '\\N' \
--null-non-string '\\N'

–null-string含义是 string类型的字段,当Value是NULL,替换成指定的字符,该例子中为\N。–null-non-string 含义是非string类型的字段,当Value是NULL,替换成指定字符,该例子中为\N

hive (default)> select * from stu where name is null;
OK
stu.id  stu.name
8   NULL
Time taken: 0.121 seconds, Fetched: 1 row(s)

现在就能查到空值了。

案例四:指定分区

查看到HIVE表中,stu_partition表是有分区的。

hive (default)> describe stu_partition;
col_name    data_type   comment
id                      int                                         
name                    varchar(20)                                 
sex                     string                                       
# Partition Information      
# col_name              data_type               comment             
sex                     string                              

导入时指定分区用–hive-partition-key|value

[root@master bin]# ./sqoop import --connect jdbc:mysql://master:3306/weblog \
--username root --password 123456 --table stu \
--hive-import --hive-database default --hive-table stu_partition \
-m 1 \
--null-string '\\N' \
--null-non-string '\\N' \
--hive-partition-key sex \
--hive-partition-value M
hive (default)> select * from  stu_partition;
OK
stu_partition.id    stu_partition.name  stu_partition.sex
1   test    M
2   te  M
3   lyl M
4   lyl M
5   lyl M
6   lyl M
7   lyl M
8   NULL    M

BDStar原创文章。发布者:Liuyanling,转载请注明出处:http://bigdata-star.com/archives/969

发表评论

登录后才能评论

联系我们

562373081

在线咨询:点击这里给我发消息

邮件:562373081@qq.com

工作时间:周一至周五,9:30-18:30,节假日休息

QR code