Sqoop是一个用来将Hadoop和关系型数据库中的数据相互转移的工具,可以将一个关系型数据库(例如: MySQL ,Oracle ,Postgres等)中的数据导入到 Hadoop 的HDFS中,也可以将HDFS的数据导进到关系型数据库中。数据是一行一行传输的,数据格式为文本文档 或二进制文档。
从数据库导入数据,须要指定“连接串”,此连接串与URL相似,用 --connect连接,比如:
$ sqoop import --connect jdbc:mysql://database.example.com/employee此命令用来连接主机 **transwarp_node1** 中名为 **employees** 的表。 **注意!** 如果你要在分布式集群中使用Sqoop, 那么不要使用 “hosthost”作为URL。 你也可以使用用户名密码来进行安全连接:
$ sqoop import --connect jdbc:mysql://transwarp_node1/employees \
--username venkatesh --passwordFile ${user.home}/.password
$ sqoop import --connect jdbc:mysql://transwarp_node1/employees \
--username aaron --password 12345
Sqoop 支持多个数据库,但 MySQL 为Sqoop自动安装,对其他数据库,需要下载对应的JDBC,然后在$SQOOP_HOME/lib 目录下安装 .jar包(如果使用RMP或者Debian包安装,则应在/usr/lib/sqoop/lib目录下)每个驱动.jar包含了一个启动接入点,例如MySQL 包含了com.mysql.jdbc.Driver,使用 sqoop 的 --driver命令来连接相应的数据库。
例如,连接 SQLServer数据库,首先从Microsoft.com下载并安装至 Sqoop lib 路径下,然后启动Sqoop:
$sqoop import --driver com.microsoft.jdbc.sqlserver.SQLServerDriver \ --connect <连接串>
使用 --table 来选择导入某个表, 例如 --table employees.
Sqoop 默认导入所选的表中所有的列,并在HDFS中按顺序排列,比如,一个表中包含A, B, C三列,那么在HDFS中储存为:
A1,B1,C1 A2,B2,C2 ...
你也可以选择部分列来导入,用 --columns来实现。每一列的名称须用“逗号”隔开,例如 --columns "name,employee_id,jobtitle".
你也可以通过 SQL 的 WHERE 语句来导入某些行, 在Sqoop中,用--where来实现。 比如: --where "id > 400",那么只有那些id列中大于400的值会被导入HDFS.
Sqoop 同样支持 SQL 语句的导入: --query.
当使用SQL语句导入时,必须添加目标路径 --target-dir。
当需要并行导入结果数据,需要包含符号$CONDITIONS,并且用 --split-by来指定分裂列(splitting column), 例如:
$ sqoop import \
--query 'SELECT a.*, b.* FROM a JOIN b ON (a.id == b.id) WHERE $CONDITIONS' \
--split-by a.id --target-dir /usr/foo/joinresults
或者,也可以用-m 1来进行单任务导入:
$ sqoop import \
--query 'SELECT a.*, b.* FROM a JOIN b ON (a.id == b.id) WHERE $CONDITIONS' \
--m 1 --target-dir /usr/foo/joinresults
注意!如果SQL语句中需要使用双引号,那么用 \$CONDITIONS代替$CONDITIONS. 比如:"SELECT * FROM x WHERE a='foo' AND \$CONDITIONS"