我通过每天将数据导入我的配置单元表来使用 Sqoop 增量导入。我有以下情况: 我有一个 RDBMS 表:带列的 empdata
id name city
1 Sid Amsterdam
2 Bob Delhi
3 Sun Dubai
4 Rob London
我正在将数据导入到 Hive,通过 cron 作业使用 Sqoop 增量导入,该 shell 脚本来完成工作。
#!/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 更新为 1 Rob NewYork
我需要将更新的记录与增量导入一起使用,但只有更新的值应该出现在 Hive 表中,这样我就不会重复值(value)观。谁能告诉我如何完成它?
最佳答案
在 sqoop 中,您不能在 --check-column 中使用 2 列,即使您被允许(您可以在 --check-column 中组合 2 个字段,参见示例:Sqoop Incremental Import multiple columns in check-column),您也不确定是否city 下次将具有更高或更低的值,因此您不能真正在检查列中使用 city 字段。现在您有以下选项:
1) 在你的 RDBMS 中创建一个新表,你有另一个时间戳类型的字段,这将自动递增,这样每次你有任何更新或插入时它都有当前时间戳。然后在增量追加之后,您再次使用增量 lastmodified ...--check-column ts_field -- last-value 在 sqoop import 中使用“--merge-key id”再次导入此表,以便它可以在基础上合并更新身份证。
2) a) 首先使用 --check-cloumn id --incremental append last value 运行你的 sqoop import b) 然后再次运行 sqoop 导入而不使用 --incremental 并将目标目录作为某个临时文件夹 c) 然后使用 sqoop merge 合并数据集(步骤 a. 和 b 中的目标目录),其中新数据将位于步骤 a 的目标目录中到步骤 b 的 tar 目录中,--merge 键将为“id”。
如果您还有其他问题,请告诉我。
关于shell - 如何获取更新的记录以及从 RDBMS 表到 Hive 表的增量导入?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/43446098/