如何获取更新的记录以及从 RDBMS table 到 Hive table 的增量导入?

How to take updated records along with incremental import from RDBMS table to a Hive table?

我通过每天将数据导入我的配置单元来使用 Sqoop 增量导入 table。我有以下情况: 我有一个 RDBMS table: empdata with columns

id  name    city
1   Sid     Amsterdam
2   Bob     Delhi
3   Sun     Dubai
4   Rob     London

我正在将数据导入 Hive,通过 shell 脚本来完成工作的 cron 作业使用 Sqoop 增量导入。

#!/bin/bash
DATE=$(date +"%d-%m-%y")
while IFS=":" read -r server dbname tablename; do
sqoop import --connect jdbc:mysql://$server/$dbname --table $tablename --username root --password cloudera --hive-import --hive-table dynpart --hive-partition-key 'thisday' --hive-partition-value $DATE --target-dir '/user/hive/newimp5' --incremental-append --check-column id --last-value $(hive -e "select max(id) from $tablename");
done</home/cloudera/Desktop/MyScripts/tables.txt

上面的增量加载脚本工作正常。但是现在我还有一个需求,就是查看之前的记录是否有更新。就像记录: 1 Rob London is updated to 1 Rob NewYork 我需要将更新的记录与增量导入一起使用,但只有更新的值应该出现在 Hive table 中,这样我也没有重复的值。谁能告诉我如何完成它?

在 sqoop 中,您不能在 --check-column 中使用 2 个列,即使您被允许(您可以在 --check-column 中组合 2 个字段,参见示例:Sqoop Incremental Import multiple columns in check-column),那么您也是不确定下一次该城市的值是更高还是更低,因此您不能真正在检查列中使用城市字段。现在您有以下选项:

1) 在您的 RDBMS 中创建一个新的 table,其中您有另一个时间戳类型的字段,这将自动递增,以便每次您进行任何更新或插入时,它都具有当前时间戳。然后在增量追加之后,您再次使用增量 lastmodified ...--check-column ts_field 导入此 table -- last-value 在 sqoop 导入中也使用“--merge-key id”,以便它可以根据 id 合并更新。

2) a) 首先 运行 你的 sqoop 导入 --check-cloumn id --incremental append last value b) 然后 运行 再次导入 sqoop 而不使用 --incremental 并使用 target dir 作为一些临时文件夹 c)然后使用 sqoop merge 合并数据集(target-dir in 步骤 a. 和 b),其中新数据将在 target dir of step a 到 tar dir of step b 和 --merge 键将为 "id"。

如果您还有其他问题,请告诉我。