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

下面的命令用來導入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 --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