Sqoop常见命令

测试连接

sqoop list-databases \
--connect jdbc:mysql://localhost:3306/ \
--username root \
--password 123456

全量导入MySQL数据到HDFS

sqoop import \
--connect jdbc:mysql://192.168.88.80:3306/userdb \
--username root \
--password 123456 \
--target-dir /sqoop/result1 \
--table emp --m 1

指定分隔符  

--fields-terminated-by '\t' 

指定任务并行度(maptask个数)

--m 2   --split-by (按什么分)

Sqoop数据导入至Hive

方式一:先复制表结构、再导入数据

#将关系型数据的表结构复制到hive中
sqoop create-hive-table \
--connect jdbc:mysql://192.168.88.80:3306/userdb \
--table emp_add \
--username root \
--password 123456 \
--hive-table test.emp_add_sp

#其中 
--table emp_add为mysql中的数据库sqoopdb中的表   
--hive-table emp_add_sp 为hive中新建的表名称。如不指定,将会在hive的default库下创建和MySQL同名表

然后执行数据导入操作

sqoop import \
--connect jdbc:mysql://192.168.88.80:3306/userdb \
--username root \
--password 123456 \
--table emp_add \
--hive-table test.emp_add_sp \
--hive-import \
--m 1

方式二:直接导入数据(包括建表)

sqoop import \
--connect jdbc:mysql://192.168.88.80:3306/userdb \
--username root \
--password 123456 \
--table emp_conn \
--hive-import \
--m 1 \
--hive-database test
Sqoop数据导入至Hive--HCatalog API
sqoop import \
--connect jdbc:mysql://192.168.88.80:3306/userdb \
--username root \
--password 123456 \
--table emp \
--fields-terminated-by '\t' \
--hcatalog-database test \
--hcatalog-table emp_hive \
-m 1
Sqoop数据导入--条件部分导入

where过滤

sqoop import \
--connect jdbc:mysql://192.168.88.80:3306/userdb \
--username root \
--password 123456 \
--where "city ='sec-bad'" \
--target-dir /sqoop/result4 \
--table emp_add --m 1

query查询

sqoop import \
--connect jdbc:mysql://192.168.88.80:3306/userdb \
--username root \
--password 123456 \
--target-dir /sqoop/result5 \
--query 'select id,name,deg from emp WHERE  id>1203 and $CONDITIONS' \
--fields-terminated-by '\001' \
--m 1
注意
使用sql query语句来进行查找时,不能加参数--table;
并且必须要添加where条件;
并且where条件后面必须带一个$CONDITIONS这个字符串;
并且这个sql语句必须用单引号,不能用双引号。

Sqoop数据导入--增量导入

方式一:sqoop自带参数实现

- append模式

#首先执行以下指令先将我们之前的数据导入
sqoop import \
--connect jdbc:mysql://192.168.88.80:3306/userdb \
--username root \
--password 123456 \
--target-dir /sqoop/appendresult \
--table emp --m 1

#查看生成的数据文件,发现数据已经导入到hdfs中.

#然后在mysql的emp中插入2条数据:
insert into `userdb`.`emp` (`id`, `name`, `deg`, `salary`, `dept`) values ('1206', 'allen', 'admin', '30000', 'tp');
insert into `userdb`.`emp` (`id`, `name`, `deg`, `salary`, `dept`) values ('1207', 'woon', 'admin', '40000', 'tp');

#执行如下的指令,实现增量的导入:
sqoop import \
--connect jdbc:mysql://192.168.88.80:3306/userdb \
--username root \
--password 123456 \
--table emp --m 1 \
--target-dir /sqoop/appendresult \
--incremental append \
--check-column id \
--last-value 1205



  	--check-column:以哪一列的值作为增量的基准
	--last-value:指定上一次这一列的值是什么
	--incremental:指定增量的方式


