shell—如何将更新的记录与从rdbms表到配置单元表的增量导入一起?

zpqajqem  于 2021-05-29  发布在  Hadoop
关注(0)|答案(1)|浏览(398)

我使用sqoop增量导入,每天将数据放入我的配置单元表。我有以下场景:我有一个rdbms表:empdata with columns

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

我将数据导入到hive中,通过cron作业使用sqoop增量导入shell脚本来完成这项工作。

  1. # !/bin/bash
  2. DATE=$(date +"%d-%m-%y")
  3. while IFS=":" read -r server dbname tablename; do
  4. 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");
  5. done</home/cloudera/Desktop/MyScripts/tables.txt

上面的增量加载脚本工作正常。但现在我有另一个要求,那就是检查以前的记录是否有任何更新。就像记录: 1 Rob London is updated to 1 Rob NewYork 我需要将更新的记录与增量导入一起获取,但是只有更新的值应该出现在配置单元表中,这样我也不会有重复的值。谁能告诉我怎样才能做到这一点?

yb3bgrhw

yb3bgrhw1#

在sqoop中,您不能在--check column中使用2列,即使您被允许(您可以在--check column中组合2个字段,请参见示例:sqoop incremental import check column中的多个列),您也不确定城市下次的值是更高还是更低,因此您不能在check column中真正使用city字段。现在您有以下选项:
1) 在rdbms中创建一个新表,其中有另一个类型为timestamp的字段,该字段将自动递增,以便每次更新或插入时都有当前的时间戳。然后在incremental append之后,使用incremental lastmodified…--check column ts\u field--last value在sqoop import中也使用“-merge key id”再次导入这个表,以便它可以根据id合并更新。
2) a)首先使用--check cloumn id--incremental append last value b)运行sqoop导入,然后再次运行sqoop导入,而不使用--incremental和target dir作为临时文件夹c),然后使用sqoop merge合并数据集(步骤a中的target dir)。和b)其中新数据将位于步骤a的目标目录中,并转移到步骤b的tar目录中,并且--merge键将是“id”。
如果你还有什么问题,请告诉我。

相关问题