我正在使用Sqoop增量导入,每天将数据放入我的hive表中。我有以下场景: 我有一个RDBMS表:empdata with columns
id name city
1 Sid Amsterdam
2 Bob Delhi
3 Sun Dubai
4 Rob London
我正在将数据导入Hive,使用sqoop增量导入通过cron作业来执行此工作。
#!/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表中,这样我才能拥有重复的值。谁能告诉我怎么能完成它?
答案 0 :(得分:2)
在sqoop中,你不能在--check-column中使用2列,即使你被允许(你可以在--check-column中结合2个字段,参见ex:Sqoop Incremental Import multiple columns in check-column),那么你也不确定如果下次该城市的价值更高或更低,那么您无法在支票栏中真正使用城市字段。现在你有以下选择:
1)在你的RDBMS中创建一个新表,你有另一个类型为timestamp的字段,这将自动递增,这样每次你有任何更新或插入它都有当前时间戳。然后在增量追加后再次使用增量lastmodified导入此表... - check-column ts_field - last-value也在sqoop import中使用“--merge-key id”,以便它可以在基础上合并更新的
2)a)首先使用--check-cloumn id运行你的sqoop导入--incremental追加最后一个值 b)然后再次运行sqoop导入,而不使用--incremental和目标dir作为临时文件夹 c)然后使用sqoop merge合并数据集(步骤a。和b中的target-dir),其中新数据将在步骤a的目标dir中进入步骤b的tar目录,而--merge key将为“id”。
如果您有任何其他问题,请与我们联系。