Sqoop基础教程

一、Sqoop导入

1、Sqoop参数使用方式

参数 描述
codegen 生成与数据库记录交互的代码
create-hive-table 创建表
eval 评估SQL语句并显示结果
export 将HDFS目录导出到数据库表
help 列出可用命令
import 数据库中的表导入HDFS
import-all-tables 将数据库中的表导入HDFS
import-mainframe 将主机数据集导入HDFS
list-databases 列出服务器列表中的可用数据库
list-tables 列出数据库中可用的表
#在命令行中使用参数选项
sqoop list-databases --connect jdbc:mysql://host0:3306 --username root --password 123456
#使用配置文件的方式
sqoop --options-file /root/list.txt

#vim list.txt
list-databases
--connect
jdbc:mysql://host0:3306
--username
root
--password
123456

2、sqoop-import

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

A、连接常见参数:

参数 描述
–connect 指定JDBC连接字符串
–connection-manager 指定要使用的连接管理器类
–driver 手动指定要使用的JDBC驱动程序类
–hadoop-mapred-home 覆盖$ HADOOP_MAPRED_HOME
–password-file 设置包含验证密码的文件的路径
-P 从控制台读取密码
–password 设置验证密码
–username 设置认证用户名
–verbose 工作时打印更多信息
–connection-param-file 提供连接参数的可选属性文件
–relaxed-isolation 将连接事务隔离设置为读取未提交的映射器。

验证参数

参数 描述
–validate 启用复制数据的验证,仅支持单表复制。
–validator 指定要使用的验证程序类。
–validation-threshold 指定要使用的验证阈值类。
–validation-failurehandler 指定要使用的验证失败处理程序类。

B、导入控制参数:

参数 描述
–append 将数据附加到HDFS中的现有数据集
–as-avrodatafile 将数据导入Avro数据文件
–as-sequencefile 将数据导入SequenceFiles
–as-textfile 以纯文本格式导入数据(默认)
–as-parquetfile 将数据导入Parquet文件
–boundary-query 用于创建拆分的边界查询
–columns <col,col,col…> 要从表导入的列
–delete-target-dir 删除导入目标目录(如果存在)
–direct 如果数据库存在,请使用直接连接器
–fetch-size 一次从数据库中读取的条目数。
–inline-lob-limit 设置内联LOB的最大大小
-m,–num-mappers 使用n个映射任务并行导入
-e,–query 导入结果statement
–split-by 用于拆分工作单位的表格列。不能与--autoreset-to-one-mapper选项一起使用
–split-limit 每个分割大小的上限。这仅适用于Integer和Date列。对于日期或时间戳字段,它以秒为单位计算
–autoreset-to-one-mapper 如果表没有主键且没有提供拆分列,则导入应使用一个映射器。不能与--split-by <col>选项一起使用
–table 要阅读的表格
–target-dir HDFS目的地目录
–temporary-rootdir 导入期间创建的临时文件的HDFS目录(覆盖默认的“_sqoop”)
–warehouse-dir 表格目的地的HDFS父级
–where 导入期间要使用的WHERE子句
-z,–compress 启用压缩
–compression-codec 使用Hadoop编解码器(默认gzip)
–null-string 要为字符串列的空值写入的字符串
–null-non-string 要为非字符串列的空值写入的字符串

--null-string--null-non-string参数都是可选的。\如果未指定,那么字符串“null”将被使用。

C、连接到数据库

sqoop import --connect jdbc:mysql://host0:3306/hive --username root --password 123456

D、自定义查询

#使用--query可以指定要使用表中的数据 注:value尽可能使用'',使用""需要在$前添加\,-m设置一次查询并发个数
sqoop import --query'SELECT a.*,b.* from a JOIN b on(a.id == b.id)WHERE id > 1202 and $CONDITIONS' -m 1 --split-by a.id --target -dir / user / foo / joinresults

D、控制类型映射

