欢迎您访问程序员文章站本站旨在为大家提供分享程序员计算机编程知识!
您现在的位置是: 首页  >  IT编程

SQOOP的使用方法

程序员文章站 2023-10-27 09:18:28
Sqoop是个命令行工具,用来在Hadoop和rdbms之间传输数据。以Hadoop的角度看待数据流向,从rdbms往Hadoop是导入用sqoop import命令,反之从hadoop往rdbms下发数据用sqoop export命令以oracle hive为例子,命令举例:sqoop impor... ......

sqoop是个命令行工具,用来在hadoop和rdbms之间传输数据。

以hadoop的角度看待数据流向,从rdbms往hadoop是导入用sqoop import命令,反之从hadoop往rdbms下发数据用sqoop export命令

以oracle hive为例子,命令举例:

sqoop import -d oraoop.jdbc.url.verbatim=true --hive-import --hive-overwrite --connect jdbc:oracle:thin:@192.168.1.10:1521:orcl --username usernamexx --password passwdxx --table wh_prg.tb_jsq_prd_grid_mdf -hive-database test --hive-table hivename  --fetch-size 5000 --hive-drop-import-delims --null-string '\\n' --null-non-string '\\n' -m 1
sqoop export -d oraoop.jdbc.url.verbatim=true --connect "jdbc:oracle:thin:@192.168.1.10:1521:orcl" --username usernamexx --password passwdxx --table  oracletable  --export-dir /user/hive/warehouse/test.db/tablename/* --input-fields-terminated-by '\001' --input-lines-terminated-by '\n' --input-null-string '\\n' --input-null-non-string '\\n'   -m 1

注意:

oracle表名大写,hive表名保持和创建表时候的大小写,建表是大写,这儿就大写,建表时候小写,这儿就小写  

-m 1表示并行度,根据oracle库的性能自行决定

导入的时候是默认覆盖,如果hive中有同名表,会自动删除重建

导出的时候是追加,要先在oracle测建好空表,而且再次导入时候要把原来的内容清空,否则因为是追加数据会产生重复数据,字段顺序要对齐,否则可能产生列的错位

附1:sqoop导入常规参数意思

参数 参数名称
others     插件命令附加参数
target-dir     导入hdfs的目标路径
delete-target-dir    如果指定目录存在,则先删除掉
fetch-size    从数据库中批量读取记录数
split-by    按照指定列去分割数据
columns        从表中导出指定的一组列的数据
null-string    字符串类型null时转义为
null-non-string    非字符串类型null时转义为
query    查询语句
where    查询条件
direct    使用直接导出模式(优化速度)
warehouse-dir    hdfs存放表的根路径
append        将数据追加到hdfs上一个已存在的数据集上
as-avrodatafile    将数据导入到avro
as-sequencefile    将数据导入到sequencefile
as-textfile    将数据导入到普通文本文件(默认)
boundary-query    边界查询,用于创建分片(inputsplit)
direct-split-size    分割输入stream的字节大小(在直接导入模式下)
inline-lob-limit    设置内联的lob对象的大小
compress        启用压缩
compression-codec    指定hadoop的codec方式(默认gzip)
incremental        mode模式
last-value        指定自从上次导入后列的最大值
connect            指定jdbc连接字符串
connection-manager    指定要使用的连接管理器类
driver            指定要使用的jdbc驱动类
username        设置认证用户名
password        设置认证密码
verbose            打印详细的运行信息
connection-param-file    可选,指定存储数据库连接参数的属性文件
hadoop-home        hadoop-home的路径
enclosed-by        字段值前后加上指定的字符
escaped-by        双引号作转义处理
fields-terminated-by    字段分隔符
lines-terminated-by    行分隔符
optionally-enclosed-by    强制给字段值前后都加上指定符号
mysql-delimiters    mysql默认的分隔符
input-enclosed-by    对字段值前后指定的字符进行解析
input-escaped-by    对含有转义双引号的字段值作转义处理
input-escaped-by    导入使用的字段分隔符
input-lines-terminated-by    导入使用的行分隔符
input-optionally-enclosed-by    导入时强制给字段值前后都加上指定符号
bindir            生成的java文件、class文件及打包为jar的jar包文件输出路径
class-name        生成的java文件指定的名称
jar-file        合并时引入的jar包
outdir    生成的java文件存放路径
package-name    包名
map-column-java    映射的数据类型
table    关系数据库表名
num-mappers    启动map的数量,默认是4个

附2:sqoop的import工具抽数的几种情况
1. hive表无分区,全量从oracle中抽取数据到hive的表中
sqoop import -d mapred.job.queue.name=root.myqueue    \
–connect jdbc:oracle:thin:@192.168.1.128:1521:mydatabase   \
–username jsz                                       \
–password 123456                                     \
–table  mys.test               \
–columns id,name,age,salary,data_date \
-m 1                                                             \
–hive-table default.test  \
–create-hive-table \
–hive-drop-import-delims                                        \
–verbose                                                           \
–fetch-size 5000                                                \
–target-dir  /apps/testdata/default/test \
–delete-target-dir \
–hive-overwrite         \
–null-string ‘\\n’      \
–null-non-string ‘\\n’  \
–hive-import;
2. hive表有分区,增量从oracle中抽取数据到hive表中:
sqoop import -d mapred.job.queue.name=root.myqueue   \
–connect jdbc:oracle:thin:@192.168.1.128:1521:mydatabase   \
–username jsz                                       \
–password 123456                                     \
–table  mys.test              \
–columns id,name,age,salary,lcd \
-m 1                                          \
–hive-partition-key op_day                  \
–hive-partition-value 20160525               \
–where “lcd >= trunc(to_date(‘20160525′,’yyyy-mm-dd’),’dd’) and lcd < trunc(to_date(‘20160526′,’yyyy-mm-dd’),’dd’)”  \
–hive-table default.test_partition  \
–create-hive-table \
–hive-drop-import-delims                                        \
–verbose                                                           \
–fetch-size 5000                                                \
–target-dir  /apps/testdata/default/test_partition \
–delete-target-dir \
–hive-overwrite         \
–null-string ‘\\n’      \
–null-non-string ‘\\n’  \
–hive-import;
3.使用select语句:
sqoop import                            \
-d mapred.job.queue.name=root.myqueue      \
-d oracle.sessiontimezone=america/los_angeles  \
–connect jdbc:oracle:thin:@192.168.1.128:1521:mydatabase    \
–username jsz   \
–password 123456  \
–query “select id,name,age,salary,data_date from mys.test where id = ‘10086’ and \$conditions” \
–verbose  \
–fetch-size 5000       \
–hive-table default.test  \
–target-dir  /apps/testdata/default/test \
–delete-target-dir \
–fields-terminated-by ‘\001’      \
–lines-terminated-by ‘\n’      \
-m 1           \
–hive-import           \
–hive-overwrite           \
–null-string   ‘\\n’            \
–null-non-string  ‘\\n’           \
–hive-drop-import-delims

sqoop的export工具导数的情况:

将hive的数据导入oracle,整个过程分为三步:

1) 删除oracle表的历史数据
sqoop eval  -d mapred.job.queue.name=root.myqueue    \
–connect jdbc:oracle:thin:@192.168.1.128:1521:mydatabase  \
–username jsz    \
–password 123456  \
–verbose                       \
–e “delete from mys.test”
2) hive导出到hdfs指定路径
hive -e “use default;set mapred.job.queue.name=root.myqueue;set hive.insert.into.multilevel.dirs=true;insert overwrite directory ‘/apps/testdata/default/test’ select id,name,age,salary,data_date from default.test;”
3) 将hdfs的数据导入到oracle中
sqoop export    \
-d mapred.job.queue.name=root.myqueue     \
-d mapred.task.timeout=0     \
–connect jdbc:oracle:thin:@192.168.1.128:1521:mydatabase     \
–username jsz     \
–password 123456    \
–table mys.test     \
–columns id,name,age,salary,data_date     \
–export-dir /apps/testdata/default/test     \
–verbose     \
–input-null-string ‘\\n’     \
–input-null-non-string ‘\\n’  \
–input-fields-terminated-by ‘\001’     \
–input-lines-terminated-by ‘\n’     \
-m 1