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


目录

  • 增量导入
  • 导入文件格式
  • 从数据库导入到HIVE
  • 直接导入到Hive
  • 导入到Hive的分区
  • 导出HDFS数据到MySQL
  • sqoop job


增量导入

增量导入的意思就是在原先导入的数据的基础上,追加新的数据进去。
我们以下面的数据为例,分别是学生的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

sqoop 连接kerberos hive sqoop导入hive_数据库

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

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:上一次最后一条数据的主键的值

此时我们查看新导入的数据,发现是从新插入的数据开始上传的:

sqoop 连接kerberos hive sqoop导入hive_hive_02

导入文件格式

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

–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中查询:

sqoop 连接kerberos hive sqoop导入hive_大数据_03


我们在来试下往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

同样查询成功

sqoop 连接kerberos hive sqoop导入hive_大数据_04


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上看

sqoop 连接kerberos hive sqoop导入hive_sqoop_05


导入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中查看

sqoop 连接kerberos hive sqoop导入hive_hive_06


我们也可以通过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');

sqoop 连接kerberos hive sqoop导入hive_sqoop_07

导出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

此时执行时会报错:

sqoop 连接kerberos hive sqoop导入hive_大数据_08


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中

sqoop 连接kerberos hive sqoop导入hive_hive_09


注:当数据中有空值的时候可以加入再加上两条参数:

--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