在上一篇博文中,已经介绍过了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
此时我们再往表格中插入新的数据,然后用追加的方式把新的数据插入到已上传的数据中。
新插入的数据:
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
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