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方式导入,已存在的记录更新,不存在的插入新的(注意大小写):
这相当于执行下面操作:
实例三:为每一条记录调用存储过程:
目前不知道怎么写存储过程,处理传过来的数据记录。