Sqoop是一个用于在Hadoop和关系数据库或大型机之间传输数据的工具。
您可以使用Sqoop将关系数据库管理系统(RDBMS)中的数据导入Hadoop分布式文件系统(HDFS),在Hadoop MapReduce中转换数据,然后将数据导出回RDBMS。
Sqoop自动化了这个过程的大部分,它依赖于数据库来描述要导入的数据的模式。Sqoop使用MapReduce导入和导出数据,提供并行操作和容错

使用Sqoop,您可以将数据从关系数据库系统或大型机导入HDFS。导入过程的输入要么是数据库表,要么是大型机数据集。对于数据库,Sqoop将逐行将表读入HDFS。对于大型机数据集,Sqoop将从每个大型机数据集中读取记录到HDFS。这个导入过程的输出是一组文件,其中包含导入的表或数据集的副本。导入过程是并行执行的。由于这个原因,输出将在多个文件中。这些文件可以是带分隔符的文本文件(例如,用逗号或制表符分隔每个字段),也可以是包含序列化记录数据的二进制Avro或sequencefile。导入过程的副产品是生成的Java类,该类可以封装导入表的一行。该类在导入过程中由Sqoop本身使用。还为您提供了该类的Java源代码,以便在后续的MapReduce数据处理中使用。该类可以在SequenceFile格式之间序列化和反序列化数据。它还可以解析记录的分隔文本形式。这些功能允许您快速开发使用处理管道中存储的hdfs记录的MapReduce应用程序。您还可以使用自己喜欢的任何其他工具自由地解析delimiteds记录数据。在操作导入的记录之后(例如,使用MapReduce或Hive),您可能有一个结果数据集,然后可以将其导出回关系数据库。
Sqoop的导出过程将并行地从HDFS读取一组带分隔符的文本文件,将它们解析为记录,并将它们作为新行插入目标数据库表中,供外部应用程序或用户使用。
Sqoop还包含一些其他命令,允许您检查正在使用的数据库。例如,可以列出可用的数据库模式(使用sqop -list-databases工具)和模式中的表(使用sqop -list-tables工具)。
Sqoop还包括一个基本的SQL执行shell (sqop -eval工具)。导入、代码生成和导出过程的大多数方面都可以定制。对于数据库,可以控制导入的特定行范围或列。
您可以为基于文件的数据表示以及使用的文件格式指定特定的分隔符和转义字符。您还可以控制生成代码中使用的类名或包名。

sqoop-import

导入工具将单个表从RDBMS导入到HDFS。表中的每一行在HDFS中都表示为一条单独的记录。记录可以存储为文本文件(每行一条记录),或者以Avro或sequencefile的二进制表示形式存储。

--append                                  将数据追加到HDFS中的现有数据集
--as-avrodatafile 将数据导入Avro数据文件
--as-sequencefile 将数据导入到sequencefile
--as-textfile 以纯文本形式导入数据(默认)
--as-parquetfile 导入数据到拼花文件
--boundary-query <statement> 用于创建分割的边界查询
--columns <col,col,col…> 要从表导入的列
--delete-target-dir 如果导入目标目录存在,则删除它
--direct 如果数据库存在,请使用直接连接器
--fetch-size <n> 一次从数据库读取的条目数。
--inline-lob-limit <n> 设置内联LOB的最大大小
-m,--num-mappers <n> 使用n个map任务并行导入
-e,--query <statement> 导入语句的结果。
--split-by <column-name> 用于分割工作单元的表的列。不能与——autoreset-to-one-mapper选项一起使用。
--autoreset-to-one-mapper 如果一个表没有主键,也没有提供split-by列,那么导入应该使用一个映射器。不能与——split-by 选项一起使用。
--table <table-name> 表名
--target-dir <dir> HDFS目的地dir
--warehouse-dir <dir> 表目标的HDFS父节点
--where <where clause> 进口时使用WHERE子句
-z,--compress 启用压缩
--compression-codec <c> 使用Hadoop编解码器(默认gzip)
--null-string <null-string> 要为字符串列的空值编写的字符串
--null-non-string <null-string> 要为非字符串列的空值编写的字符串

输出行格式化参数:

