使用sqoop将数据从RDBMS递增导入hive / hadoop

时间:2016-11-05 18:18:03

标签: hadoop hive sqoop hadoop2

我有一个oracle数据库,需要将数据导入到hive表中。每日导入数据大小约为1 GB。什么是更好的方法?

如果我将每天数据导入分区,如何处理更新后的值?

例如,如果我将今天的数据导入为分区,并且第二天有一些字段使用新值进行更新。

使用--lastmodified我们可以获取值,但是我们需要将更新的值发送到新分区还是旧的(已经存在的)分区?

如果我发送到新分区,则数据将被复制。 如果我想发送到现有的分区,我们该如何实现它?

1 个答案:

答案 0 :(得分:0)

您唯一的选择是使用“INSERT OVERWRITE TABLE ...”覆盖整个现有分区 问题是 - 您将在多长时间内不断更新数据? 我想到你可以考虑的3种方法:

  • 确定“新鲜”数据的阈值。例如'14天倒退'或'倒退1个月' 然后,每天运行作业时,都会向后覆盖分区(只有具有更新值的分区),直到确定阈值为止。
    每天约1 GB应该是可行的 在您确定的时间之前的所有数据都不保证100%正确 如果您知道字段只能在最初设置后的某个时间窗口内更改,则此方案可能是相关的。
  • 使您的Hive表与ACID事务兼容,从而允许更新表 将您的日常工作拆分为2个任务:为运行日编写的新数据。您需要向后运行的更新数据。 sqoop将负责新数据。手动处理更新的数据(一些生成更新语句的脚本)
  • 不要根据时间使用分区。也许动态分区更适合您的用例。它取决于正在处理的数据的性质。