【问题标题】:Hive: Best way to do incremetal updates on a main tableHive:在主表上进行增量更新的最佳方式
【发布时间】:2016-10-09 03:06:44
【问题描述】:

所以我在 Hive 中有一个主表,它将存储我的所有数据。

我希望能够加载大约每个月的增量数据更新 拥有数十亿行的大量数据。会有新数据 以及更新的条目。

解决此问题的最佳方法是什么,我知道 Hive 最近升级并支持更新/插入/删除。

我一直在想的是以某种方式找到将要更新的条目并将它们从主表中删除,然后插入新的增量更新。然而,在尝试这个之后,插入非常快,但删除非常慢。

另一种方法是使用update语句做一些事情来匹配来自主表的键值和增量更新并更新它们的字段。我还没试过这个。这听起来也很慢,因为 Hive 必须逐个更新每个条目。

有人对如何最有效地做到这一点有任何想法吗? 总的来说,我对 Hive 和数据库还很陌生。

【问题讨论】:

    标签: java hadoop merge hive hiveql


    【解决方案1】:

    如果 merge in ACID mode 不适用,则可以使用 FULL OUTER JOIN 或 UNION ALL + row_number 进行更新。 要查找将要更新的所有条目,您可以将增量数据与旧数据连接起来:

    insert overwrite target_data [partition() if applicable]
    SELECT
      --select new if exists, old if not exists
      case when i.PK is not null then i.PK   else t.PK   end as PK,
      case when i.PK is not null then i.COL1 else t.COL1 end as COL1,
      ... 
      case when i.PK is not null then i.COL_n else t.COL_n end as COL_n
      FROM 
          target_data t --restrict partitions if applicable
          FULL JOIN increment_data i on (t.PK=i.PK); 
    

    可以通过限制 target_data 中的分区来优化这一点,这些分区将使用WHERE partition_col in (select distinct partition_col from increment_data) 覆盖和连接,或者如果可能将分区列表作为参数传递并在 where 子句中使用,它会运行得更快。

    另外,如果您想用新数据更新所有列,您可以使用UNION ALL+row_number() 应用此解决方案,它比完全连接更快:https://stackoverflow.com/a/44755825/2700344

    【讨论】:

    • 谢谢!这是个好主意!
    • @leftjoin.. 能否请您详细说明如何在更新期间限制分区?
    • @vikrantrana 通过添加这样的分区过滤器:WHERE partition_col in (select distinct partition_col from increment_data) 或将分区列表作为参数传递并在 where 子句中使用
    • @vikrantrana 是的,当然,您甚至可以将列表作为参数传递。如果分区键是连接键的一部分,一切都很容易。如果不是,并且增量更新导致行从一个分区迁移到另一个分区,那么您需要重写所有受影响的分区(包含目标和增量连接键集的增量)
    • @vikrantrana Classic SCD2 在 Hive 中并不流行,因为对于历史数据重新处理,它需要使用 >=start_date 进行非 equi 连接,并且
    【解决方案2】:

    如果您使用的是旧配置单元版本,这是我的解决方案/解决方法。如果您在目标表中有大量数据,我们无法每次都删除并使用完整数据重新创建,这会更好。

    再创建一张表说 delete_keys 表。这将保存主表中的所有键,这些键连同其代理键一起被删除。

    在将增量数据加载到主表时,与主表进行左连接。对于所有匹配的记录,理想情况下我们应该更新主表。但相反,我们从主表中获取所有匹配记录的键(连同代理键)并将其插入到 delete_keys 表中。现在我们可以将所有增量记录插入到主表中,而不管它们是要更新还是插入。

    使用 delete-keys 表在主表上创建视图,以便不获取与 delete-keys 表匹配的键。所以,这个视图将是最终的目标表。此视图不会显示主表中使用最新记录更新的记录。

    【讨论】:

      猜你喜欢
      • 2016-11-06
      • 1970-01-01
      • 2017-05-12
      • 1970-01-01
      • 1970-01-01
      • 2010-11-22
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多