📅  最后修改于: 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)
让我们以名为emp , emp_add和emp_contact的三个表为例,它们位于MySQL数据库服务器中名为userdb的数据库中。
这三个表及其数据如下。
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 |
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 | |
---|---|---|
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