我有一个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
答案 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,以确保仅导入新数据或更新数据。这是通过将增量导入创建为已保存作业来自动处理的,这是执行定期增量导入的首选机制。有关详细信息,请参阅本文档后面有关已保存作业的部分。