Sqoop的Import和Export操作

Sqoop将非大数据集群(关系型数据库mysql、oracle等)RDBMS向大数据集群(HDFS、Hive、HBase)传输数据,称为import;反之称为export。

其中RDBMS -> HBase是单向过程。

一、导入数据操作import

1. RDBMS到HDFS

(1)数据全部import

(2)查询导入(--table 表名 \要去掉)

(3)导入指定列(columns 列1,列2,列3...)

(4)使用sqoop关键字筛选查询导入数据(where 'condition')

2. RDBMS到Hive

3. RDBMS到HBase

(1)单属性rowkey

(2)多属性rowkey(--split-by "连接符"连接rowkey)

二、导出数据操作export

(1)Hive -> RDBMS

(2)HDFS -> RDBMS


一、导入数据操作import

1. RDBMS到HDFS

首先在mysql中随便创建一个表company.staff

$ mysql -uroot -p000000
mysql> create database company;
mysql> create table company.staff(id int(4) primary key not null auto_increment, name varchar(255), sex varchar(255));
mysql> insert into company.staff(name, sex) values('Thomas', 'Male');
mysql> insert into company.staff(name, sex) values('Catalina', 'FeMale');

(1)数据全部import

bin/sqoop import \
--connect jdbc:mysql://hadoop100:3306/company \
--username root \
--password 000000 \
--table staff \
--target-dir /sqoop/company \
--delete-target-dir \
--num-mappers 1 \
--fields-terminated-by "\t"

两个注意点:--必须有,换行符\前需要有空格

将mysql数据库中的company库里的staff表,导入HDFS目标目录/sqoop/company,

--delete-target-dir指目标目录若有则删除,依情况判断是否加这句,

指定mapper数为1,分隔符Tab

 

数据在HDFS中显示如下:

Sqoop的Import和Export操作_第1张图片Sqoop的Import和Export操作_第2张图片

download一下part-m-00000,打开显示如下,Tab键分隔

Sqoop的Import和Export操作_第3张图片

 

(2)查询导入(--table 表名 \要去掉)

在全部数据导入的基础上,加上sql查询语句,导入查询筛选后的数据

bin/sqoop import \
--connect jdbc:mysql://hadoop100:3306/company \
--username root \
--password 000000 \
--target-dir /sqoop/company \
--delete-target-dir \
--num-mappers 1 \
--fields-terminated-by "\t"
--query 'select name,sex from staff where id <=1 and $CONDITIONS;'

需要注意的是在sql的where条件中必须包含$CONDITIONS

若query为双引号,$前需要加转义字符\,避免shell识别为变量引用

★ 因为--query里已经有表staff了,所以--table staff \要删掉,否则会报错。

import后的文件如下

Sqoop的Import和Export操作_第4张图片

 

(3)导入指定列(columns 列1,列2,列3...)

bin/sqoop import \
--connect jdbc:mysql://hadoop100:3306/company \
--username root \
--password 000000 \
--table staff \
--target-dir /sqoop/company \
--delete-target-dir \
--num-mappers 1 \
--fields-terminated-by "\t" \
--columns id,sex

结果如下

Sqoop的Import和Export操作_第5张图片

 

(4)使用sqoop关键字筛选查询导入数据(where 'condition')

bin/sqoop import \
--connect jdbc:mysql://hadoop100:3306/company \
--username root \
--password 000000 \
--table staff \
--target-dir /sqoop/company \
--delete-target-dir \
--num-mappers 1 \
--fields-terminated-by "\t" \
--where 'id=2'

结果如下

Sqoop的Import和Export操作_第6张图片

 

2. RDBMS到Hive

分为两步:第一步将mysql数据导入HDFS,第二步将导入HDFS中的数据迁移到Hive中

bin/sqoop import \
--connect jdbc:mysql://hadoop100:3306/company \
--username root \
--password 000000 \
--table staff \
--num-mappers 1 \
--hive-import \
--fields-terminated-by "\t" \
--hive-overwrite \
--hive-table staff_hive

在hive中查询数据表staff_hive

hive (default)> select * from staff_hive;
OK
staff_hive.id	staff_hive.name	staff_hive.sex
1	Kevin	Male
2	John	Male

发现mysql中的数据表已经导入hive的default库中。

 

3. RDBMS到HBase

首先开启HDFS、Yarn、Zookeeper、HBase

HBase1.0.1之前的版本会自动创建HBase表,之后的版本在sqoop导入数据前需要自己创建target表。

(1)单属性rowkey

创建HBase表

hbase(main):002:0> create 'habse_staff','info'

导入数据,将id作为rowkey

bin/sqoop import \
--connect jdbc:mysql://hadoop100:3306/company \
--username root \
--password 000000 \
--table staff \
--columns "id,name,sex" \
--column-family "info" \
--hbase-create-table \
--hbase-row-key "id" \
--hbase-table "hbase_staff" \
--num-mappers 1 

查询结果表

hbase(main):010:0> scan "hbase_staff"
ROW                      COLUMN+CELL                                                           
 1                       column=info:name, timestamp=1551237977664, value=Kevin                
 1                       column=info:sex, timestamp=1551237977664, value=Male                  
 2                       column=info:name, timestamp=1551237977664, value=John                 
 2                       column=info:sex, timestamp=1551237977664, value=Male 

(2)多属性rowkey(--split-by "连接符"连接rowkey)

创建HBase表

hbase(main):012:0> create 'hbase_staff2','info'

导入数据,id和name作为rowkey,需要用--split-by "_"连接两个rowkey字段

bin/sqoop import \
--connect jdbc:mysql://hadoop100:3306/company \
--username root \
--password 000000 \
--table staff \
--columns "id,name,sex" \
--column-family "info" \
--hbase-create-table \
--hbase-row-key "id","name" \
--hbase-table "hbase_staff2" \
--num-mappers 1 \
--split-by "_"

查询结果

hbase(main):018:0> scan "hbase_staff2"
ROW                      COLUMN+CELL                                                           
 1_Kevin                 column=info:sex, timestamp=1551238405368, value=Male                  
 2_John                  column=info:sex, timestamp=1551238405368, value=Male                  
2 row(s) in 0.0320 seconds

row-key为id_name的模式

 

二、导出数据操作export

从大数据集群(HDFS、Hive)向非大数据集群(RDBMS)传输数据,为export,日常工作中用的很少。

HBase中数据无法导入RDBMS,对于HBase只能单向import。

(1)Hive -> RDBMS

Hive的数据包括两部分:

元数据Meta Store存放在mysql数据库中,

结构化数据存储在HDFS中,默认路径/user/hive/warehouse

所以,将hive中数据表export到mysql中,路径是HDFS的/user/hive/warehouse,export命令如下

1. 首先在mysql中创建表hive_staff
mysql> create table company.hive_staff(id int(4) primary key not null auto_increment, name varchar(255), sex varchar(255));
Query OK, 0 rows affected (0.02 sec)

2. 然后export
bin/sqoop export \
--connect jdbc:mysql://hadoop100:3306/company \
--username root \
--password 000000 \
--table hive_staff \
--num-mappers 1 \
--export-dir /user/hive/warehouse/staff_hive \
--input-fields-terminated-by "\t"

3. 结果查询
mysql> select * from hive_staff;
+----+-------+------+
| id | name  | sex  |
+----+-------+------+
|  1 | Kevin | Male |
|  2 | John  | Male |
+----+-------+------+

(2)HDFS -> RDBMS

与hive的方式一致,唯一区别是表的路径是HDFS自定义路径。

 

 

 

你可能感兴趣的:(Sqoop,Sqoop)