2015-01-08 53 views
2

我有一个用例,其中Hive中的源表每天都以更新整个数据的方式进行更新。在第一天,我们摄取了整个表格,但从第二天起,我们只对其“上次修改日期”已更新以反映前一天的日期的那些行感兴趣。Hive - 如何跟踪和更新Hive中增量表的上次修改日期?

建议的解决方案是在第1天和第2天存储上次修改日期的最大值,比较上次修改日期大于存储日期的所有行,并仅处理这些行。

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

请帮忙。谢谢。

回答

0

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

0

如果我正确理解您的方案,则在每天新的运行中,Last_Modified_Date的值只能大于上次运行时Last_Modified_Date的最大值。

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

+0

这可能有效,但它是一个时间戳。不完全确定时间戳可以如何用作分区键。此外,这是ETL管道的一部分,除非我们确信数据已经处理,否则我们不希望更新上次修改日期(无论它将存储在何处)。如果失败了,我们会盲目更新日期,那么我们最终可能会错过一天或更长时间。 – CodingInCircles

0

该解决方案可能吗?

  1. 从“上次修改日期”提取日期作为新列,名为dateid;使用dateid作为分区键。
  2. 刷新整个数据时,可以将所有数据拆分成不同的分区;(这个动作可以通过hive的动态分区功能来实现)。
  3. 然后,如果您每天处理数据,则可以处理上一个dateid中的数据。
+0

我们使用的数据已被其他人放置在那里,我们无能为力。我们的ETL管道是这样的,我们将这些数据,推到一个临时位置,从那里移动到下一个位置,然后删除临时位置。所以分区不在这里。 – CodingInCircles