--enclosed-by <char>                 设置所需字段的封闭字符
--escaped-by <char> 设置转义字符
--fields-terminated-by <char> 设置字段分隔符
--lines-terminated-by <char> 设置行尾字符
--mysql-delimiters 使用MySQL默认的分隔符集:fields:, lines: \n escape -by: \ option - closed-by: '
--optionally-enclosed-by <char> 设置包含字符的字段

hive 的参数

--hive-home <dir>                 覆盖HIVE_HOME
--hive-import 将表导入到Hive中(如果没有设置任何分隔符,则使用Hive的默认分隔符)。
--hive-overwrite 重写Hive表中的现有数据。
--create-hive-table 如果设置好,表存在,则任务将在目标hive中失败 。默认情况下,此属性为false。
--hive-table <table-name> 设置导入到Hive时要使用的表名。
--hive-drop-import-delims 将\n、\r和\01从字符串字段导入Hive时删除。
--hive-delims-replacement 当导入到Hive时,用用户定义的字符串替换字符串字段中的\n、\r和\。
--hive-partition-key 要分区的hive字段的名称被分片
--hive-partition-value <v> String-value作为该作业中导入到hive的分区键。
--map-column-hive <map> 为已配置列重写从SQL类型到Hive类型的默认映射。

sqoop-export

导出工具将一组文件从HDFS导出回RDBMS。目标表必须已经存在于数据库中。根据用户指定的分隔符,读取输入文件并将其解析为一组记录。
默认操作是将这些转换为一组INSERT语句,将记录注入数据库。在“更新模式”中,Sqoop将生成更新语句来替换数据库中的现有记录,在“调用模式”中,Sqoop将对每个记录执行存储过程调用。

常见的参数

--connect <jdbc-uri>                    指定JDBC连接字符串
--connection-manager <class-name> 指定要使用的连接管理器类
--driver <class-name> 手动指定要使用的JDBC驱动程序类
--hadoop-mapred-home <dir> 覆盖HADOOP_MAPRED_HOME美元
--help 打印使用说明
--password-file 为包含身份验证密码的文件设置路径
-P 从控制台读取密码
--password <password> 设置身份验证密码
--username <username> 设置身份验证的用户名
--verbose 工作时打印更多信息
--connection-param-file <filename> 提供连接参数的可选属性文件

导出的控制参数

--columns <col,col,col…>                            要导出到表中的列
--direct 使用直接导出快速路径
--export-dir <dir> 导出的HDFS源路径
-m,--num-mappers <n> 使用n个map任务并行导出
--table <table-name> 表名
--call <stored-proc-name> 要调用的存储过程
--update-key <col-name> 用于更新的锚列。如果有多个列,则使用逗号分隔的列列表。
--update-mode <mode> 指定在数据库中发现具有不匹配键的新行时如何执行更新。模式的合法值包括updateonly(默认值)和allowinsert。"
--input-null-string <null-string> 要解释为空的字符串用于字符串列
--input-null-non-string <null-string> 对于非字符串列,要解释为null的字符串
--staging-table <staging-table-name> 将数据暂存于其中的表,然后插入目标表。
--clear-staging-table 指示可以删除登台表中存在的任何数据。
--batch 使用批处理模式执行底层语句。

说明:

需要—export-dir参数和—table或—调用中的一个。它们指定要填充到数据库中的表(或要调用的存储过程),以及包含源数据的HDFS目录。
默认情况下,表中的所有列都选择导出。您可以选择列的子集,并使用——columns参数控制它们的顺序。这应该包括要导出的列的逗号分隔列表。例如:——列“col1,col2,col3”。注意,没有包含在——columns参数中的列需要定义默认值或允许空值。否则,数据库将拒绝导入的数据,从而导致Sqoop作业失败。
您可以独立于目录中文件的数量控制映射器的数量。导出性能取决于并行度。默认情况下,Sqoop将为导出过程并行使用四个任务。这可能不是最优的;您需要对自己的特定设置进行试验。额外的任务可能提供更好的并发性,但是如果数据库已经在更新索引、调用触发器等方面遇到瓶颈,那么额外的负载可能会降低性能。- nummappers或-m参数控制映射任务的数量,这是使用的并行度。
一些数据库还为导出提供了直接模式。使用——direct参数指定这个代码路径。
——input-null-string和——input-null-non-string参数是可选的。如果——input-null-string没有指定,那么字符串“null”将被解释为string类型列的null。如果——input-null-non-string没有指定,那么字符串“null”和空字符串都将被解释为非字符串列的null。注意,对于非字符串列,空字符串总是被解释为null,如果使用——input-null-non-string指定其他字符串,则空字符串将被解释为null。
由于Sqoop将导出过程分解为多个事务,所以失败的导出作业可能导致部分数据提交到数据库。这可能进一步导致后续作业在某些情况下由于插入冲突而失败,或者在其他情况下导致数据重复。

