- Sqoop 教程
- Sqoop - 首页
- Sqoop - 简介
- Sqoop - 安装
- Sqoop - 导入
- Sqoop - 导入所有表
- Sqoop - 导出
- Sqoop - Sqoop 作业
- Sqoop - 代码生成
- Sqoop - Eval
- Sqoop - 列出数据库
- Sqoop - 列出表
- Sqoop 有用资源
- Sqoop - 常见问题解答
- Sqoop - 快速指南
- Sqoop - 有用资源
- Sqoop - 讨论
Sqoop - 导入
本章描述如何将数据从 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 的数据库中。
这三个表及其数据如下所示。
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
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 | |
---|---|---|
1201 | 2356742 | [email protected] |
1202 | 1661663 | [email protected] |
1203 | 8887776 | [email protected] |
1204 | 9988774 | [email protected] |
1205 | 1231231 | [email protected] |
导入表
Sqoop 工具“import”用于将表数据从表导入到 Hadoop 文件系统,作为文本文件或二进制文件。
以下命令用于将emp表从 MySQL 数据库服务器导入到 HDFS。
$ sqoop import \ --connect jdbc:mysql://127.0.0.1/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://127.0.0.1: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://127.0.0.1/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://127.0.0.1/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://127.0.0.1/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