?Sqoop Export – 从HDFS导出到RDBMS

1.Sqoop export介绍及其目的

Sqoop export 是将一组文件从HDFS导出回RDBMS的工具。  前提条件是,在数据库中,目标表必须已经存在。 根据用户指定的分隔符将输入文件读取并解析为一组记录。

默认操作是将记录转换为INSERT语句注入数据库的记录。 在“update”模式中,sqoop将生成UPDATE语句,用于替换数据库中的现有记录,在“call”模式中,sqoop将为每个记录进行存储过程调用。

2. Sqoop Export 语法

$ sqoop export (generic-args) (export-args)

可以按任意顺序输入导出参数,但Hadoop通用参数必须放在任何导出参数之前。

通用导出参数

1542533120841129.png

1542533174649936.png

验证参数

1542533249886902.png

导出控制参数

1542533328797964.png

1542533365188071.png

需要-export-dir参数和-table或-call 参数。 指定要填充到数据库中的表(或要调用的存储过程),此外,指定HDFS中包含源数据的目录。

默认情况下,表格中的所有列都选择在Sqoop中导出。 通过使用-columns参数,可以选择列的一个子集并控制它们的导出时候的排序。 应该包含一个以逗号分隔的列导出列表。 如:-columns“col1,col2,col3”。

3. Insert 和 Update的差异

Sqoop export将新行添加到表中。 这里每个输入记录都被转换成一个INSERT语句,该语句向目标数据库表添加一行。 但是,如果我们的表已经包含数据并且有约束限制,我们必须小心避免插入重复记录。 因为这可能违反了约束限制。 如果INSERT语句失败,导出过程将失败。

如果指定-update-key参数,Sqoop将修改数据库中的现有数据集。 每个输入记录都被认为是UPDATE语句。 修改了现有的行。如下:

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;

如果记录已经存在于数据库中,那么我们想要更新行,如果记录还不存在,那么我们想要插入行,这样的话,也可以使用allowinsert模式指定-update-mode参数。

此外,如果我们指定了不正确的分隔符,这会导致导出任务失败,抛出ParseExceptions。

代码生成参数

1542533514921256.png

4. 失败的Sqoop Export 原因

Sqoop中的export可能失败的原因有多种,例如:

由于从Hadoop集群到数据库的连接丢失。 要么是由于硬件故障,要么是服务器软件崩溃。

尝试插入一行。 违反了一致性约束。 例如,插入一个重复的主键值。

试图解析HDFS源数据中的不完整或格式不正确的记录

通过尝试使用不正确的分隔符解析记录

由于容量问题。 如内存或磁盘空间不足

5. Sqoop Export中的示例调用

要导出名为bar的表格,Sqoop中的基本导出命令为:

$ sqoop export -connect jdbc:mysql://db.example.com/foo --table bar \
-export-dir / results / bar_data

这个例子采用/ results / bar_data中的文件。 之后将其内容导入到db.example.com上foo数据库的Bar表中。 前提条件是在数据库中目标表必须已经存在。Sqoop执行一组INSERT INTO操作,而不考虑现有内容。

启用验证来导出名为bar的表:

$ sqoop export -connect jdbc:mysql://db.example.com/foo --table bar \
-export-dir / results / bar_data -validate

对于/ results / bar_data中的每个记录,调用名为barproc的存储过程的导出,如下所示:

$ sqoop export -connect jdbc:mysql://db.example.com/foo -call barproc \
-export-dir / results / bar_data

?Sqoop Export – 从HDFS导出到RDBMS

发表评论

邮箱地址不会被公开。 必填项已用*标注

九十 七 − 八十 七 =

滚动到顶部