hadoop系列十九——sqoop知识点总结

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子句的语法如下:

--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/
发布了44 篇原创文章 · 获赞 0 · 访问量 864

猜你喜欢

转载自blog.csdn.net/heartless_killer/article/details/103037657