蜂巢中的增量/增量负载

时间:2014-06-12 15:41:56

标签: hadoop hive sqoop hiveql

我有下面的用例:

我的应用程序在 RDBMS 数据库中有一个多年数据的表格。我们使用 sqoop 将数据导入HDFS并加载到按年,月划分的hive表中。

现在,应用程序更新,并且每天也将新记录插入到RDBMS表格表中。这些更新的记录可以跨越历史月份。更新的记录和新插入记录可以通过更新的时间戳字段确定(它将具有当前日期时间戳)。

现在的问题是:如何使用这些更新的记录每天执行delta / incremental load hive表。

- >我知道有一个sqoop功能允许增量导入。但是,只有新的增量导入对我们来说还不够。

因为 -

- >我无法在hive表中直接插入这些记录(使用insert into),因为它会导致重复的记录(更新的记录)。

- >同样的方式我不能使用insert overwrite语句,因为这些只是更新和插入跨越多个月的记录。插入覆盖将删除先前的记录。

当然,最简单的选择是每天使用sqoop获取完整数据,但我们不希望这样做,因为数据量很大。

因此,基本上我们只想完全加载那些已收到更新/插入记录的分区。

我们愿意在蜂巢或sqoop端探索选项。你能告诉我们吗?

提前致谢。

3 个答案:

答案 0 :(得分:2)

对于任何基于Hive的系统来说,更新是一个众所周知的难题。

一种典型的方法是两步过程

  1. 将已更改的所有数据插入一个表中。正如您所说,当更新行时,这将导致重复。
  2. 定期使用第一个表中的“重复数据删除”数据覆盖第二个表。
  3. 第二步可能很痛苦,但实际上没有办法解决它。在某种程度上,您必须覆盖,因为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