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-value是Day2,则会有仅包含新记录的附加部分文件。我不确定您是否想知道是否会丢失旧记录(以防万一),但事实并非如此。
仅当您将来返回并更新现有行的某些属性时, 的参数才有last-modified用。--incremental在这种情况下,它会用源表中当前行的更新版本替换表中的旧数据(并添加新内容)。希望这可以帮助!
哦,所有这些都是基于 Sqoop 用户指南第 7.2.7 节https://sqoop.apache.org/docs/1.4.2/SqoopUserGuide.html#_incremental_imports
以及 Apache Sqoop Cookbook 的第 3 章(该章实际上非常棒!)
| 归档时间: |
|
| 查看次数: |
47521 次 |
| 最近记录: |