在两个作业之间共享sqoop增量最后一个值

时间:2014-01-13 18:54:40

标签: sqoop

我有一个sqoop作业,记录增量的最后一个值,以便在一天之内进行增量附加。我的问题是我的目录每天都在变化,所以我们可以根据log_date创建分区。

我需要在一天之内记录--last-value。然后我需要将该值传递给第二天新创建的作业。是否可以调用方法来获取最后一个值?

我当前的sqoop作业看起来像是用shell脚本编写的。

sqoop job --create test_last_index \
-- import --connect jdbc:xxxx \
--password xxx \
--table test_$(date -d yesterday +%Y_%m_%d) \
--target-dir /dir/where/located \
--incremental append \
--check-column id
--last-value 1

3 个答案:

答案 0 :(得分:0)

您无需为正在执行的sqooping调用方法。您需要做的就是创建一个sqoop作业并保存它。在您创建的sqoop作业中添加参数--check-column, - Incremental和--last-value。每次连续运行将获取--last-value,并保留在作业中。然后,您可以使用--exec命令定期运行作业,并使用sqoop merge将已修改/附加的数据与历史数据合并。

希望这有帮助。

答案 1 :(得分:0)

我为Incremental Import开发了sqoop脚本,如下所示。

sqoop import 
--driver com.sap.db.jdbc.Driver 
--fetch-size 3000 
--connect connectionURL 
--username test 
--password test 
--table  DATA 
--where YEAR=2002 
--check-column TIMESTAMP 
--incremental append 
--last-value "2016-06-22 12:31:37.0" 
--target-dir  "/incremental_data_2002/year_partition=2002" 
--fields-terminated-by "," 
--lines-terminated-by "\n" 
--split-by  YEAR 
--m 4

现在,上面的脚本已成功执行。

在上面的脚本中,我已对--last-value as "2016-06-22 12:31:37.0"进行了硬编码。当新数据再次到达RDBMS中的源表时,我正在检查表中的last-value并使用该值手动修改sqoop脚本。而不是我想要的是我需要动态--last-value而不需要在sqoop脚本文件中进行硬编码。

答案 2 :(得分:0)

可悲的是,Sqoop没有采用自动最后一次值检索。

在sqoop documentation

您应该使用:

  

在增量导入结束时,应将指定为后续导入的--last-value的值打印到屏幕上。运行后续导入时,应以这种方式指定--last-value,以确保仅导入新数据或更新数据。这是通过将增量导入创建为已保存作业来自动处理的,这是执行定期增量导入的首选机制。有关详细信息,请参阅本文档后面有关已保存作业的部分。