您可以通过—stage -table选项指定一个staging表来克服这个问题,—stage -table选项充当一个辅助表,用于对导出的数据进行分段。阶段数据最终在单个事务中移动到目标表。
为了使用登台功能,您必须在运行导出作业之前创建登台表。此表的结构必须与目标表相同。这个表应该在导出作业运行之前为空,或者必须指定——clear- stage -table选项。如果staging表包含数据,并且指定了——clear- stage -table选项,Sqoop将在启动导出作业之前删除所有数据。

sqoop 支持的数据库

Database      version        --direct support           connect string matches
HSQLDB 1.8.+ No jdbc:hsqldb:*//
MySQL 5.0+ Yes jdbc:mysql://
Oracle 10.2.+ No jdbc:oracle:*//
PostgreSQL 8.3+ Yes (import only) jdbc:postgresql://
CUBRID 9.2+ NO jdbc:cubrid:*

源库是oracle

1.全表导入

sqoop import   \
--connect "jdbc:oracle:thin:@192.168.xxx.xxx:1521:CMIS" \
--username="glloans" \
--password="glloans" \
--outdir \/BIG_DATA/tmp/.sqoop/java/ \
--table "GLLOANS_XF.LM_ACCT_INFO" \
--columns "LOAN_NO,ACCT_BANK_CDE,ACCT_BCH_CDE,LOAN_ACCT_TYP,ACCT_NO,ACCT_NAME,ACCT_VAL_DT,ACCT_CREATE_DT,ACCT_EXPIRY_DT,ACCT_RMK,ATPY_STS" \
-m \
--hive-import \
--delete-target-dir \
--hive-overwrite \
--hive-table "SDATA.LM_ACCT_INFO" \
--hive-partition-key "dt" \
--hive-partition-value "" \
--hive-drop-import-delims \
--fields-terminated-by "\001" \
--lines-terminated-by "\n" \
--null-string "\\\N" \
--null-non-string "\\\N"

hive-drop-import-delims     --将\n、\r和\01从字符串字段导入Hive时删除。
null-string                        --要为字符串列的空值编写的字符串
null-non-strin                   --要为非字符串列的空值编写的字符串
delete-target-dir              --如果导入目标目录存在,则删除

2.条件查询导入

sqoop import \
--connect "jdbc:oracle:thin:@192.168.xxx.xxx:1521:CMIS" \
--username="glloans"
--password="glloans" \
--outdir \/BIG_DATA/tmp/.sqoop/java/ \
--table "GLLOANS.INTF_TRADE_LOAN_LOG" \
--columns "GEN_GL_NO,TX_LOG_SEQ,LOAN_NO,LOAN_CONT_NO,BCH_CDE,TX_DT,TX_TIME,TX_TYP,HOST_TX_NO,HOST_TX_DT" \
-m \
--hive-import \
--hive-overwrite \
--hive-table "SDATA.INTF_TRADE_LOAN_LOG" \
--hive-partition-key "dt" \
--hive-partition-value "" \
--where "SUBSTR(TX_DT,1,4)||SUBSTR(TX_DT,6,2)||SUBSTR(TX_DT,9,2)='20190504'" \
--hive-drop-import-delims \
--fields-terminated-by "\001" \
--lines-terminated-by "\n" \
--null-string "\\\N"
--null-non-string "\\\N"

3.查询关联

