sqoop export工具把HDFS中的数据导入到rdbms系统中,实现方式有三种:

(1)insert mode:生成insert语句然后执行,这是默认的方式

(2)update mode:生成update语句,替换数据库中的记录

(3)call mode:调用存储过程处理每一条记录:


通用参数在import部分已经描述过了,这里着重描述export参数。

重要选项:

--input-null-string:如果没有这个选项,那么在字符串类型列中,字符串"null"会被转换成空字符串,所以最好写上这个,指定为'\\N'.

--input-null-non-string:如果没有这个选项,那么在非字符串类型的列中,空串和"null"都会被看作是null.

插入操作实际是开启多个连接,执行多个事务,sqoop采用多行插入方式,每次插入100行,执行100次插入语句后提交事务。

由于默认sqoop使用多个事务并行插入数据,这可能会造成部分数据导入失败,部分数据成功的情况。为了保持一致性,可以加上--staging-table,通过中间表保证数据的一致性。为了实现这个功能,必须要建立一个stage table,这个表结构与target table结构要一致。最好加上--clear-staging-table,导入前清除stage table中的数据。使用了--direct就不能使用--stage table了。和import不一样的是,RDBMS中必须要具备相应的表export操作才会成功。

实例1:使用insert模式把Hadoop中的文件导入到oracle数据库:

注意主键约束,重复记录会导致导入失败:

实例2:以update结合insert导入:

待导入的文件内容:

建表:

trx@HX> create table sqoop_update(id int,name varchar2(500));

Table created.

首先把文件导入数据库:

下面使用更新导入:

修改导入文件,内容如下:

使用update方式导入,已存在的记录更新,不存在的插入新的(注意大小写):

这相当于执行下面操作:

实例三:为每一条记录调用存储过程:

目前不知道怎么写存储过程,处理传过来的数据记录。

02-02 13:28