Hive:在主表上进行递增更新的最佳方式

时间:2016-06-08 17:44:59

标签: java hadoop hive nosql

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

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

最好的方法是什么,我知道Hive最近升级并支持更新/插入/删除。

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

另一种方法是使用update语句执行某些操作以匹配主表和增量更新中的键值并更新其字段。我还没试过这个。这听起来也很缓慢,因为Hive必须将每个条目1更新为1.

任何人都对如何最有效地做到这一点有任何想法? 我对Hive和数据库很新。

2 个答案:

答案 0 :(得分:9)

如果使用MERGE无法在ACID模式下更新,则可以使用FULL OUTER JOIN进行更新。 要查找将要更新的所有条目,您需要使用旧数据加入增量数据:

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中将被覆盖和连接的分区来优化这一点。

此外,如果您要使用新数据更新所有列,则可以使用UNION ALL+row_number()应用此解决方案:https://stackoverflow.com/a/44755825/2700344

答案 1 :(得分:0)

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

再创建一个表,例如delete_keys表。这将保存主表中所有已删除的键及其代理键。

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

使用delete-keys表在主表上创建视图,以便不获取与delete-keys表匹配的键。因此,此视图将成为最终目标表。此视图将不会显示来自主表的记录,这些记录已更新为最新记录。

相关问题