sqoop import   \
--connect "jdbc:oracle:thin:@192.168.xxx.xxx:1521:CMIS" \
--username="glloans" \
--password="glloans" \
--outdir \/BIG_DATA/tmp/.sqoop/java/ \
-m \
--hive-import \
--hive-overwrite \
--target-dir /user/taskctl/GLLOANS_XF.LM_WV_FEE_DTL_T \
--hive-table "SDATA.LM_WV_FEE_DTL_T" \
--hive-partition-key "dt" \
--hive-partition-value "" \
--query "select GEN_GL_NO,SEQ_NO,WV_TX_LOG_SEQ from glloans.LM_WV_FEE_DTL_T t1 WHERE exists (select t2.GEN_GL_NO
from glloans.LM_WV_FEE_T t2 where t1.GEN_GL_NO = t2.GEN_GL_NO and t2.ADJ_DT=TO_CHAR(TO_DATE(20190504,'YYYY-MM-DD'),'YYYY-MM-DD')) AND \$CONDITIONS" \
--hive-drop-import-delims \
--fields-terminated-by "\001" \
--lines-terminated-by "\n" \
--null-string "\\\N" \
--null-non-string "\\\N"

(2)源库是mysql

1.全表抽取

 sqoop import   \
--connect "jdbc:mysql://192.168.xxx.xxx:3306/mysqldb" \
--username="user" \
--password="password" \
--outdir \/BIG_DATA/tmp/.sqoop/java/ \
--table "MCS_UPSTREAM" \
--columns "MU_COMMAND_ID,MU_COMMAND,MU_COMMAND_TYPE,MU_MOBILE,MU_EXT,MU_CONTENT,MU_TIME,MU_CREATETIME" \
-m \
--hive-import \
--delete-target-dir \
--hive-overwrite \
--hive-table "SDATA.MCS_UPSTREAM" \
--hive-partition-key "dt" \
--hive-partition-value "" \
--hive-drop-import-delims \
--fields-terminated-by "\001" \
--lines-terminated-by "\n" \
--null-string "\\\N" \
--null-non-string "\\\N"

2.增量抽取

sqoop import   \
--connect "jdbc:mysql://192.168.xxx.xxx:3306/mysqldb" \
--username="user" \
--password="password" \
--outdir \/BIG_DATA/tmp/.sqoop/java/ \
--table "MCS_MSG_WX" \
--columns "MMW_WXID,MMW_MODELCODE,MMW_MESSAGE,MMW_MOBILE,MMW_CERTNO,MMW_SENDFLAG,MMW_SENDDATE,MMW_SENDTIME,MMW_STATE,MMW_CHANNEL,MMW_RETCODE,MMW_CREATETIME,LAST_CHG_DT" \
-m \
--hive-import \
--delete-target-dir \
--hive-overwrite \
--hive-table "SDATA.MCS_MSG_WX" \
--hive-partition-key "dt" \
--hive-partition-value "" \
--where "concat(substr(MMW_CREATETIME,1,4),substr(MMW_CREATETIME,6,2),substr(MMW_CREATETIME,9,2))='20190504'" \
--hive-drop-import-delims \
--fields-terminated-by "\001" \
--lines-terminated-by "\n" \
--null-string "\\\N" \
--null-non-string "\\\N"

3.条件抽取

sqoop import   \
--connect "jdbc:mysql://192.168.xxx.xxx:3306/mysqldb" \
--username="user" \
--password="password" \
--outdir \/BIG_DATA/tmp/.sqoop/java/ \
-m \
--hive-import \
--hive-overwrite \
--target-dir /user/taskctl/MCS_MSG_WARN_MOBILE \
--hive-table "SDATA.S101_MCS_MSG_WARN_MOBILE" \
--hive-partition-key "dt" \
--hive-partition-value "" \
--query "select * from mcs.MCS_MSG_WARN_MOBILE where date_format(LAST_CHG_DT,'%Y%m%d')='20190504' AND \$CONDITIONS" \
--hive-drop-import-delims \
--fields-terminated-by "\001" \
--lines-terminated-by "\n" \
--null-string "\\\N" \
--null-non-string "\\\N"

