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

标签 shell hadoop hive sqoop

我通过每天将数据导入我的配置单元表来使用 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/

相关文章:

python - 如何不考虑顺序逐行比较两个文件?

regex - 如何在 Perl 正则表达式中转义左括号?

hadoop - 如何在HDFS hadoop中释放可用空间?

ubuntu - 当我在主节点中编写命令(ip addr show)时,不要显示地址。如何解决这个问题?

java.lang.ClassCastException : cannot be cast to java. lang.Object

hadoop - 如何在 EMR 上重命名 Hive 的输出文件?

hadoop - 声明 hivevar 时出现 Hive 错误

linux - Bash 脚本无法运行 : command not found

bash - 当 bash 函数具有相同名称时调用程序

hadoop - Hadoop 如何决定有多少节点将执行 Map 和 Reduce 任务?