sqoop在导入时如何处理更新的行?

时间:2016-08-19 15:30:35

标签: hadoop sqoop bigdata

如果Oracle(或任何RDBMS)中有一个表,其中包含每天刷新的数据。

示例:

1234,Raj,Kolkata,1000,09092015

假设,我今天使用标准sqoop导入并在flatfile中的HDFS中存储此行。第二天,该行将从源表中删除。但是如果在7天后更新了相同的记录(比如sal字段1000更新为2000)。

如果再次运行sqoop查询,它将如何处理数据以及如何存储? 是否会有两个相同记录的条目或更新的值?

将记录

<1234, Raj, Kolkata, 1000, 09092015>

被这个替换?

<1234, Raj, Kolkata, 2000, 09092015>

1 个答案:

答案 0 :(得分:1)

如果在Sqoop中执行incremental imports,则可以控制在更新其中一行时发生的情况,以及通过使用参数--incremental插入新行时发生的情况。您有两种选择:

追加sqoop import (...) --incremental append)当新行连续添加到您的数据库并且您想要导入它们时,将使用此选项。在这种情况下,您需要通过check-column参数告诉Sqoop它必须检查的列(以便检测这些新行)。

lastmodified sqoop import (...) --incremental lastmodified)。此选项是您在示例中所需的选项,它允许您告诉Sqoop您要检查表中的更新行(已导入的行)并将它们设置为新值。您必须记住,您必须通过参数--check-column指定Sqoop将用于检测更新行的列名,并且还需要此列保存日期值(对于实例,datedatetimetimetimestamp)。在您的示例中,您需要一个包含日期值的额外列,并且每次更改任何其他列的值时都应更新该值,以便导入该行。

当然,如果您更新了一行但未更新该行的check-column指定的字段,则不会在目标表中更新该行。

我希望这会有所帮助。