1、概述
sqoop是apache旗下一款“Hadoop和关系数据库服务器之间传送数据”的工具。
导入数据:MySQL,Oracle导入数据到Hadoop的HDFS、HIVE、HBASE等数据存储系统。实现hadoop 存储系统和关系型数据库的数据互相迁移;
导出数据:从Hadoop的文件系统中导出数据到关系数据库mysql等。、
2、工作机制
将导入或导出命令翻译成mapreduce程序来实现。
在翻译出的mapreduce中主要是对inputformat和outputformat进行定制。
3、sqoop的使用
数据的导入
导入单个表从RDBMS到HDFS。表中的每一行被视为HDFS的记录。所有记录都存储为文本文件的文本数据(或者Avro、sequence文件等二进制数据)
将mysql的表 导 hdfs
代码
/** 将mysql的表导入 hdfs **/
bin/sqoop import \ --启动sqoop
--connect jdbc:mysql://hdp-04:3306/userdb \ --sqoop 的所在位置
--username root \
--password root \
--target-dir \ -- 目标的目录
/sqooptest \
--fields-terminated-by ',' \ --新生成的库字段以什么分区,指定分隔符
--table emp \ --导入的表明
--split-by id \ --如果maptask大于2,则表示根据什么字段来做切片
--m 2 --几个maptask
注意:
如果设置了 --m 1,则意味着只会启动一个maptask执行数据导入;
如果不设置 --m 1,则默认为启动4个map task执行数据导入,则需要指定一个列来作为划分map task任务的依据。
将mysql的表导入 hive
代码
bin/sqoop import \
--connect jdbc:mysql://hdp-04:3306/userdb \
--username root \
--password root \
--hive-import \ -- 指定导入hive
--fields-terminated-by ',' \
--table emp \
--split-by id \
--m 2
导入表数据子集
我们可以使用Sqoop导入工具导入表的"where"子句的一个子集。它执行在各自的数据库服务器相应的SQL查询,并将结果存储在HDFS的目标目录。
where子句的语法如下:
扫描二维码关注公众号,回复:
9729231 查看本文章
--where <condition>
下面的命令用来导入emp_add表数据的子集。子集查询检索员工ID和地址,居住城市为(sec-bad):
bin/sqoop import \
--connect jdbc:mysql://hdp-node-01:3306/test \
--username root \
--password root \
--where "city ='sec-bad'" \子集条件声明
--target-dir /wherequery \
--table emp_add \
--m 1
将mysql的表的增量数据导入 hdfs 就是新增的数据
增量导入是仅导入新添加的表中的行的技术。
sqoop支持两种增量MySql导入到hive的模式,
- 一种是append,即通过指定一个递增的列,比如:
--incremental append --check-column num_id --last-value 0
- 另种是可以根据时间戳,比如:
--incremental lastmodified --check-column created --last-value '2018-02-01 11:0:00'
就是只导入created 比’2018-02-01 11:0:00’更大的数据。
append模式
它需要添加‘incremental’, ‘check-column’, 和 ‘last-value’选项来执行增量导入。
下面的语法用于Sqoop导入命令增量选项:
--incremental <mode> --指定模式。,表示增量导入
--check-column <column name> --根据 哪一行盘点增量,指定递增的列
--last value <last check column value> --从哪一行开始
代码
bin/sqoop import \
--connect jdbc:mysql://hdp-04:3306/userdb \
--target-dir /sqooptest \
--username root \
--password root \
--table emp \
--m 1 \
--incremental append \ -- 表示增量导入
--check-column id \ --指定递增的列
--last-value 1205 --上次导入到多少行
Sqoop的数据导出
5.1、将数据从HDFS文件导出到RDBMS数据库
导出前,目标表必须存在于目标数据库中。
默认操作是将文件中的数据使用INSERT语句插入到表中
更新模式下,是生成UPDATE语句更新表数据
将hdfs的文件数据导出到mysql
bin/sqoop export \
--connect jdbc:mysql://hdp-04:3306/userdb \ --mysql的位置
--username root \
--password root \
--input-fields-terminated-by ',' \ --Hdfs的分隔符
--table emp \ --表名
--export-dir /sqooptest/ --导出的数据在哪
将hive的表数据(hdfs的文件)导出到mysql
bin/sqoop export \
--connect jdbc:mysql://hdp-04:3306/userdb \
--username root \
--password root \
--input-fields-terminated-by ',' \
--table t_from_hive \
--export-dir /user/hive/warehouse/t_a/