Sqoop的数据导入、导出
sqoop导入
- 就是从关系型数据库(mysql)的数据导入到 Hadoop 与其相关的系统 (如HBase和Hive)中。
1 语法
$ sqoop import (generic-args) (import-args)
2 案例
测试之前先在mysql中准备数据:
create database sqoop; --创建名为sqoop的数据库
use sqoop; --切换到sqoop数据库
create table employee( --创建一个名为employee的表
id int not null primary key auto_increment,
name varchar(20),
birthday date
);
insert into employee values ('','张三','2016-01-01');
insert into employee values ('','张四','2016-01-01');
insert into employee values ('','张五','2016-01-01');
insert into employee values ('','张6','2016-01-01');
insert into employee values ('','张7','2016-01-01');
insert into employee values ('','张8','2016-01-01');
insert into employee values ('','张9','2016-01-01');
insert into employee values ('','张10','2016-01-01');
insert into employee values ('','张11','2016-01-01');
insert into employee values ('','张12','2016-01-01');
insert into employee values ('','张13','2016-01-01');
insert into employee values ('','张14','2016-01-01');
insert into employee values ('','zhangsan','2016-01-01');
-
导入表数据到hdfs中
-
创建sqoop
#sqoop的命令只能在行,如果换行则需要使用 \ sqoop job --delete sqoopone \ sqoop job --create sqoopone \ import \ --connect jdbc:mysql://localhost:3306/sqoop \ --username root \ --password root \ --table employee \ #mysql的表名 --target-dir /luodesong #/sqfs 表示导入的数据保存在hadoop的路径 --m 1 #表示启动mr的数量
上述语句如果没有指定保存到HDFS到哪里(target-dir),默认保存在/user/hadoop/employee/路径下
-
如果成功执行,那么会得到下面的输出
14/12/22 15:24:54 INFO sqoop.Sqoop: Running Sqoop version: 1.4.5 14/12/22 15:24:56 INFO manager.MySQLManager: Preparing to use a MySQL streaming resultset. INFO orm.CompilationManager: Writing jar file: /tmp/sqoop-hadoop/compile/cebe706d23ebb1fd99c1f063ad51ebd7/emp.jar ----------------------------------------------------- O mapreduce.Job: map 0% reduce 0% 14/12/22 15:28:08 INFO mapreduce.Job: map 100% reduce 0% 14/12/22 15:28:16 INFO mapreduce.Job: Job job_1419242001831_0001 completed successfully ----------------------------------------------------- ----------------------------------------------------- 14/12/22 15:28:17 INFO mapreduce.ImportJobBase: Transferred 145 bytes in 177.5849 seconds (0.8165 bytes/sec) 14/12/22 15:28:17 INFO mapreduce.ImportJobBase: Retrieved 5 records.
-
为了验证在HDFS导入的数据,请使用以下命令查看导入的数据
hadoop fs -cat /luodesong/employee/part-m-00000
-
导入表数据到hive中
sqoop job --delete sqoopotow \ sqoop job --create sqooptow \ import \ --connect jdbc:mysql://localhost:3306/sqoop \ --username root \ --password root \ --table employee \ --hive-import \ #这句是关键语句 --m 1
-
导入表数据子集
我们使用Sqoop导入工具时,可以导入"where"子句的一个子集。它执行在各自的数据库服务器相应的SQL查询,并将结果存储在HDFS的目标目录。
导入id值大于5的记录
sqoop job --delete sqoopthree \ sqoop job --create sqoopthree \ import \ --connect jdbc:mysql://localhost:3306/sqoop \ --username root \ --password root \ --where "id >5" \ --target-dir /wherequery \ --table employee --m 1
-
增量导入
增量导入是仅导入新添加的表中的行的技术
它需要添加‘incremental’,‘check-column’, 和 ‘last-value’选项来执行增量导入。下面的语法用于Sqoop导入命令增量选项。
--incremental <mode> --check-column <column name> --last value <last check column value> ```
-
假设新添加的数据转换成employee表如下
insert into employee values ('','张100','2018-03-03'); ```
-
下面的命令用于在employee表执行增量导入。
sqoop job --delete sqoopfour \ sqoop job --create sqoopfour \ import \ --connect jdbc:mysql://localhost:3306/sqoop \ --username root \ --password root \ --table employee --m 1 \ --incremental append \ --check-column id \ #根据id判定一条记录 --last-value 12 #从哪条记录以后的内容导入
Sqoop的数据导出
就是从 Hadoop 系统里抽取并导出到关系型数据库里。
1 语法
$ sqoop export (generic-args) (export-args)
2 案例
-从hdfs中导入到mysql
-
数据是在HDFS 中“employee/”目录的emp_data文件中。所述emp_data如下:
1,张三,2016-01-01 2,张四,2016-01-01 3,张五,2016-01-01 4,张6,2016-01-01 5,张7,2016-01-01 6,张8,2016-01-01
-
首先需要手动创建mysql中的目标表
mysql> USE sqoop2; mysql> CREATE TABLE employee ( id INT NOT NULL PRIMARY KEY, name VARCHAR(20), birthday date);
-
然后执行导出命令
sqoop job --delete sqoopfive \ sqoop job --create sqoopfive \ export \ --connect jdbc:mysql://localhost:3306/sqoop2 \ --username root \ --password root \ --table employee \ --export-dir /employee/
sqoop的执行job的命令
- 执行job
sqoop job --exec jobname