我有下面的用例:
我的应用程序有一个表,其中包含多年数据在RDBMS DB中。我们使用sqoop将数据输入到HDFS中,并加载到按年份、月份划分的hive表中。
现在,应用程序每天更新,并将新记录插入RDBMS表中。这些更新的记录可以跨越历史几个月。更新的记录和新的插入记录可以由更新的时间戳字段确定(它将具有当前的日期时间戳)。
现在这里的问题是:如何使用这些更新的记录每天执行增量加载单元表。
->我知道有一个sqoop功能,它允许增量导入。但是,只有新的增量进口对我们来说是不够的。
因为-
-> I不能直接在hive表中插入这些记录(使用insert into),因为它将导致重复记录(更新的记录)。
->同样不能使用insert覆盖语句,因为这些只是跨越多个月的更新和插入记录。插入覆盖将删除以前的记录。
当然,最简单的选择是每天使用sqoop获取完整的数据,但是我们不想这样做,因为数据量很大。
因此,基本上我们只想完全加载那些已经收到更新/插入记录的分区。
我们开放在蜂箱或sqoop末端探索选项。你能告诉我们吗?
提前谢谢。
发布于 2014-06-12 18:48:39
对于任何基于蜂巢的系统来说,更新都是一个众所周知的难题。
一个典型的方法是一个两步的过程。
第二步是潜在的痛苦,但实际上是无法避免的。在某种程度上,您必须覆盖,因为Hive不进行就地更新。但是,根据您的数据,您可能能够巧妙地对表进行分区,以避免执行完全覆盖。例如,如果步骤1只插入少数几个分区,那么只需要将这些分区覆盖到第二个表中。
另外,根据访问模式的不同,让第二个“去复制”表成为视图而根本不实现它是有意义的。不过,通常情况下,这只是延迟查询时间的痛苦。
我看到的唯一相反的方法是使用非常定制的输入和输出格式。与其解释这一切,不如在这里阅读:http://pkghosh.wordpress.com/2012/07/08/making-hive-squawk-like-a-real-database/
欧文·奥马利( Owen‘’Malley)也一直致力于在标准蜂巢中添加这个想法的一个版本,但它仍在开发中:https://issues.apache.org/jira/browse/HIVE-5317
发布于 2015-04-29 17:02:01
对于批量嵌入、更新和删除,您可以使用直接映射减少方法。细节在这里。它本质上是一个合并和紧凑的操作。二级排序在时间戳或序列字段上执行,或者在记录中执行,或者在HDFS文件名中编码。还原器端连接记录的最后一个版本作为输出发出。
https://pkghosh.wordpress.com/2015/04/26/bulk-insert-update-and-delete-in-hadoop-data-lake/
发布于 2017-02-01 09:51:56
我们在将大量数据插入到数据包中时也遇到了类似的问题。由于我们没有控制数据,所以我们很难保持湖面不被复制。请注意,这并不是要更新蜂巢中的记录,而是要避免再次重复同一记录。
我为这个任务创建了一个猪脚本:
CODATA = COGROUP HISTORICAL_DATA BY (key_col_1, key_col_2, ...),
DAILY_DATA_DISTINCT BY (key_col_1, key_col_2, ...);
CODATA_FILTERED = FILTER CODATA BY IsEmpty(HISTORICAL_DATA);
SET_DIFFERENCE = FOREACH CODATA_FILTERED GENERATE FLATTEN($2);
DUMMY = FILTER DAILY_DATA_DISTINCT BY $0=='';
DAILY_NEW_DATA = UNION DUMMY, SET_DIFFERENCE;它建立了设定的差异。Apache DataFu SetDifference也这样做,但我们无法在内部使用它。
https://stackoverflow.com/questions/24188544
复制相似问题