位置:首頁 > 大數據教學 > Sqoop教學 > Sqoop導入

Sqoop導入

本章介紹了如何從MySQL數據庫中的數據導入到Hadoop的HDFS。 “導入工具”導入單個表從RDBMS到HDFS。表中的每一行被視為HDFS的記錄。所有記錄都存儲為文本文件的文本數據或者在阿夫羅(Avro )和序列文件的二進製數據。 

語法

下麵的語法用於將數據導入HDFS。

$ sqoop import (generic-args) (import-args) 
$ sqoop-import (generic-args) (import-args)

示例

讓我們以命名為emp, emp_add和emp_contact,這是一個在MySQL數據庫服務器名為userdb 數據庫的一個例子。

三個表及其數據如下。

表emp:

id name deg salary dept
1201 gopal manager 50,000 TP
1202 manisha Proof reader 50,000 TP
1203 khalil php dev 30,000 AC
1204 prasanth php dev 30,000 AC
1204 kranthi admin 20,000 TP

表emp_add:

id hno street city
1201 288A vgiri jublee
1202 108I aoc sec-bad
1203 144Z pgutta hyd
1204 78B old city sec-bad
1205 720X hitec sec-bad
id phno email
1201 2356742 gopal@tp.com
1202 1661663 manisha@tp.com
1203 8887776 khalil@ac.com
1204 9988774 prasanth@ac.com
1205 1231231 kranthi@tp.com

導入表

Sqoop工具'import'是用來從表中導入表數據到Hadoop的文件係統作為文本文件或二進製文件。

下麵的命令用於從MySQL數據庫服務器中的emp表導入HDFS。

$ sqoop import \
--connect jdbc:mysql://localhost/userdb \
--username root \
--table emp --m 1

如果成功執行,那麼會得到下麵的輸出。

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.
14/12/22 15:24:56 INFO tool.CodeGenTool: Beginning code generation
14/12/22 15:24:58 INFO manager.SqlManager: Executing SQL statement: SELECT t.* FROM `emp` AS t LIMIT 1
14/12/22 15:24:58 INFO manager.SqlManager: Executing SQL statement: SELECT t.* FROM `emp` AS t LIMIT 1
14/12/22 15:24:58 INFO orm.CompilationManager: HADOOP_MAPRED_HOME is /usr/local/hadoop
14/12/22 15:25:11 INFO orm.CompilationManager: Writing jar file: /tmp/sqoop-hadoop/compile/cebe706d23ebb1fd99c1f063ad51ebd7/emp.jar
-----------------------------------------------------
-----------------------------------------------------
14/12/22 15:25:40 INFO mapreduce.Job: The url to track the job: http://localhost:8088/proxy/application_1419242001831_0001/
14/12/22 15:26:45 INFO mapreduce.Job: Job job_1419242001831_0001 running in uber mode : false
14/12/22 15:26:45 INFO 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_HOME/bin/hadoop fs -cat /emp/part-m-*

emp表的數據和字段之間用逗號(,)表示。

1201, gopal,    manager, 50000, TP
1202, manisha,  preader, 50000, TP
1203, kalil,    php dev, 30000, AC
1204, prasanth, php dev, 30000, AC
1205, kranthi,  admin,   20000, TP

導入到目標目錄

在導入表數據到HDFS使用Sqoop導入工具,我們可以指定目標目錄。

以下是指定目標目錄選項的Sqoop導入命令的語法。

--target-dir <new or exist directory in HDFS>

下麵的命令是用來導入emp_add表數據到'/queryresult'目錄。

$ sqoop import \
--connect jdbc:mysql://localhost/userdb \
--username root \
--table emp_add \
--m 1 \
--target-dir /queryresult

下麵的命令是用來驗證 /queryresult 目錄中 emp_add表導入的數據形式。

$ $HADOOP_HOME/bin/hadoop fs -cat /queryresult/part-m-*

它會用逗號(,)分隔emp_add表的數據和字段。

1201, 288A, vgiri,   jublee
1202, 108I, aoc,     sec-bad
1203, 144Z, pgutta,  hyd
1204, 78B,  oldcity, sec-bad
1205, 720C, hitech,  sec-bad

表數據導入子集

我們可以導入表的使用Sqoop導入工具,"where"子句的一個子集。它執行在各自的數據庫服務器相應的SQL查詢,並將結果存儲在HDFS的目標目錄。

where子句的語法如下。

--where <condition>

下麵的命令用來導入emp_add表數據的子集。子集查詢檢索員工ID和地址,居住城市為:Secunderabad

$ sqoop import \
--connect jdbc:mysql://localhost/userdb \
--username root \
--table emp_add \
--m 1 \
--where city =’sec-bad’” \
--target-dir /wherequery

下麵的命令用來驗證數據從emp_add表導入/wherequery目錄

$ $HADOOP_HOME/bin/hadoop fs -cat /wherequery/part-m-*

它用逗號(,)分隔 emp_add表數據和字段。

1202, 108I, aoc,     sec-bad
1204, 78B,  oldcity, sec-bad
1205, 720C, hitech,  sec-bad

增量導入

增量導入是僅導入新添加的表中的行的技術。它需要添加‘incremental’, ‘check-column’, 和 ‘last-value’選項來執行增量導入。

下麵的語法用於Sqoop導入命令增量選項。

--incremental <mode>
--check-column <column name>
--last value <last check column value>

讓我們假設新添加的數據轉換成emp表如下:

1206, satish p, grp des, 20000, GR

下麵的命令用於在EMP表執行增量導入。

$ sqoop import \
--connect jdbc:mysql://localhost/userdb \
--username root \
--table emp \
--m 1 \
--incremental append \
--check-column id \
-last value 1205

以下命令用於從emp表導入HDFS emp/ 目錄的數據驗證。

$ $HADOOP_HOME/bin/hadoop fs -cat /emp/part-m-*

它用逗號(,)分隔 emp_add表數據和字段。

1201, gopal,    manager, 50000, TP
1202, manisha,  preader, 50000, TP
1203, kalil,    php dev, 30000, AC
1204, prasanth, php dev, 30000, AC
1205, kranthi,  admin,   20000, TP
1206, satish p, grp des, 20000, GR

下麵的命令是從表emp 用來查看修改或新添加的行。

$ $HADOOP_HOME/bin/hadoop fs -cat /emp/part-m-*1

這表示新添加的行用逗號(,)分隔emp表的字段。 

1206, satish p, grp des, 20000, GR