本章介绍如何将数据从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 | 薪水 | dept |
---|---|---|---|---|
1201 | gopal | 经理 | 50,000 | TP |
1202 | manisha | 校对读者 | 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 | 旧城 | sec-bad |
1205 | 720X | hitec | sec-bad |
emp_contact :
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工具'import'是用于将表数据从表导入Hadoop文件系统作为文本文件或二进制文件.
以下命令用于导入 \\ temp 表从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.514/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 generation14/12/22 15:24:58 INFO manager.SqlManager: Executing SQL statement: SELECT t.* FROM `emp` AS t LIMIT 114/12/22 15:24:58 INFO manager.SqlManager: Executing SQL statement: SELECT t.* FROM `emp` AS t LIMIT 114/12/22 15:24:58 INFO orm.CompilationManager: HADOOP_MAPRED_HOME is /usr/local/hadoop14/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 : false14/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-*
它显示 \\ temp 表格数据和字段用逗号(,)分隔.
1201, gopal, manager, 50000, TP1202, manisha, preader, 50000, TP1203, kalil, php dev, 30000, AC1204, prasanth, php dev, 30000, AC1205, kranthi, admin, 20000, TP
导入目标目录
我们可以使用Sqoop导入工具将表数据导入HDFS时指定目标目录.
以下是指定目标目录作为Sqoop导入命令选项的语法.
--target-dir
以下命令用于将 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, jublee1202, 108I, aoc, sec-bad1203, 144Z, pgutta, hyd1204, 78B, oldcity, sec-bad1205, 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-bad1204, 78B, oldcity, sec-bad1205, 720C, hitech, sec-bad
增量导入
增量导入是一种仅导入表中新添加的行的技术.需要添加'incremental','check-column'和'last-value'选项来执行增量导入.
以下语法用于Sqoop中的增量选项导入命令.
--incremental--check-column --last value
让我们假设新添加的数据进入 \\ temp 表如下 :
1206, satish p, grp des, 20000, GR
以下命令用于执行增量导入在 \\ temp 表中.
$ sqoop import \--connect jdbc:mysql://localhost/userdb \--username root \--table emp \--m 1 \--incremental append \--check-column id \-last value 1205
以下命令用于验证来自 \\ temp的导入数据/b>表到HDFS emp/目录.
$ $HADOOP_HOME/bin/hadoop fs -cat /emp/part-m-*
它显示带有逗号(,)分隔字段的 \\ temp 表数据.
1201, gopal, manager, 50000, TP1202, manisha, preader, 50000, TP1203, kalil, php dev, 30000, AC1204, prasanth, php dev, 30000, AC1205, kranthi, admin, 20000, TP1206, satish p, grp des, 20000, GR
以下命令用于查看 \\ temp中修改或新添加的行 table.
$ $HADOOP_HOME/bin/hadoop fs -cat /emp/part-m-*1
它以逗号(,)分隔的字段显示 \\ temp 表中新添加的行.
1206, satish p, grp des, 20000, GR