如何获取更新的记录以及从 RDBMS table 到 Hive table 的增量导入?
How to take updated records along with incremental import from RDBMS table to a Hive table?
我通过每天将数据导入我的配置单元来使用 Sqoop 增量导入 table。我有以下情况:
我有一个 RDBMS table: empdata with columns
id name city
1 Sid Amsterdam
2 Bob Delhi
3 Sun Dubai
4 Rob London
我正在将数据导入 Hive,通过 shell 脚本来完成工作的 cron 作业使用 Sqoop 增量导入。
#!/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 table 中,这样我也没有重复的值。谁能告诉我如何完成它?
在 sqoop 中,您不能在 --check-column 中使用 2 个列,即使您被允许(您可以在 --check-column 中组合 2 个字段,参见示例:Sqoop Incremental Import multiple columns in check-column),那么您也是不确定下一次该城市的值是更高还是更低,因此您不能真正在检查列中使用城市字段。现在您有以下选项:
1) 在您的 RDBMS 中创建一个新的 table,其中您有另一个时间戳类型的字段,这将自动递增,以便每次您进行任何更新或插入时,它都具有当前时间戳。然后在增量追加之后,您再次使用增量 lastmodified ...--check-column ts_field 导入此 table -- last-value 在 sqoop 导入中也使用“--merge-key id”,以便它可以根据 id 合并更新。
2) a) 首先 运行 你的 sqoop 导入 --check-cloumn id --incremental append last value
b) 然后 运行 再次导入 sqoop 而不使用 --incremental 并使用 target dir 作为一些临时文件夹
c)然后使用 sqoop merge 合并数据集(target-dir in 步骤 a. 和 b),其中新数据将在 target dir of step a 到 tar dir of step b 和 --merge 键将为 "id"。
如果您还有其他问题,请告诉我。
我通过每天将数据导入我的配置单元来使用 Sqoop 增量导入 table。我有以下情况: 我有一个 RDBMS table: empdata with columns
id name city
1 Sid Amsterdam
2 Bob Delhi
3 Sun Dubai
4 Rob London
我正在将数据导入 Hive,通过 shell 脚本来完成工作的 cron 作业使用 Sqoop 增量导入。
#!/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 table 中,这样我也没有重复的值。谁能告诉我如何完成它?
在 sqoop 中,您不能在 --check-column 中使用 2 个列,即使您被允许(您可以在 --check-column 中组合 2 个字段,参见示例:Sqoop Incremental Import multiple columns in check-column),那么您也是不确定下一次该城市的值是更高还是更低,因此您不能真正在检查列中使用城市字段。现在您有以下选项:
1) 在您的 RDBMS 中创建一个新的 table,其中您有另一个时间戳类型的字段,这将自动递增,以便每次您进行任何更新或插入时,它都具有当前时间戳。然后在增量追加之后,您再次使用增量 lastmodified ...--check-column ts_field 导入此 table -- last-value 在 sqoop 导入中也使用“--merge-key id”,以便它可以根据 id 合并更新。
2) a) 首先 运行 你的 sqoop 导入 --check-cloumn id --incremental append last value b) 然后 运行 再次导入 sqoop 而不使用 --incremental 并使用 target dir 作为一些临时文件夹 c)然后使用 sqoop merge 合并数据集(target-dir in 步骤 a. 和 b),其中新数据将在 target dir of step a 到 tar dir of step b 和 --merge 键将为 "id"。
如果您还有其他问题,请告诉我。