如果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>
答案 0 :(得分:1)
如果在Sqoop中执行incremental imports,则可以控制在更新其中一行时发生的情况,以及通过使用参数--incremental
插入新行时发生的情况。您有两种选择:
追加(sqoop import (...) --incremental append
)当新行连续添加到您的数据库并且您想要导入它们时,将使用此选项。在这种情况下,您需要通过check-column
参数告诉Sqoop它必须检查的列(以便检测这些新行)。
lastmodified (sqoop import (...) --incremental lastmodified
)。此选项是您在示例中所需的选项,它允许您告诉Sqoop您要检查表中的更新行(已导入的行)并将它们设置为新值。您必须记住,您必须通过参数--check-column
指定Sqoop将用于检测更新行的列名,并且还需要此列保存日期值(对于实例,date
,datetime
,time
或timestamp
)。在您的示例中,您需要一个包含日期值的额外列,并且每次更改任何其他列的值时都应更新该值,以便导入该行。
当然,如果您更新了一行但未更新该行的check-column
指定的字段,则不会在目标表中更新该行。
我希望这会有所帮助。