Sqoop基本操作
Sqoop是一款开源的工具,主要用于在Hadoop(Hive)与传统的数据库(mysql、postgresql…)间进行数据的传递,可以将一个关系型数据库(例如 : MySQL ,Oracle ,Postgres等)中的数据导进到Hadoop的HDFS中,也可以将HDFS的数据导进到关系型数据库中。
以命令行的方式,进行表格的全量和增量的抽取,在不同的数据库的表和表之间进行数据的抽取和数据的迁移。
将导入或导出命令翻译成mapreduce程序来实现。
导入数据
检查是否搭建成功 list-tables 显示表名
sqoop list-tables --connect jdbc:mysql://数据库ip地址或者主机名:3306/数据库名字 --数据库用户名 --password 密码
#查看mysql的表
sqoop list-tables --connect jdbc:mysql://localhost:3306/hive --username root --password 123456
#查看oracle的表
sqoop list-tables --connect jdbc:oracle:thin:@192.168.2.88:1521/ORCL --username scott --password tiger
全量导入
dept表 oracle导入到hive
sqoop import \
--hive-import \
--connect jdbc:oracle:thin:@192.168.153.1:1521/orcl \
--username scott \
--password tiger \
--table DEPT \
--hive-database bigdata \
--fields-terminated-by ','
students表 mysql导入到hive
sqoop import \
--hive-import \
--connect jdbc:mysql://192.168.153.1:3306/db01 \
--username root \
--password 123456 \
--table students \
--hive-database bigdata \
--fields-terminated-by ',' \
-m 1 #-m 1的选项,是当被抽取的表格没有主键的时候添加的选项,如果有主键就不要这一句 数据抽取的时候,相同的表格,只能被抽取一次
导入teachers部分字段到hdfs
提示:导入到hdfs不会自动建表
sqoop import \
--connect jdbc:mysql://192.168.2.109:3306/db01 \
--username root \
--password 123456 \
--target-dir /user/teacher \
--fields-terminated-by "\t" \
--columns tno,tsex \
--table teachers \
-m 1
导入scores表中小于80分的数据到hdfs
sqoop import \
--connect jdbc:mysql://192.168.153.1:3306/db01 \
--username root \
--password 123456 \
--target-dir /user/scores \
--fields-terminated-by " " \
--query 'select * from scores where degree <80 and $CONDITIONS' \
#提示:必须加 '$CONDITIONS' 如果query后面是双引号,必须加\转义字符,避免shell把CONDITIONS当成变量
-m 1
追加导入
sqoop import \
--append \
--connect jdbc:oracle:thin:@192.168.153.1:1521/orcl \
--username scott \
--password tiger \
--table DEPT2 \
--target-dir /user/hive/warehouse/bigdata.db/dept \
--fields-terminated-by ',' \
-m 1
增量导入
第一次把数据导 入后,以后就只能增量导入了,不然数据会有重复
导入t1表所有数据
sqoop import \
--connect jdbc:oracle:thin:@192.168.2.133:1521/orcl \
--username scott \
--password 123456 \
--table T1 \
--incremental append \ #增量导入的模式
--check-column id \ ##增量导入的字段
--last-value 12 \ #从这个数值后为增量数据
--target-dir /user/hive/warehouse/mydb2.db/T1 \
--fields-terminated-by ',' \
--m 1
导入t1表id从6开始后的数据
sqoop import \
--connect jdbc:mysql://192.168.153.1:3306/db01 \
--username root \
--table t1 \
--password 123456 \
--incremental append \
--check-column id \
--target-dir /user/hive/warehouse/bigdata.db/t1 \
--last-value 18 \
-m 1
#--check-column 检查的字段 有主键用主键判断,没有主键用时间判断
#--last-value 最后一次的值
#--incremental append 自增追加
使用脚本
dept表 oracle导入到hive
#!/bin/bash
echo "删除导入记录"
hadoop fs -rm -r /user/root/DEPT
hive -e "drop table if exists bigdata.dept"
sleep 5s
echo "全量导入"
sqoop import --hive-import --connect jdbc:oracle:thin:@192.168.153.1:1521/orcl --username scott --password tiger --table DEPT --hive-database bigdata --fields-terminated-by ','
sleep 5s
hive -e "select * from bigdata.dept"
脚本(增量导入)
#!/bin/bash
max_id=`hive -e 'select ceil(max(id)) from mydb2.c1;'`
max_id=${max_id:3}
#输出最大值
echo '输出最大值:'$max_id
sqoop import \
--connect jdbc:oracle:thin:@192.168.2.133:1521/orcl \
--username scott \
--password 123456 \
--table C1 \
--incremental append \
--check-column id \
--last-value $max_id \
--target-dir /user/hive/warehouse/mydb2.db/c1 \
--fields-terminated-by ',' \
--m 1
导出数据
在Sqoop中,“导出”概念指:从大数据集群(HDFS,HIVE,HBASE)向非大数据集群(RDBMS)中传输数据,叫做:导出,即使用export关键字。(导出需要在关系数据库中自己建表)
sqoop export \
--connect jdbc:oracle:thin:@192.168.153.1:1521/orcl \
--username scott \
--password tiger \
--table T1 \
--export-dir /user/hive/warehouse/t01 \
--input-fields-terminated-by ","