参数 描述
–map-column-java 为已配置的列覆盖从SQL到Java类型的映射。
–map-column-hive 为已配置的列覆盖从SQL到Hive类型的映射。
#在--map-column-hive选项中指定逗号,您应该使用URL编码的键和值,例如,使用DECIMAL(1%2C%201)而不是DECIMAL(1,1)。
sqoop import ... --map-column-java id = String,value = Integer

E、增量导入数据

Sqoop支持两种类型的增量导入:appendlastmodified。您可以使用该--incremental参数指定要执行的增量导入的类型。

参数 描述
–check-column (col) 指定在确定要导入的行时要检查的列。(该列不应为CHAR / NCHAR / VARCHAR / VARNCHAR / LONGVARCHAR / LONGNVARCHAR类型)
–incremental (mode) 指定Sqoop确定哪些行是新的。mode 包含appendlastmodified
–last-value (value) 指定上一个导入的检查列的最大值。

增量数据导入分两种,一是基于递增列的增量数据导入(Append方式)。二是基于时间列的增量数据导入(LastModified方式)

1、Append方式

例:有一个订单表,里面每个订单有一个唯一标识自增列ID,在关系型数据库中以主键形式存在。之前已经将id在0~5201314之间的编号的订单导入到Hadoop中了(这里为HDFS),现在一段时间后我们需要将近期产生的新的订单数据导入Hadoop中(这里为HDFS),以供后续数仓进行分析。此时我们只需要指定–incremental 参数为append,–last-value参数为5201314即可。表示只从id大于5201314后开始导入。

