sqoop使用,从hive向oracle导入数据


author: lf

sqoop export 使用说明

--export-dir 和 (--table--call中的一个)是必须的。

指定了将要填充的表(或将要调用的存储过程),以及hdfs包含资源数据的目录

--columns
默认将查询出表中所有的字段。通过这个参数可以选择列的子集并控制它们的顺序,使用逗号分割,例如:–columns “col1,col2,col3”。
注意,columns参数中不能包含需要默认值的列以及允许空值的列

--num-mapper--m
默认Sqoop使用四个任务并行处理。这可能不是最优的,可以根据实验的实际情况,进行设置。
该设置控制map的任务数(使用的并行程度)。

--direct
一些数据提供了直接模式,这种模式可能比标准的JDBC模式性能更好

--input-null-string--input-null-non-string 是可选的
如果--input-null-string没有指定,那么对于字符类型的列,字符串“null”将被解释为null;
如果--input-null-non-string没有指定,那么对于非字符类型的列,字符串"null"和空字符串将被解释为null;
注意:对于非字符类型的列,空字符传总是被解释为null。

--staging-table
Sqoop将一个导出过程切分成多个事务,一个失败的导出作业,可能会导致部分的数据提交到数据库中,这可能会由于插入冲突导致后续的任务失败,或者导致数据重复。
--staging-table可以担任辅助的表,用于对导出的数据进行分段,分段的数据最终会在一个会话中导入到目标表中。

--clear-staging-table
为了使用分段功能,必须提前创建创建一个阶段表(Staging table)去运行导出的job。这个表的结构必须和目标表的结构相同。在运行导出任务之前,这个包必须为空,或者指定--clear-staging-table,
在导出任务执行前Sqoop将删除阶段表(Staging table)中的所有数据。

注意:直接导出(`--direct`)并不总是支持将数据推入到目标表之前的分段数据。当使用`--update-key`选项(用于更新现有选项)调用导出,或者使用存储过程插入数据是,也是不支持的。

sqoop-export 添加新的记录到一张表中,默认情况下,每一个输入记录将被转化成insert语句,添加一行到目标数据库的目标表中。
如果目标表中包含约束(例如:主键)并且已经存在数据,必须小心,避免将要插入的数据违背了约束。如果一条插入语句失败,整个导入过程就失败了。
这个模式主要用于向新表或者空表中插入数据。

--update-key 如果使用这个参数,sqoop将修改已经存在的数据。每一条输入记录,将被看做update语句,修改已经存在的行。
语句修改的行,由--update-key后面指定的列名决定。例如:

数据库的表:
CREATE TABLE foo(
id INT NOT NULL PRIMARY KEY,
msg VARCHAR(32),
bar INT);

hdfs内容记录:
0,this is a test,42
1,some more data,100
...

运行:sqoop-export --table foo --update-key id --export-dir /path/to/data --connect …,执行的sql命令将像下面:
UPDATE foo SET msg='this is a test', bar=42 WHERE id=0;
UPDATE foo SET msg='some more data', bar=100 WHERE id=1;
...

如果update语句没有修改的行,不被认为是错误,导出将无声的进行。实际上,这意味着基于更新的导出不会向数据库插入新行。
同样的,如果`--update-key`指定的列不是唯一的列,多行将被一行更新,也不会被察觉出来。

`--update-key` 可以被给用逗号分割的列名列表。在更新再有记录之前,Sqoop将匹配所有的列表中的键

可以使用`allowinsert`模式指定为`--update-key`的参数,此时,如果表中的数据在数据库中已经存在则更新,没有存在则插入。

导出案例

/hive/warehouse/test_month_swl_tmp_bak_20181204
–表名要大写

nohup sqoop export --connect jdbc:oracle:thin:@localhost:1521:mailbi
–username dm --password dm --table “TMP_DM_USER_TOTAL_MONTH_NEW_LF”
–input-fields-terminated-by ‘\t’
–input-lines-terminated-by ‘\n’
–export-dir /hive/warehouse/test_month_swl_tmp_bak_20181204 1>nohup.out 2>error.out &

先将数据导入staging表,在将staging表中数据放到目标表中

nohup sqoop export --connect jdbc:oracle:thin:@localhost:1521:mailbi
–username dm --password dm --table TMP_DM_USER_TOTAL_MONTH_NEW
–staging-table TMP_DM_USER_TOTAL_MONTH_NEW_LF
–clear-staging-table
–input-fields-terminated-by ‘\t’
–input-lines-terminated-by ‘\n’
–export-dir /hive/warehouse/test_month_swl_tmp_bak_20181204
1>/opt/aimcpro/lf/sqoop_dir/nohup.out 2>/opt/aimcpro/lf/sqoop_dir/error.out &

猜你喜欢

转载自blog.csdn.net/hefrankeleyn/article/details/85090735