Sqoop 导入
“导入工具”导入单个表从 RDBMS 到 HDFS。表中的每一行被视为 HDFS 的记录。所有记录都存储为文本文件的文本数据(或者 Avro、sequence 文件等二进制数据)。
下面的语法用于将数据导入 HDFS。
$ sqoop import (generic-args) (import-args)
Sqoop 测试表数据
在 mysql 中创建数据库 userdb,创建三张表: emp emp_add emp_conn。
导入 mysql 表数据到 HDFS
下面的命令用于从 MySQL 数据库服务器中的 emp 表导入 HDFS。
bin/sqoop import \
--connect jdbc:mysql://node-1:3306/userdb \
--username root \
--password root \
--target-dir /sqoopresult \
--table emp --m 1
其中--target-dir 可以用来指定导出数据存放至 HDFS 的目录;
mysql jdbc url 请使用 ip 地址。
为了验证在 HDFS 导入的数据,请使用以下命令查看导入的数据:
hdfs dfs -cat /sqoopresult/part-m-00000
可以看出它会用逗号,分隔 emp 表的数据和字段。
1201,gopal,manager,50000,TP
1202,manisha,Proof reader,50000,TP
1203,khalil,php dev,30000,AC
1204,prasanth,php dev,30000,AC
1205,kranthi,admin,20000,TP
导入 mysql 表数据到HIVE
将关系型数据的表结构复制到 hive 中
bin/sqoop create-hive-table \
--connect jdbc:mysql://node-1:3306/userdb \
--table emp_conn \
--username root \
--password root \
--hive-table test.emp_conn_sp
其中:
--table emp_add 为 mysql 中的数据库 sqoopdb 中的表。
--hive-table emp_add_sp 为 hive 中新建的表名称。
从关系数据库导入文件到 hive 中
bin/sqoop import \
--connect jdbc:mysql://node-1:3306/userdb \
--username root \
--password root \
--table emp_conn \
--hive-table test.emp_conn_1 \
--hive-import \
--m 1
导入表数据子集
--where 可以指定从关系数据库导入数据时的查询条件。它执行在各自的数据库服务器
相应的 SQL 查询,并将结果存储在 HDFS 的目标目录。
bin/sqoop import \
--connect jdbc:mysql://node-21:3306/sqoopdb \
--username root \
--password hadoop \
--where "city ='sec-bad'" \
--target-dir /wherequery \
--table emp_add --m 1
复杂查询条件:
bin/sqoop import \
--connect jdbc:mysql://node-21:3306/sqoopdb \
--username root \
--password hadoop \
--target-dir /wherequery12 \
--query 'select id,name,deg from emp WHERE id>1203 and $CONDITIONS' \
--split-by id \
--fields-terminated-by '\t' \
--m 1
增量导入
增量导入是仅导入新添加的表中的行的技术。
--check-column (col) 用来作为判断的列名,如 id
--incremental (mode) append:追加,比如对大于 last-value 指定的值之后的记录进行追加导入。lastmodified:最后的修改时间,追加 last-value指定的日期之后的记录
--last-value (value) 指定自从上次导入后列的最大值(大于该指定的值),也可以自己设定某一值假设新添加的数据转换成 emp 表如下:
1206, satish p, grp des, 20000, GR
下面的命令用于在 EMP 表执行增量导入:
bin/sqoop import \
--connect jdbc:mysql://node-21:3306/sqoopdb \
--username root \
--password hadoop \
--table emp --m 1 \
--incremental append \
--check-column id \
--last-value 1205
Sqoop 导出
将数据从 HDFS 导出到 RDBMS 数据库导出前,目标表必须存在于目标数据库中。默认操作是从将文件中的数据使用INSERT语句插入到表中,更新模式下,是生成UPDATE
语句更新表数据。
以下是 export 命令语法:
$ sqoop export (generic-args) (export-args)
导出 HDFS 数据到 mysql
数据是在 HDFS 中“emp/”目录的 emp_data 文件中:
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,satishp,grpdes,20000,GR
首先需要手动创建 mysql 中的目标表:
mysql> USE sqoopdb;
mysql> CREATE TABLE employee (
id INT NOT NULL PRIMARY KEY,
name VARCHAR(20),
deg VARCHAR(20),
salary INT,
dept VARCHAR(10));
然后执行导出命令:
bin/sqoop export \
--connect jdbc:mysql://node-21:3306/sqoopdb \
--username root \
--password hadoop \
--table employee \
--export-dir /emp/emp_data
还可以用下面命令指定输入文件的分隔符
--input-fields-terminated-by '\t'
如果运行报错如下:
则需要把 localhost 更改为 ip 或者域名。
示例如下,将点击流模型表导出到 mysql
sqoop export \
--connect jdbc:mysql://hdp-node-01:3306/webdb --username root --password root \
--table click_stream_visit \
--export-dir /user/hive/warehouse/dw_click.db/click_stream_visit/datestr=2013-09-18 \
--input-fields-terminated-by '\001'
导出 hive数据到 mysql
sqoop export \
--connect jdbc:mysql://node-1:3306/hive --username root --password root \
--table t_user --export-dir /usr/hive/warehouse/hivetest.t_user \
--input-fields-terminated-by '\001'