测试连接
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