Hive - 如何在 Hive 中跟踪和更新增量表的上次修改日期?

Posted

技术标签:

【中文标题】Hive - 如何在 Hive 中跟踪和更新增量表的上次修改日期?【英文标题】:Hive - How to track and update Last Modified date in Hive for delta tables? 【发布时间】:2015-01-08 00:21:26 【问题描述】:

我有一个用例,其中 Hive 中的源表每天都会更新,从而刷新整个数据。在第一天,我们提取了整个表格,但从第二天开始,我们只对那些“上次修改日期”已更新以反映前一天日期的行感兴趣。

建议的解决方案是在第 1 天和第 2 天存储 Last Modified Date 的 MAX,比较 Last Modified Date 大于存储日期的所有行,并仅处理这些行。

每天生成、存储和检索此上次修改日期的最佳方式是什么?此外,不同的表格会有不同的日期,理想情况下,我想要有 Table_Name, Last_Modified_Date 的东西,除非有更好的方法。

请帮忙。谢谢。

【问题讨论】:

【参考方案1】:

如果我正确理解了您的情况,在新的每日运行中,Last_Modified_Date 的值只能大于上次运行时 Last_Modified_Date 的最大值。

在这种情况下,我建议在 Last_Modified_Date 上创建表分区并仅处理那些落入该分区的记录(这比处理您的比较要快得多)。

【讨论】:

这可能有效,但它是一个时间戳。不完全确定如何将时间戳用作分区键。此外,这是 ETL 管道的一部分,除非我们确定数据已被处理,否则我们不希望更新上次修改日期(无论它将被存储在哪里)。如果它失败了,而我们盲目地更新日期,我们最终可能会错过一天或更长时间。【参考方案2】:

这个解决方案可行吗?

    从“上次修改日期”中提取日期作为新列,命名为 dateid;使用 dateid 作为分区键。 刷新整个数据时,可以将所有数据拆分到不同的分区;(这个动作可以通过hive的动态分区特性来实现)。 那么你可以处理last dateid中的数据,如果你是按天处理数据的话。

【讨论】:

我们使用的数据已经被其他人放置在那里,我们对此无能为力。我们的 ETL 管道是这样的,我们获取该数据,将其推送到临时位置,将其从那里移动到下一个位置,然后删除临时位置。所以分区在这里是不可能的。【参考方案3】:

经过多次头脑风暴,我们决定使用中间表来存储上次修改日期的 MAX 和表名,并将其用作查找来确定要处理的新记录。由于我们使用的是 shell 脚本,我突然想到我可以使用一个变量来查询表并获取上次修改日期,然后使用该变量来处理新的/更新的记录。

【讨论】:

你能分享更多关于你是如何做到这一点的细节吗?【参考方案4】:

describe formatted table_name ...您将获得transient_lastDdlTime,您可以使用以下方法进行转换。

SELECT CAST(from_unixtime(your_transient_lastDdlTime_value) AS 时间戳);

感谢和问候, Kamleshkumar 古吉拉特语

【讨论】:

以上是关于Hive - 如何在 Hive 中跟踪和更新增量表的上次修改日期?的主要内容,如果未能解决你的问题,请参考以下文章

增量更新 Hive 表数据

更新 hive 表中的增量记录

hive增量抽取方案

SQOOP增量抽取时,在HIVE中实现类似Oracle的merge操作

如何使用StreamSets从MySQL增量更新数据到Hive

PySpark。如何确保每日增量数据在 HIVE 中没有重复的 UUID 作为 PK