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