📜  Sqoop-导入

📅  最后修改于: 2020-11-29 08:22:16             🧑  作者: Mango


本章介绍如何将数据从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 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

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工具“导入”用于将表数据作为文本文件或二进制文件从表导入到Hadoop文件系统。

以下命令用于将emp表从MySQL数据库服务器导入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

导入目标目录

使用Sqoop导入工具将表数据导入HDFS时,我们可以指定目标目录。

以下是将目标目录指定为Sqoop import命令的选项的语法。

--target-dir 

以下命令用于将emp_add表数据导入“ / queryresult”目录。

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

以下命令用于导入emp_add表数据的子集。子集查询用于检索居住在塞康德拉巴德市的员工ID和地址。

$ 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 import命令中的增量选项使用以下语法。

--incremental 
--check-column 
--last 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表数据。

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