2016-11-05 49 views
0

我有一个oracle数据库,需要将数据导入配置单元表。每日导入数据大小约为1 GB。什么是更好的方法?使用sqoop从RDBMS向配置单元/ hadoop增量导入数据

如果我将每一天的数据作为分区导入,那么如何处理更新的值?

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

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

如果我发送到新的分区,那么数据是重复的。 如果我想发送到已经存在的分区,我们如何才能实现?

回答

0

您唯一的选择是用'INSERT OVERWRITE TABLE ...'覆盖整个现有分区。
问题是 - 你会不断更新数据有多远?
我认为3种方法ü可以考虑:

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

Thankyou Belostoky,请问关于如何使用动态分区解决问题的问题。 – Raj

+0

如果你不是在日期分区,而是在其他一些有限的值域(例如countries/device_type/network_type)上的字段,你可以使用以下语法:INSERT OVERWRITE TABLE your_table PARTITION(part1,part2)...参见:https://cwiki.apache.org/confluence/display/Hive/Tutorial#Tutorial-Dynamic-PartitionInsert – belostoky

相关问题