Sqoop增量导入

use*_*743 9 sqoop

需要有关Sqoop增量进口的建议.假设我在第1天有一个策略1的客户,我在第1天在HDFS中导入了这些记录,我在Part Files中看到它们.
在第2天,同一客户添加了策略2,在增量导入sqoop运行之后,我们是否只在部件文件中获得新记录?在这种情况下,如何使用Sqoop获取旧的和增量的附加/最后修改记录?

Abh*_*bhi 22

考虑一个包含3条记录的表,您已使用sqoop将其导入hdfs

+------+------------+----------+------+------------+
| sid  | city       | state    | rank | rDate      |
+------+------------+----------+------+------------+
|  101 | Chicago    | Illinois |    1 | 2014-01-25 |
|  101 | Schaumburg | Illinois |    3 | 2014-01-25 |
|  101 | Columbus   | Ohio     |    7 | 2014-01-25 |
+------+------------+----------+------+------------+

sqoop import --connect jdbc:mysql://localhost:3306/ydb --table yloc --username root -P
Run Code Online (Sandbox Code Playgroud)

现在,您在表中有其他记录,但现有记录没有更新

+------+------------+----------+------+------------+
| sid  | city       | state    | rank | rDate    |
+------+------------+----------+------+------------+
|  101 | Chicago    | Illinois |    1 | 2014-01-25 |
|  101 | Schaumburg | Illinois |    3 | 2014-01-25 |
|  101 | Columbus   | Ohio     |    7 | 2014-01-25 |
|  103 | Charlotte  | NC       |    9 | 2013-04-22 |
|  103 | Greenville | SC       |    9 | 2013-05-12 |
|  103 | Atlanta    | GA       |   11 | 2013-08-21 |
+------+------------+----------+------+------------+
Run Code Online (Sandbox Code Playgroud)

在这里,您应该使用--incremental appendwith --check-column来指定要在要导入哪些行时要检查的列.

sqoop import --connect jdbc:mysql://localhost:3306/ydb --table yloc --username root -P --check-column rank --incremental append --last-value 7
Run Code Online (Sandbox Code Playgroud)

上面的代码将根据最后一个值插入所有新行.

现在我们可以想到行中有更新的第二种情况

+------+------------+----------+------+------------+
| sid  | city       | state    | rank | rDate      |
+------+------------+----------+------+------------+
|  101 | Chicago    | Illinois |    1 | 2015-01-01 |
|  101 | Schaumburg | Illinois |    3 | 2014-01-25 |
|  101 | Columbus   | Ohio     |    7 | 2014-01-25 |
|  103 | Charlotte  | NC       |    9 | 2013-04-22 |
|  103 | Greenville | SC       |    9 | 2013-05-12 |
|  103 | Atlanta    | GA       |   11 | 2013-08-21 |
|  104 | Dallas     | Texas    |    4 | 2015-02-02 |
|  105 | Phoenix    | Arzona   |   17 | 2015-02-24 |
+------+------------+----------+------+------------+
Run Code Online (Sandbox Code Playgroud)

这里我们使用incremental lastmodified,我们将根据日期获取所有更新的行.

sqoop import --connect jdbc:mysql://localhost:3306/ydb --table yloc --username root -P   --check-column rDate --incremental lastmodified --last-value 2014-01-25 --target-dir yloc/loc
Run Code Online (Sandbox Code Playgroud)


小智 3

回答你的第一个问题,这取决于你如何运行导入语句。如果您使用该--incremental append选项,您将指定您的--check-column--last-value参数。这些将准确指示提取哪些记录,并且它们将简单地附加到您的表中。例如:您可以DATE为参数指定一个类型列--check-column和一个非常早的日期(例如“1900-01-01”或您的情况下的Day1--last-value ) ,这只会继续将源表中的所有内容(创建重复行)附加到你的目的地。在这种情况下,创建的新零件文件将同时保存新记录和旧记录。您还可以使用递增的 ID 列并继续输入较小的 ID,这会产生相同的效果。但是,如果--last-valueDay2,则会有仅包含新记录的附加部分文件。我不确定您是否想知道是否会丢失旧记录(以防万一),但事实并非如此。

仅当您将来返回并更新现有行的某些属性时, 的参数才有last-modified用。--incremental在这种情况下,它会用源表中当前行的更新版本替换表中的旧数据(并添加新内容)。希望这可以帮助!

哦,所有这些都是基于 Sqoop 用户指南第 7.2.7 节https://sqoop.apache.org/docs/1.4.2/SqoopUserGuide.html#_incremental_imports

以及 Apache Sqoop Cookbook 的第 3 章(该章实际上非常棒!)