sqoop import --connect jdbc:mysql://host0:3316/testdb --username root --password 123456 \
--query "select order_id, name from order_table where \$CONDITIONS" \
--target-dir /user/root/orders_all \ 
--split-by order_id \
-m 6  \
--incremental append \
--check-column order_id \
--last-value 5201314
参数 描述
–incremental append 基于递增列的增量导入(将递增列值大于阈值的所有数据增量导入Hadoop
–check-column 递增列(int)
–last-value 阈值(int)

2、Lastmodified方式

此方式要求原有表中有time字段,它能指定一个时间戳,让Sqoop把该时间戳之后的数据导入至Hadoop(这里为HDFS)。因为后续订单可能状态会变化,变化后time字段时间戳也会变化,此时Sqoop依然会将相同状态更改后的订单导入HDFS,当然我们可以指定merge-key参数为orser_id,表示将后续新的记录与原有记录合并。

# 将时间列大于等于阈值的数据增量导入HDFS
 sqoop import --connect jdbc:mysql://host0:3316/testdb --username root --password transwarp \
 --query “select order_id, name from order_table where \$CONDITIONS” \
 --target-dir /user/root/order_all \ 
 --split-by id \
 -m 4  \
 --incremental lastmodified \
 --merge-key order_id \
 --check-column time \
# remember this date !!!
 --last-value “2014-11-09 21:00:00”  
参数 描述
–incremental lastmodified 基于时间列的增量导入(将时间列大于等于阈值的所有数据增量导入Hadoop)
–check-column 时间列(int)
–last-value 阈值(int)
–merge-key 合并列(主键,合并键值相同的记录)

F、全量导入数据

全量数据导入就是一次性将所有需要导入的数据,从关系型数据库一次性地导入到Hadoop中(可以是HDFS、Hive等)。全量导入形式使用场景为一次性离线分析场景。用sqoop import命令,具体如下:

sqoop import --connect jdbc:mysql://host0:3306/testdb --username root --password 123456 \
--query "select * from test_table where \$CONDITIONS" \
--target-dir /user/root/person_all \
--fields-terminated-by "," \
--hive-drop-import-delims --null-string "\\N" --null-non-string "\\N" \
--split-by id \
-m 6
参数 描述
– query SQL查询语句
– target-dir HDFS目标目录(确保目录不存在,否则会报错,因为Sqoop在导入数据至HDFS时会自己在HDFS上创建目录)
–hive-drop-import- delims 删除数据中包含的Hive默认分隔符(^A, ^B, \n)
–null-string string类型空值的替换符(Hive中Null用\n表示)
–null-non-string 非string类型空值的替换符
–split-by 数据切片字段(int类型,m>1时必须指定)
-m Mapper任务数,默认为4

G、并发导入参数设置

我们知道通过 -m 参数能够设置导入数据的 map 任务数量,即指定了 -m 即表示导入方式为并发导入,这时我们必须同时指定 - -split-by 参数指定根据哪一列来实现哈希分片,从而将不同分片的数据分发到不同 map 任务上去跑,避免数据倾斜

  • 生产环境中,为了防止主库被Sqoop抽崩,我们一般从备库中抽取数据。
  • 一般RDBMS的导出速度控制在60~80MB/s,每个 map 任务的处理速度5~10MB/s 估算,即 -m 参数一般设置4~8,表示启动 4~8 个map 任务并发抽取。

H、文件格式

可以使用以下两种文件格式之一导入数据:分隔文本或SequenceFiles。

分隔文本是默认导入格式。您也可以使用--as-textfile参数显式指定它。此参数将每个记录的基于字符串的表示形式写入输出文件,并在各列和行之间使用分隔符。这些分隔符可以是逗号,制表符或其他字符。(可以选择分隔符;请参阅“输出行格式化参数。”)以下是基于文本的示例导入的结果:

1,这里有消息,2010-05-01 
2,新年快乐!,2010-01-01 
3,另有消息,2009-11-12

分隔文本适用于大多数非二进制数据类型。它还很容易支持其他工具(如Hive)的进一步操作。

SequenceFiles是一种二进制格式,用于将各个记录存储在自定义记录特定的数据类型中。这些数据类型表现为Java类。Sqoop会自动为您生成这些数据类型。此格式支持二进制表示中所有数据的精确存储,适用于存储二进制数据(例如,VARBINARY列),或者主要由自定义MapReduce程序操作的数据(从SequenceFiles读取比从文本文件读取更高的性能 ,因为记录不需要解析)。

Avro数据文件是一种紧凑,高效的二进制格式,可提供与其他编程语言编写的应用程序的互操作性。Avro还支持版本控制,因此当例如在表中添加或删除列时,可以处理先前导入的数据文件以及新的数据文件。

默认情况下,不压缩数据。您可以使用deflate(gzip)算法和-zor --compress 参数压缩数据,或使用--compression-codec参数指定任何Hadoop压缩编解码器 。这适用于SequenceFile,文本和Avro文件。

I、Hive参数

参数 描述
–hive-home 覆盖 $HIVE_HOME
–hive-import 将表导入Hive(如果没有设置,则使用Hive的默认分隔符。)
–hive-overwrite 覆盖Hive表中的现有数据。
–create-hive-table 默认是false,如果目标表已经存在了,那么创建任务会失败
–hive-table 设置导入Hive时要使用的表名。
–hive-drop-import-delims 导入到Hive时从字符串字段中 删除\ n\ r\ 01
–hive-delims-replacement 导入到Hive时,使用用户定义的字符串 替换字符串字段中的\ n\ r\ 01
–hive-partition-key 指定hive分区名称
–hive-partition-value 指定分区的数值
–map-column-hive 为已配置的列覆盖从SQL类型到Hive类型的默认映射。

J、HBase参数

参数 描述
–column-family 设置导入的目标列族
–hbase-create-table 如果指定,则创建缺少的HBase表
–hbase-row-key
指定要用作行键的输入列,复合键必须要用逗号进行分隔
–hbase-table 指定要用作目标而不是HDFS的HBase表
–hbase-bulkload 启用批量加载

K、Accumulo参数

参数 描述
–accumulo-table 指定用作目标的Accumulo表而不是HDFS
–accumulo-column-family 设置导入的目标列族
–accumulo-create-table 如果指定,则创建缺少的Accumulo表
–accumulo-row-key
指定要用作行键的输入列
–accumulo-visibility (可选)指定要应用于插入到Accumulo中的所有行的可见性标记。默认为空字符串。
-accumulo-batch-size (可选)设置Accumulo写缓冲区的大小(以字节为单位)。默认值为4MB。
–accumulo-max-latency (可选)设置Accumulo批处理编写器的最大延迟(以毫秒为单位)默认值为0
–accumulo-zookeepers host:port Accumulo实例使用的以逗号分隔的Zookeeper服务器列表
–accumulo-instance 目标Accumulo实例的名称
–accumulo-user 要导入的Accumulo用户的名称
–accumulo-password Accumulo用户的密码

3、sqoop-export

A、导出控制参数

参数 描述
–columns <col,col,col…> 要导出到表的列
–direct 使用直接导出快速路径
–export-dir 导出的HDFS源路径
-m,–num-mappers 使用n个映射任务并行导出
–table 表名
–call 存储过程调用
–update-key 用于更新列。如果有多个列,请使用逗号分隔的列列表。
–update-mode mode包含 updateonly(默认)和allowinsert
–input-null-string 字符串列的解释为null的字符串
–input-null-non-string 对于非字符串列,要解释为null的字符串
–staging-table 在插入目标表之前将暂存数据的表。
–clear-staging-table 表示可以删除表中存在的任何数据。
–batch 使用批处理模式执行基础语句。

--input-null-string--input-null-non-string参数都是可选的。如果--input-null-string未指定,则对于字符串类型的列,字符串“null”将被解释为null。如果--input-null-non-string未指定,则对于非字符串列,字符串“null”和空字符串都将被解释为null。请注意,除了指定的其他字符串之外,对于非字符串列,空字符串将始终被解释为null --input-null-non-string

由于Sqoop将导出过程分解为多个事务,因此失败的导出作业可能会导致将部分数据提交到数据库。这可能进一步导致后续作业由于某些情况下的插入冲突而失败,或导致其他作业中的重复数据。您可以通过--staging-table选项指定登台表来解决此问题,该选项充当用于暂存导出数据的辅助表。分阶段数据最终在单个事务中移动到目标表。

–update-mode模式有两种updateonly(默认)和allowinsert

updateonly:该模式用于更新Hive表与目标表中数据的不一致,即在不一致时,将Hive中的数据同步给目标表(如MySQL、Oracle等的目标表中),这种不一致是指,一条记录中的不一致,比如Hive表和MySQL中都有一个id=1的记录,但是其中一个字段的取值不同,则该模式会将这种差异抹除。对于“你有我无”的记录则“置之不理”。

allowinsert:该模式用于将Hive中有但目标表中无的记录同步到目标表中,但同时也会同步不一致的记录。可以这种模式可以包含updateony模式的操作,这也是为什么没有命名为insertonly的原因吧。

updateonly模式只会更新表中修改的数据,不会更新新增的数据;allowinsert模式既可以更新修改的数据也可以更新新增的数据。

B、输入解析参数

参数 描述
–input-enclosed-by 设置必填字段包含
–input-escaped-by 设置输入转义字符
–input-fields-terminated-by 设置输入字段分隔符
–input-lines-terminated-by 设置输入行分隔符
–input-optionally-enclosed-by 设置包含字符的字段

C、输出行格式参数

参数 描述
–enclosed-by 设置包含字符的必填字段
–escaped-by 设置转义字符
–fields-terminated-by 设置字段分隔符
–lines-terminated-by 设置行尾字符
–mysql-delimiters 使用MySQL的默认分隔符集:fields: ‘,’ lines:\n escaped-by:\ optional-enclosed-by:'
–optionally-enclosed-by 设置包含字符的字段

4、Sqoop常用操作

从外部数据库导入到Hadoop上时用import,反之用export。

A、MySQL->HDFS

#--target-dir /user/sqoop/hive hive文件夹要不存在或使用--delete-target-dir删除已存在的文件夹
sqoop import --connect jdbc:mysql://host0:3306/hive --username root --password 123456 \
--table VERSION --columns "name,age" --where "age>18" \
--default-character-set = utf8 \
--target-dir /user/sqoop/hive \
--delete-target-dir \
--fields-terminated-by ',' \    #导入数据后每个字段的分隔符
--split-by age \
-m 1 \

--incremental append \
--null-string ''    \     #导入字段为空时,指定字符串替换
--check-column id \     #指定增量导入时的参考列
--last-value 10                #上次导入后的值

B、MySQL->Hive

--hive中创建表
use default;
drop table if exists default.hive_bbs_product_snappy ;
create table default.hive_bbs_product_snappy(
id int,
brand_id int,
name string
 )
ROW FORMAT DELIMITED FIELDS TERMINATED BY '\t' ;
#sqoop将数据导入到Hive
sqoop import --connect jdbc:mysql://host0:3306/hive --username root --password 123456 \
--table bbs_product \
--delete-target-dir \

--hive-import \
--create-hive-table \
--hive-database default \
--hive-table hive_bbs_product_snappy \
--hive-overwrite \        #重写数据
--fields-terminated-by '\t' \
--num-mappers 1 \

--incremental append \
--null-string ''    \     #导入字段为空时,指定字符串替换
--check-column id \     #指定增量导入时的参考列
--last-value 10                #上次导入后的值

C、MySQL->HBase

--mysql创建表
create table tohdfs(
id int,
name varchar(20))
#数据导入HBase并在HBase中创建表
sqoop import --connect jdbc:mysql://host0:3306/hive --username root --password 123456 \
--table tohdfs  \

--hbase-table hbase_tohdfs \
--column-family info  \
--hbase-create-table \
--hbase-row-key id \
--fields-terminated-by '\t' \
--num-mappers 1 \

--incremental append \
--null-string ''    \     #导入字段为空时,指定字符串替换
--check-column id \     #指定增量导入时的参考列
--last-value 10                #上次导入后的值
#使用--hbase-bulkload
sqoop import --connect jdbc:mysql://host0:3306/hive --username root --password 123456 \
--table tohdfs  \

--hbase-table hbase_tohdfs_bulk \
--column-family info  \
--hbase-create-table \                     
--hbase-row-key id \
--hbase-bulkload

D、HDFS->MySQL

sqoop export --connect jdbc:mysql://host0:3306/hive --username root --password 123456 \
--table tohdfs \
--export-dir /tmp/datathree/  \                    #HDFS的目录位置
-m 1 \
--input-fields-terminated-by '\0001'

E、Hive->MySQL

#方法一为将Hive表所在的数据位置(HDFS)导入到MySQL中
sqoop export --connect jdbc:mysql://host0:3306/hive --username root --password 123456 \
--table wht_test2 \
--export-dir /user/hive/warehouse/wht_test1 \
--input-fields-terminated-by '\0001' \
-m 1
#--fields-terminated-by '\t' \                        #HDFS中被导出的文件字段的间隔符

F、HBase->MySQL

#HBASE->Hive映射表->Hive内部表->MySQL
#1、MySQL创建表
create table test.employee(
rowkey int(11),
id int(11),
name varchar(20),
primary key (id))
#2、HBase创建表
create 'employee','info'
put 'employee',1,'info:id',1
put 'employee',1,'info:name',peter
#3、Hive创建映射表
create external table test.h_employee(key int,id int,name string)
STORED BY 'org.apache.hadoop.hive.hbase.HBaseStorageHandler'
WITH SERDEPROPERTIES(
"hbase.columns.mapping" = ":key,info:id,info:name"
)
TBLPROPERTIES("hbase.table.name"="employee",
"hbase.mapred.output.outputable"="employee");
#4、Hive创建内部表
create table test.employee(key INT,id INT,name STRING);
insert overwrite table test.employee select * from test.h_employee;
#5、sqoop导出hive表到MySQL
sqoop export --connect jdbc:mysql://host0:3306/test --username root --password 123456 \
--table employee \
-export-dir /user/hive/warehouse/test.db/employee \
--input-fields-terminated-by '\001' \
--input-null-string '\\N' \
--input-null-non-string '\\N'

G、Oracle->HDFS

sqoop import --connect jdbc:oracle:thin:@IPAddress:databaseName \
--username userName --password password \
--table TABLENAME \
--target-dir /user/operate \
-m 1 --where "where子句 and 根据需要添加"

H、Oracle->Hive

sqoop import --connect jdbc:oracle:thin:@IPAddress:1521:databaseName \
--username userName --password password \
--table TABLENAME  \
-m 1 --hive-import --hive-database test

I、HDFS->Oracle

sqoop export --connect jdbc:oracle:thin:@//192.168.27.235:1521/ORCL \
--username scott --password liujiyu \
--table empty \
--export-dir '/liujiyu/nihao/part-m-00000' \
--fields-terminated-by ':' \
-m  1

J、Hive->Oracle

sqoop export
# 指定要从Hive中导出的表
--table TABLE_NAME    
# host_ip:导入oracle库所在的ip:导入的数据库
--connect jdbc:oracle:thin:@HOST_IP:DATABASE_NAME 

# oracle用户账号
--username USERNAME
# oracle用户密码
--password PASSWORD 

# hive表数据文件在hdfs上的路径
--export-dir /user/hive/test/TABLE_NAME
# 指定表的列名,必须指定 
--columns ID,data_date,data_type,c1,c2,c3 

# 列分隔符(根据hive的表结构定义指定分隔符)
--input-fields-terminated-by '\001'
# 行分隔符
--input-lines-terminated-by '\n' 

# 如果hive表中存在null字段,则需要添加参数,否则无法导入
--input-null-string '\\N' 
--input-null-non-string '\\N'

5、数据验证-Validation

通过比较源和目标表的行计数来验证复制的数据正确性。

验证器

属性:validator
描述:用于验证的驱动程序,必须实现org.apache.sqoop.validation.Validator 
支持的值:该值必须是完全限定的类名。
默认值:org.apache.sqoop.validation.RowCountValidator

验证阈值

属性:validation-threshold 
描述:根据满足阈值的验证驱动决策。必须实现org.apache.sqoop.validation.ValidationThreshold 
支持的值:该值必须是完全限定的类名。
默认值:org.apache.sqoop.validation.AbsoluteValidationThreshold

验证失败处理程序

属性:validation-failurehandler 
描述:负责处理失败,必须实现org.apache.sqoop.validation.ValidationFailureHandler 
支持的值:该值必须是完全限定的类名。
默认值:org.apache.sqoop.validation.AbortOnFailureHandler

限制

验证当前仅验证从单个表复制到HDFS的数据。以下是当前运行中的限制:
1、所有表格选项
2、自由格式查询选项
3、数据导入Hive,HBase或Accumulo
4、使用--where参数导入表
5、增量进口

示例

sqoop export --connect jdbc:mysql://host0:3306/test --username root --password 123456 \
--table bar \ 
--export -dir /results/bar_data \
--validate
sqoop import --connect jdbc:mysql://host0:3306/test --username root --password 123456 \
--table employee \ 
--validate --validator org.apache.sqoop.validation.RowCountValidator \ 
--validation-threshold org.apache.sqoop.validation.AbsoluteValidationThreshold \ 
--validation-failurehandler org.apache.sqoop.validation.AbortOnFailureHandler

6、sqoop-job

允许您创建和处理已保存的作业。保存的作业记住用于指定作业的参数,因此可以通过命令调用作业来重新执行它们。

如果将已保存的作业配置为增量导入,则会在已保存的作业中更新有关最近导入的行的状态,以允许作业仅连续导入最新的行。

选项参数

参数 描述
–create 定义新的作业
–delete 删除已保存的作业
–exec 运行已保存的作业
–show 显示已保存作业的参数
–list 列出所有已保存的作业

示例

sqoop job --create myjob  -import --connect jdbc:mysql://host0:3306/test \
--username root --password 123456 \
--table mytable

7、sqoop-merge

合并工具允许您组合两个数据集,其中一个数据集中的条目应覆盖旧数据集的条目。例如,在最后修改模式下的增量导入运行将在HDFS中生成多个数据集,其中每个数据集中会连续出现更新的数据。该merge 工具将两个数据集“展平”为一个,获取每个主键的最新可用记录。

选项参数

参数 描述
–class-name 指定在合并作业期间要使用的特定于记录的类的名称。
–jar-file 指定要从中加载记录类的jar的名称。
–merge-key
指定要用作合并键的列的名称。
–new-data 指定较新数据集的路径。
–onto 指定旧数据集的路径。
–target-dir 指定合并作业输出的目标路径。

merge工具运行MapReduce作业,该作业将两个目录作为输入:较新的数据集和较旧的数据集。这些分别用--new-data和指定 --onto。MapReduce作业的输出将放在由指定的HDFS目录中--target-dir

合并数据集时,假设每条记录中都有唯一的主键值。主键的列用--merge-key。指定。同一数据集中的多个行不应具有相同的主键,否则可能会发生数据丢失。

sqoop merge --new-data newer --onto older --target-dir merged --merge-key id

8、Oracle连接器

Oracle用户要有以下权限

用户必须具有select any dictionary privilege或select_catalog_role角色或以下所有对象权限:
select on v_$instance
select on dba_tables
select on dba_tab_columns
select on dba_objects
select on dba_extents
select on dba_segments - 仅适用于Sqoop导入
select on dba_constraints - 仅适用于Sqoop导入
select on v_$database - 仅适用于Sqoop导入
select on v_$parameter - 仅适用于Sqoop导入

导出数据时需要的额外权限

create table
select on dba_tab_partitions
select on dba_tab_subpartitions
select on dba_indexes
select on dba_ind_columns
select any table
create any table
insert any table
alter any table (分区)
select,insert on table (没有分区)
select,alter on table (分区)
select,update on table (没有分区)
select,delete,alter,insert on table (分区)
select,insert,update on table (没有分区)
select,insert,delete,alter on table (分区)

支持的数据类型

BINARY_DOUBLE    NCLOB
BINARY_FLOAT    NUMBER
BLOB    NVARCHAR2
CHAR    RAW
CLOB    ROWID
DATE    TIMESTAMP
FLOAT    TIMESTAMP WITH TIME ZONE
INTERVAL DAY TO SECOND    TIMESTAMP WITH LOCAL TIME ZONE
INTERVAL YEAR TO MONTH    URITYPE
LONG    VARCHAR2
NCHAR    

连接Oracle

--connect jdbc:oracle:thin:@OracleServer:OraclePort:OracleSID
--connect jdbc:oracle:thin:@//OracleServer:OraclePort/OracleService
--connect jdbc:oracle:thin:@TNSName

从Oracle导入数据

sqoop import --direct --connect … --table OracleTableName
-Dmapred.child.java.opts=-Xmx4000M #设置JVM内存

Hadoop文件与Oracle表分区匹配

-Doraoop.chunk.method={ROWID|PARTITION}
要以这样的方式从分区表导入数据,使得Hadoop中生成的HDFS文件夹结构与表的分区匹配,请将块方法设置为PARTITION。替代(默认)块方法是ROWID。

注: 要使Hadoop文件的数量与Oracle分区的数量相匹配,请将映射器的数量设置为大于或等于分区数。
      如果表未分区,则值PARTITION将导致错误。

指定导入的分区

-Doraoop.import.partitions=PartitionA,PartitionB --table OracleTableName
注: ""中保留大小写,''自动将名称转换为大写
        使用双引号时,整个分区名称列表必须用单引号括起来。
        如果列表中的最后一个分区名称是双引号,则列表末尾必须有逗号。
        -Doraoop.import.partitions='"PartitionA","PartitionB",' --table OracleTableName

数据导出到Oracle

sqoop export --direct --connect … --table OracleTableName --export-dir /user/username/tablename

文章作者: Potato
版权声明: 本博客所有文章除特別声明外,均采用 CC BY 4.0 许可协议。转载请注明来源 Potato !
评论
  目录