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

Shell 如何将更新的记录与增量导入一起从RDBMS表导入到配置单元表?,shell,hadoop,hive,sqoop,Shell,Hadoop,Hive,Sqoop,我每天都把数据放到我的配置单元表中,使用Sqoop增量导入。我有以下情况: 我有一个RDBMS表:带有列的empdata id name city 1 Sid Amsterdam 2 Bob Delhi 3 Sun Dubai 4 Rob London 我正在将数据导入到配置单元中,使用Sqoop增量导入,通过一个cron作业使用shell脚本来完成这项工作 #!/bin/bash DATE=$(date +"%d-%m-%y") whi

我每天都把数据放到我的配置单元表中,使用Sqoop增量导入。我有以下情况: 我有一个RDBMS表:带有列的empdata

id  name    city
1   Sid     Amsterdam
2   Bob     Delhi
3   Sun     Dubai
4   Rob     London
我正在将数据导入到配置单元中,使用Sqoop增量导入,通过一个cron作业使用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我需要将更新的记录与增量导入一起获取,但只有更新的值应显示在配置单元表中,这样我也不会有重复的值。有人能告诉我如何实现吗?

在sqoop中,您不能在-check列中使用2列,即使允许,您也可以在-check列中组合2个字段。请参见ex:然后,您也不确定城市下次是否会有较高或较低的值,因此您不能真正在check列中使用city字段。现在您有以下选项:

1在RDBMS中创建一个新表,其中有另一个timestamp类型的字段,该字段将自动递增,以便每次更新或插入时都有当前时间戳。然后在增量追加之后,使用增量lastmodified…-检查列ts_字段-最后一个值也使用-merge key id在sqoop import中导入此表,以便它可以根据id合并更新

2使用-check cloumn id-incremental append last值首次运行sqoop导入 b然后再次运行sqoop导入,而不使用-incremental和target dir作为临时文件夹 c然后在步骤a中使用sqoop合并datasettarget目录。和b,其中新数据将位于步骤a的目标目录中到步骤b的tar目录中,并且-merge键将是id


如果您还有任何问题,请告诉我

所以应该有两个sqoop命令,一个用于普通增量导入,另一个类似于以下内容:“sqoop导入-连接jdbc:mysql://server/dbname -表tablename-用户名root-密码cloudera-配置单元导入-配置单元表dynpart-配置单元分区键'thisday'-配置单元分区值日期-目标目录'/user/hive/newimp5'-增量追加-检查列timestampcolumn-上次修改的'sometimestamp'-merge key id'如果与增量导入一起使用,sqoop'merge key'将仅自动将配置单元表中的旧匹配记录替换为新记录吗?我也不确定以下操作是否有效..但您可以检查并让我知道。。。在sqoop中以sqoop命令的形式运行incremental后,请运行另一个sqoop导入,不要使用incremental,在同一个sqoop命令中,使用与target dir相同的文件夹,并提供-append and-merge key id,应该可以使用。或者,如果您想使用我上次答复中的第二种方法。。您应该首先从问题sqoop import中运行正常的增量操作,如belowcopeid-connect jdbc:mysql://$server/$dbname-table$tablename-username root-password cloudera-hive import-hive table dynpart-hive分区键'thisday'-hive分区值$DATE-target dir'/user/hive/newimp5'-incremental append-check列id-最后一个值$hive-e从$tablename中选择maxid;然后在新文件夹中运行正常导入而不使用增量,然后运行sqoop合并。如果表中有可用的时间戳,则可以简单地编写sqoop作业,并使用增量lastmodified-检查列ts_字段,并在每次运行此作业时使用与目标相同的文件夹,但请确保具有-append和-merge键id