我有以下用例:
我的应用程序有一个表多年数据 in RDBMSD B。我们已经用过sqoop将数据获取到 HDFS 并加载到按以下分区的 hive 表中年、月.
现在,应用程序每天都会更新并将新记录插入 RDBMS 表中。这些更新的记录可以跨越历史月份。更新的记录和新的插入记录可以通过更新的时间戳字段来确定(它将具有当天时间戳)。
现在的问题是:如何使用这些更新的记录每天进行增量/增量加载配置单元表。
-> 我知道有一个 sqoop 功能允许增量导入。但是,仅仅新增增量进口对我们来说还不够。
因为 -
-> 我不能直接在hive表中插入这些记录(使用insert into),因为这会导致重复记录(更新记录)。
-> 同样,我不能使用插入覆盖语句,因为这些只是跨多个月的更新和插入记录。插入覆盖将删除较早的记录。
当然,最简单的选择是每天使用 sqoop 获取完整数据,但我们不想这样做,因为数据量很大。
因此,基本上我们只想完全加载那些我们已收到更新/插入记录的分区。
我们愿意探索 hive 或 sqoop 端的选项。您能告诉我们吗?
提前致谢。
对于任何基于 Hive 的系统来说,更新都是一个众所周知的难题。
一种典型的方法是两步过程
- 将任何已更改的数据插入到一张表中。正如您所说,更新行时这将导致重复。
- 定期用第一个表中的“删除重复”数据覆盖第二个表。
第二步可能会很痛苦,但确实没有办法解决。在某种程度上,您必须覆盖,因为 Hive 不进行就地更新。不过,根据您的数据,您也许能够足够巧妙地对表进行分区,以避免完全覆盖。例如,如果步骤 1 仅插入到少数分区,则只需将这些分区覆盖到第二个表中。
此外,根据访问模式,将第二个“去重”表作为视图而不具体化也是有意义的。不过,通常这只会延迟查询时间的痛苦。
我见过的唯一另一种方法是使用非常自定义的输入和输出格式。您可以在这里阅读:http://pkghosh.wordpress.com/2012/07/08/making-hive-squawk-like-a-real-database/
Owen O'Malley 也一直致力于将这个想法的一个版本添加到标准 Hive 中,但这仍在开发中:https://issues.apache.org/jira/browse/HIVE-5317
本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)