Sqoop导入数据到hive、hbase

在上一篇博文中,已经介绍过了sqoop的一些用法,把数据从数据库导入到hdfs。本篇将介绍如何从数据库导入到hive和hbase中。

增量导入

增量导入的意思就是在原先导入的数据的基础上,追加新的数据进去。
我们以下面的数据为例,分别是学生的id,姓名,生日和性别

01 赵雷 1990-01-01 男
02 钱电 1990-12-21 男
03 孙风 1990-05-20 男
04 李云 1990-08-06 男
05 周梅 1991-12-01 女
06 吴兰 1992-03-01 女
07 郑竹 1989-07-01 女
08 王菊 1990-01-20 女

首先把表格数据导入到hdfs中

sqoop-import \
--connect jdbc:mysql://hadoop01:3306/sqoop \
--username root \
--password ok \
--table student \
--target-dir /sqoop/student \
--m 1

在这里插入图片描述

此时我们再往表格中插入新的数据,然后用追加的方式把新的数据插入到已上传的数据中。
新插入的数据:

INSERT INTO student VALUES(09,'孙悟空','1992-06-01','男'),(10,'猪八戒','1991-05-04','男')

sqoop实现:

sqoop-import \
--connect jdbc:mysql://hadoop01:3306/sqoop \
--username root \
--password ok \
--table student \
--incremental append \
--check-column sid \
--last-value 08 \
--target-dir /sqoop/student \
--m 1

incremental指定增量导入的模式:
append:追加数据记录;
lastmodified:可追加更新的标题数据。
check-coumn 主键列
last-value:上一次最后一条数据的主键的值
此时我们查看新导入的数据,发现是从新插入的数据开始上传的:
在这里插入图片描述

导入文件格式

导入时指定文件格式参数:

–as-textfile 导入数据为text文件(默认)
–as-avrodatafile 导入数据为avro文件
–as-sequencefile 导入数据为sequence文件
–as-parquetfile 导入数据为parquet文件

例如:

sqoop-import \
--connect jdbc:mysql://hadoop01:3306/sqoop \
--username root \
--password ok \
--table student \
--target-dir /sqoop/student \
--m 1
--as-sequencefile

从数据库导入到HIVE

直接导入到Hive

在这之前需要先复制两个jar包到sqoop的lib目录下:
hive-common、hive-exec

cp /opt/hive/lib/hive-common-1.1.0-cdh5.14.2.jar /opt/sqoop/lib/
sqoop-import \
--connect jdbc:mysql://hadoop01:3306/sqoop \
--username root \
--password ok \
--table student \
--hive-import \
--create-hive-table \
--hive-database test \
--hive-table student \
--m 1

–create-hive-table:自动创建表,生产中一般不使用;
–hive-overwrite:覆盖原有表数据。
到hive中查询:
在这里插入图片描述
我们在来试下往hive中已有表格查询数据(表格类型需一致):

sqoop-import \
--connect jdbc:mysql://hadoop01:3306/sqoop \
--username root \
--password ok \
--table student \
--hive-import \
--hive-database test \
--hive-table student \
--m 1

同样查询成功
在这里插入图片描述
overwrite的用法:

sqoop-import \
--connect jdbc:mysql://hadoop01:3306/sqoop \
--username root \
--password ok \
--table student \
--hive-import \
--hive-database test \
--hive-table student \
--hive-overwrite
--m 1

导入到Hive的分区

建立一个分区表:

create external table stu(
sid int,
sname string,
birth string,
gender string)
partitioned by (group string);

sqoop实现分区导入:

sqoop-import \
--connect jdbc:mysql://hadoop01:3306/sqoop \
--username root \
--password ok \
--query "select * from student where sid<5 and \$CONDITIONS" \
--split-by sname \
--target-dir /test/sqoop/student \
--hive-import \
--hive-table test.stu \
--hive-partition-key 'group' \
--hive-partition-value 'one' \
--m 1

执行完成后,我们可以到hdfs上看
在这里插入图片描述
导入MySQL数据到Hbase

sqoop-import \
--connect jdbc:mysql://hadoop01:3306/sqoop \
--username root \
--password ok \
--table student \
--columns "sid,sname,birth" \
--hbase-create-table \
--hbase-table student \
--column-family info \
--hbase-row-key sid \
--m 1

–column-family:列簇
–hbase-row-key:行键,行键要再–columns中。
执行完成后我们可以到hbase中查看
在这里插入图片描述
我们也可以通过Hive来实现与Hbase的交互来查看下信息:

create external table empstu(
sid int,
sname string,
birth string)
stored by 'org.apache.hadoop.hive.hbase.HBaseStorageHandler'
with serdeproperties
('hbase.columns.mapping'=':key,info:sname,info:birth')
tblproperties('hbae.table.name'='student');

在这里插入图片描述

导出HDFS数据到MySQL

在MySQL中创建一个student表格,格式需要和导入数据的表格一致。

sqoop export \
--connect jdbc:mysql://hadoop01:3306/test \
--username root \
--password ok \
--table student \
--export-dir /opt/hive/warehouse/test.db/student \
--m 1

此时执行时会报错:
在这里插入图片描述
ERROR tool.ExportTool: Error during export:
Export job failed!

造成这一错误的原因主要有表格结构不一致或者分隔符错误。
我这里的是分隔符的原因。在hive中会使用默认的分隔符:‘\001’,在sqoop中加上后,再来测试一下:

sqoop export \
--connect jdbc:mysql://hadoop01:3306/test \
--username root \
--password ok \
--table student \
--export-dir /opt/hive/warehouse/test.db/student \
--input-fields-terminated-by '\001' \
--m 1

此时数据就可以导入到MySQL中
在这里插入图片描述
注:当数据中有空值的时候可以加入再加上两条参数:

--input-null-string '\\N' \
--input-null-non-string '\\N'

因为hive中的null值默认是按照字符串"\N"存储的,当"\N"的格式不符合数据类型时就会导致报错导致报错。

sqoop job

先创建 job,再执行 job

sqoop job \
--create order2HDFS \
-- import \
--connect jdbc:mysql://hadoop01:3306/retail_db \
--username root \
-P \
--table orders \
--target-dir /data/retail_db/orders_job \
-m 3

注意,-- import中间要加空格。
创建job后,在执行:

sqoop job --exec order2HDFS
  • 2
    点赞
  • 4
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值