- lastmodified模式

  • 要求:必须包含动态时间变化这一列,按照数据变化的时间进行判断

  • 特点:既导入新增的数据也导入更新的数据

  • # 首先我们要在mysql中创建一个customer表,指定一个时间戳字段
    create table customertest(id int,name varchar(20),last_mod timestamp default current_timestamp on update current_timestamp);
    #此处的时间戳设置为在数据的产生和更新时都会发生改变. 
    
    
    #插入如下记录:
    insert into customertest(id,name) values(1,'neil');
    insert into customertest(id,name) values(2,'jack');
    insert into customertest(id,name) values(3,'martin');
    insert into customertest(id,name) values(4,'tony');
    insert into customertest(id,name) values(5,'eric');
    
    #此时执行sqoop指令将数据导入hdfs:
    sqoop import \
    --connect jdbc:mysql://192.168.88.80:3306/userdb \
    --username root \
    --password 123456 \
    --target-dir /sqoop/lastmodifiedresult \
    --table customertest --m 1
    
    #再次插入一条数据进入customertest表
    insert into customertest(id,name) values(6,'james');
    #更新一条已有的数据,这条数据的时间戳会更新为我们更新数据时的系统时间.
    update customertest set name = 'Neil' where id = 1;
    
    
    #执行如下指令,把id字段作为merge-key:
    sqoop import \
    --connect jdbc:mysql://192.168.88.80:3306/userdb \
    --username root \
    --password 123456 \
    --table customertest \
    --target-dir /sqoop/lastmodifiedresult \
    --check-column last_mod \
    --incremental lastmodified \
    --last-value "2021-10-05 21:54:15" \
    --m 1 \
    --merge-key id 
    
    #由于merge-key这种模式是进行了一次完整的mapreduce操作,
    #因此最终我们在lastmodifiedresult文件夹下可以发现id=1的name已经得到修改,同时新增了id=6的数据

方式二:用户条件过滤实现

通过where对字段进行过滤

指定分区目录

sqoop import \
--connect jdbc:mysql://192.168.88.80:3306/userdb \
--username root \
--password 123456 \
--query "select * from emp where id>1203 and  \$CONDITIONS" \
--fields-terminated-by '\001' \
--hcatalog-database test \
--hcatalog-table emp_hive \
-m 1

Sqoop数据导出

全量数据导

#step1:MySQL中建表
mysql> use userdb;
mysql> create table employee ( 
   id int not null primary key, 
   name varchar(20), 
   deg varchar(20),
   salary int,
   dept varchar(10));
   
#step2:从HDFS导出数据到MySQL
sqoop export \
--connect jdbc:mysql://192.168.88.80:3306/userdb \
--username root \
--password 123456 \
--table employee \
--export-dir /sqoop/result1/

#step3:从Hive导出数据到MySQL
#首先清空MySQL表数据
truncate table employee;

sqoop export \
--connect jdbc:mysql://192.168.88.80:3306/userdb \
--username root \
--password 123456 \
--table employee \
--hcatalog-database test \
--hcatalog-table emp_hive \
--input-fields-terminated-by '\t' \
-m 1 

#注意,如果Hive中的表底层是使用ORC格式存储的,那么必须使用hcatalog API进行操作。

增量数据导出

updateonly:只增量导出更新的数据

#在HDFS文件系统中/sqoop/updateonly/目录的下创建一个文件updateonly_1.txt
hadoop fs -mkdir -p /sqoop/updateonly/
hadoop fs -put updateonly_1.txt /sqoop/updateonly/

1201,gopal,manager,50000
1202,manisha,preader,50000
1203,kalil,php dev,30000

#手动创建mysql中的目标表
mysql> USE userdb;
mysql> CREATE TABLE updateonly ( 
   id INT NOT NULL PRIMARY KEY, 
   name VARCHAR(20), 
   deg VARCHAR(20),
   salary INT);

#先执行全部导出操作:
sqoop export \
--connect jdbc:mysql://192.168.88.80:3306/userdb \
--username root \
--password 123456 \
--table updateonly \
--export-dir /sqoop/updateonly/updateonly_1.txt

#新增一个文件updateonly_2.txt:修改了前三条数据并且新增了一条记录
1201,gopal,manager,1212
1202,manisha,preader,1313
1203,kalil,php dev,1414
1204,allen,java,1515

hadoop fs -put updateonly_2.txt /sqoop/updateonly/

#执行更新导出:
sqoop export \
--connect jdbc:mysql://192.168.88.80:3306/userdb \
--username root \
--password 123456 \
--table updateonly \
--export-dir /sqoop/updateonly/updateonly_2.txt \
--update-key id \
--update-mode updateonly

allowerinsert:既导出更新的数据,也导出新增的数据

#手动创建mysql中的目标表
mysql> USE userdb;
mysql> CREATE TABLE allowinsert ( 
   id INT NOT NULL PRIMARY KEY, 
   name VARCHAR(20), 
   deg VARCHAR(20),
   salary INT);
   
#先执行全部导出操作
sqoop export \
--connect jdbc:mysql://192.168.88.80:3306/userdb \
--username root \
--password 123456 \
--table allowinsert \
--export-dir /sqoop/updateonly/updateonly_1.txt


#执行更新导出
sqoop export \
--connect jdbc:mysql://192.168.88.80:3306/userdb \
--username root --password 123456 \
--table allowinsert \
--export-dir /sqoop/updateonly/updateonly_2.txt \
--update-key id \
--update-mode allowinsert

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值