Sqoop 是一款开源的工具,主要用于在 Hadoop(Hive)与传统的数据库(mysql、postgresql...)间进行数据的传递,可以将一个关系型数据库(例如 : MySQL ,Oracle ,Postgres 等)中的数据导进到 Hadoop 的 HDFS 中,也可以将 HDFS 的数据导进到关系型数据库中。Sqoop 项目开始于 2009 年,最早是作为 Hadoop 的一个第三方模块存在,后来为了让使用者能够快速部署,也为了让开发人员能够更快速的迭代开发,Sqoop 独立成为一个 Apache项目。
Sqoop2 的最新版本是 1.99.7。请注意,2 与 1 不兼容,且特征不完整,它并不打算用于生产部署
第一步:解压
第二步:修改配置文件
## 修改配置文件名称
mv sqoop-env-template.sh sqoop-env.sh
## 修改sqoop-env.sh配置
export HADOOP_COMMON_HOME=/usr/local/hadoop-2.7.2
export HADOOP_MAPRED_HOME=/usr/local/hadoop-2.7.2
export HIVE_HOME=/usr/local/hive
export ZOOKEEPER_HOME=/usr/local/zookeeper-3.4.10
export ZOOCFGDIR=/usr/local/zookeeper-3.4.10
export HBASE_HOME=/usr/local/hbase
## 拷贝驱动
## 拷贝 jdbc 驱动到 sqoop 的 lib 目录下,如
cp mysql-connector-java-5.1.27-bin.jar /usr/local/sqoop-1.4.6/lib/
全部导入
sqoop import \
--connect jdbc:mysql://hadoop102:3306/company --username root --password 000000 \
--table staff \ ## 以上全为MySQL参数,以下全为HDFS参数
--target-dir /user/company \
--delete-target-dir \ ## 导前判断target-dir目录是否存在,存在则删除
--num-mappers 1 \
--fields-terminated-by "\t"
查询导入 --------结尾必须带有
$CONDITIONS
bin/sqoop import \
--connect jdbc:mysql://hadoop102:3306/company --username root --password 000000 \
--target-dir /user/company \
--delete-target-dir \
--num-mappers 1 \
--fields-terminated-by "\t" \
--query 'select name,sex from staff where id <=1 and $CONDITIONS;'
## 注意:
使用--query的时候SQL语句结尾必须带有 `$CONDITIONS` ,且SQL语句使用单引号‘’括起来
如果SQL语句使用的是双引号“”,则$CONDITIONS 前必须加转移符,防止 shell 识别为自己的变量
--query "select name,sex from staff where id <=1 and \$CONDITIONS;"
导入指定列 -------- columns中如果涉及到多列,用逗号分隔,分隔时不要添加空格
bin/sqoop import \
--connect jdbc:mysql://hadoop102:3306/company --username root --password 000000 \
--target-dir /user/company \
--delete-target-dir \
--num-mappers 1 \
--fields-terminated-by "\t" \
--columns id,sex \
--table staff
使用sqoop 关键字筛选查询导入数据
bin/sqoop import \
--connect jdbc:mysql://hadoop102:3306/company --username root --password 000000 \
--target-dir /user/company \
--delete-target-dir \
--num-mappers 1 \
--fields-terminated-by "\t" \
--table staff \
--where "id=1"
==注意:==该过程分为两步: 第一步将数据导入到
HDFS
第二步将导入到HDFS
的数据迁移到Hive
仓库,第一步默认的临时目录是/user/用户名/表名,下方真实场景中已经配置
$ bin/sqoop import \
--connect jdbc:mysql://hadoop102:3306/company --username root --password 000000 \
--table staff \
--num-mappers 1 \
--hive-import \
--fields-terminated-by "\t" \ ## 设定每个字段是以什么符号作为结束,默认为逗号
--hive-overwrite \
--hive-table staff_hive
真实场景 提示: 如果在导入后发现数据错位了,或者有好多原来有值的字段都变成了NULL, 这是因为你原表varchar类型的字段中可能含有\n\r等一些特殊字符。则加上
hive-drop-import-delims
sqoop import --connect 'jdbc:mysql://localhost:3306/test?characterEncoding=utf8' \
--username root \
--password root \
--table table \ ## 以上为MySQL参数,以下为Hive参数
--target-dir /user/root/table_20201218 \
--delete-target-dir \
--hive-overwrite \
--hive-import \
--hive-table ndwt.table_20201218 \
--m 1 \
--hive-drop-import-delims
## 导完之后修复刷新数据
#dynamic parition repair
hive -e "msck repair table ndwt.table_20201218;"
#impala metadata refresh
impala-shell -q "invalidate metadata ndwt.table_20201218;"
sqoop1.4.6 只支持 HBase1.0.1 之前的版本的自动创建 HBase 表的功能
bin/sqoop import \
--connect jdbc:mysql://hadoop102:3306/company --username root --password 000000 \
--table company \
--columns "id,name,sex" \
--column-family "info" \
--hbase-create-table \
--hbase-row-key "id" \
--hbase-table "hbase_company" \
--num-mappers 1
增量导入数据到 hive 中,mode=append
--check-column:
用来指定一些列,这些列在增量导入时用来检查这些数据是否作为增量数据进行导入,和关系型数据库中的自增字段类似. 注意:这些被指定的列的类型不能使任意字符类型,如char、varchar等类型都是不可以的,同时–check-column可以去指定多个列--incremental:
用来指定增量导入的模式,两种模式分别为Append和Lastmodified--last-value:
指定上一次导入中检查列指定字段最大值 ==提示:==append 不能与–hive-等参数同时使用
bin/sqoop import \
--connect jdbc:mysql://hadoop102:3306/company \
--username root \
--password root \
--table staff \
--num-mappers 1 \
--fields-terminated-by "\t" \
--target-dir /user/hive/warehouse/staff_hive \
--check-column id \ ## 指定增量字段可以指定多个
--incremental append \
--last-value 3
增量导入数据到 hdfs 中,mode=lastmodified ==提示:==使用 lastmodified 方式导入数据要指定增量数据是要–append(追加)还是要 --merge-key(合并) ==提示:==last-value 指定的值是会包含于增量导入的数据中
$ bin/sqoop import \
--connect jdbc:mysql://hadoop102:3306/company \
--username root \
--password 000000 \
--table staff_timestamp \
--check-column last_modified \
--incremental lastmodified \
--last-value "2017-09-28 22:20:38" \
--m 1 \
--append
如果Mysql 中表不存在,不会自动创建
bin/sqoop export \
--connect jdbc:mysql://hadoop102:3306/company --username root --password 000000 \
--table staff \
--num-mappers 1 \
--export-dir /user/hive/warehouse/staff_hive \
--input-fields-terminated-by "\t"
真实场景:此处为shell脚本 先清空表,再导入
## eval 查看 SQL 执行结果
sqoop eval --connect jdbc:mysql://localhost:3306/test --username root --password root \
--query "truncate table tablename;" \
;
sqoop export --connect jdbc:mysql://localhost:3306/test --username root --password root \
--table tablename \ ## 以上为MySQL参数,以下为Hive参数
--export-dir /user/hive/warehouse/dw/dwa/table/* \
--columns column1,column2,column3,column4 \
--fields-terminated-by '\001' \
--input-null-string "\\\\N" \
--input-null-non-string "\\\\N" \
--batch \ ## 批量导入
--m 4; ## 批量的map数,默认为4
https://www.cnblogs.com/xiaoliu66007/p/9633505.html
## 生成的java文件存放路径
–outdir <dir>
## 增量导
append和delete-target-dir是相互冲突的。
##在控制台打印出详细信息
--verbose
## 设定每个字段是以什么符号作为结束,默认为逗号
--fields-terminated-by
## 设定每行记录之间的分隔符,默认是\n
--lines-terminated-by
扫码关注腾讯云开发者
领取腾讯云代金券
Copyright © 2013 - 2025 Tencent Cloud. All Rights Reserved. 腾讯云 版权所有
深圳市腾讯计算机系统有限公司 ICP备案/许可证号:粤B2-20090059 深公网安备号 44030502008569
腾讯云计算(北京)有限责任公司 京ICP证150476号 | 京ICP备11018762号 | 京公网安备号11010802020287
Copyright © 2013 - 2025 Tencent Cloud.
All Rights Reserved. 腾讯云 版权所有