sqoop1.4.6 用法总结一的更多相关文章

  1. [sqoop1.99.7] sqoop入门-下载、安装、运行和常用命令

    一.简介 Apache Sqoop is a tool designed for efficiently transferring data betweeen structured, semi-str ...

  2. EditText 基本用法

    title: EditText 基本用法 tags: EditText,编辑框,输入框 --- EditText介绍: EditText 在开发中也是经常用到的控件,也是一个比较必要的组件,可以说它是 ...

  3. jquery插件的用法之cookie 插件

    一.使用cookie 插件 插件官方网站下载地址:http://plugins.jquery.com/cookie/ cookie 插件的用法比较简单,直接粘贴下面代码示例: //生成一个cookie ...

  4. Java中的Socket的用法

                                   Java中的Socket的用法 Java中的Socket分为普通的Socket和NioSocket. 普通Socket的用法 Java中的 ...

  5. [转载]C#中MessageBox.Show用法以及VB.NET中MsgBox用法

    一.C#中MessageBox.Show用法 MessageBox.Show (String) 显示具有指定文本的消息框. 由 .NET Compact Framework 支持. MessageBo ...

  6. python enumerate 用法

    A new built-in function, enumerate() , will make certain loops a bit clearer. enumerate(thing) , whe ...

  7. [转载]Jquery中$.get(),$.post(),$.ajax(),$.getJSON()的用法总结

    本文对Jquery中$.get(),$.post(),$.ajax(),$.getJSON()的用法进行了详细的总结,需要的朋友可以参考下,希望对大家有所帮助. 详细解读Jquery各Ajax函数: ...

  8. 【JavaScript】innerHTML、innerText和outerHTML的用法区别

    用法: <div id="test">   <span style="color:red">test1</span> tes ...

  9. chattr用法

    [root@localhost tmp]# umask 0022 一.chattr用法 1.创建空文件attrtest,然后删除,提示无法删除,因为有隐藏文件 [root@localhost tmp] ...

随机推荐

  1. CockroachDB学习笔记——[译]为什么Go语言是CockroachDB的正确选择

    原文链接:https://www.cockroachlabs.com/blog/why-go-was-the-right-choice-for-cockroachdb/ 原作者:Jessica Edw ...

  2. 基于LSTM + keras 的诗歌生成器

        最近在github 上发现了一个好玩的项目,一个基于LSTM + keras 实现的诗歌生成器,地址是:https://github.com/youyuge34/Poems_generator ...

  3. Docker-compose容易忽略的使用细节

    Docker-compose是docker官方的开源项目,通过使用模版yaml文件,实现对docker容器集群的管理.具体教程可以通过官方地址进行实践.Docker-compose主要有两个重要的概念 ...

  4. LeetCode刷题1——只出现一次的数字

    一.题目要求 二.题目背景 位运算:或,异或,与,移位 三.解题思路 (1)要求算法时间复杂度是线性的,O(n),想到的是先将列表排序,排序后相同的数值两两之间前后相邻,进行偶数次循环,判断两两数值是 ...

  5. Vulnhub-XXE靶机学习

    ------------恢复内容开始------------ 前两天在微信公众号上看见了这个XXE靶场,就想试一试,虽然网上关于这个的文章已经写了太多太多了,但还是要写出来划划水,233333333, ...

  6. manjaro Docker环境配置记

    1.系统配置如下: ‘by: /home/inkhin/桌面/深度截图_选择区域_20191004145104.png [吐槽: ChromeLinux版居然不能用博客园TinyMce的上传图片功能] ...

  7. Hadoop学习笔记之三 数据流向

    http://hadoop.apache.org/docs/r1.2.1/api/index.html 最基本的: 1. 文本文件的解析 2. 序列文件的解析 toString会将Byte数组中的内存 ...

  8. Web应用搭建

    Web应用搭建 *资料库 http://www.oschina.net/project/tag/308/server-suite * web环境 http://www.freebuf.com/tool ...

  9. 使用Navicat为数据库表建立触发器

    打开Navicat   打开数据表所在的数据库,右击需要新增字段的数据库表,然后点击[设计表]   此时进入表设计界面   点击[触发器]标签页,输入触发器名称,如trigger1   选择触发条件, ...

  10. DISCO Presents Discovery Channel Code Contest 2020 Qual Task E. Majority of Balls

    Not able to solve this problem during the contest (virtual participation). The first observation is ...