我有下面的用例:
我的应用程序在 RDBMS 数据库中有一个多年数据的表格。我们使用 sqoop 将数据导入HDFS并加载到按年,月划分的hive表中。
现在,应用程序更新,并且每天也将新记录插入到RDBMS表格表中。这些更新的记录可以跨越历史月份。更新的记录和新插入记录可以通过更新的时间戳字段确定(它将具有当前日期时间戳)。
现在的问题是:如何使用这些更新的记录每天执行delta / incremental load hive表。
- >我知道有一个sqoop功能允许增量导入。但是,只有新的增量导入对我们来说还不够。
因为 -
- >我无法在hive表中直接插入这些记录(使用insert into),因为它会导致重复的记录(更新的记录)。
- >同样的方式我不能使用insert overwrite语句,因为这些只是更新和插入跨越多个月的记录。插入覆盖将删除先前的记录。
当然,最简单的选择是每天使用sqoop获取完整数据,但我们不希望这样做,因为数据量很大。
因此,基本上我们只想完全加载那些已收到更新/插入记录的分区。
我们愿意在蜂巢或sqoop端探索选项。你能告诉我们吗?
提前致谢。
答案 0 :(得分:2)
对于任何基于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
答案 1 :(得分:0)
我们在将批量数据插入数据池时遇到了类似的问题。 由于我们无法控制数据,因此我们很难保持湖泊清洁,不会重复。 请注意,这不是关于更新配置单元中的记录,而是关于避免重复同一记录的重复。
我为此任务创建了一个猪脚本:
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做同样的事情但我们无法在内部使用它。
答案 2 :(得分:0)
我为增量加载提供了一个解决方案,该解决方案包含一个shell脚本,您只需要计划作业,就可以将行逐步添加到配置单元数据库中。对于完整的解决方案,您必须点击此链接-
https://bigdata-analytix.blogspot.com/2018/10/hive-incrementaldelta-load.html