Sqoop - 匯入



本章描述如何將資料從 MySQL 資料庫匯入到 Hadoop HDFS。‘匯入工具’將單個表從 RDBMS 匯入到 HDFS。表中的每一行都被視為 HDFS 中的一條記錄。所有記錄都以文字資料儲存在文字檔案中,或者以二進位制資料儲存在 Avro 和 Sequence 檔案中。

語法

以下語法用於將資料匯入 HDFS。

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

示例

讓我們以三個名為empemp_addemp_contact的表為例,這些表位於 MySQL 資料庫伺服器中名為 userdb 的資料庫中。

這三個表及其資料如下所示。

emp

id name deg salary dept
1201 gopal manager 50,000 TP
1202 manisha 校對員 50,000 TP
1203 khalil php 開發 30,000 AC
1204 prasanth php 開發 30,000 AC
1204 kranthi admin 20,000 TP

emp_add

idhnostreetcity
1201 288A vgiri jublee
1202 108I aoc sec-bad
1203 144Z pgutta hyd
1204 78B old city sec-bad
1205 720X hitec sec-bad

emp_contact

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 檔案系統,作為文字檔案或二進位制檔案。

以下命令用於將emp表從 MySQL 資料庫伺服器匯入到 HDFS。

$ sqoop import \
--connect jdbc:mysql:///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: 
   https://: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

匯入到目標目錄

使用 Sqoop 匯入工具,我們可以在將表資料匯入 HDFS 時指定目標目錄。

以下是將目標目錄作為 Sqoop 匯入命令選項的語法。

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

以下命令用於將emp_add表資料匯入到‘/queryresult’目錄。

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

以下命令用於驗證從emp_add表匯入到 /queryresult 目錄中的資料。

$ $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表資料的子集。子集查詢用於檢索居住在 Secunderabad 市的員工 ID 和地址。

$ sqoop import \
--connect jdbc:mysql:///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:///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表資料,欄位之間用逗號 (,) 分隔。

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
廣告
© . All rights reserved.