hive:对主表进行增量更新的最佳方法

omtl5h9j  于 2021-06-02  发布在  Hadoop
关注(0)|答案(2)|浏览(369)

所以我在hive中有一个主表,它将存储我的所有数据。
我希望能够加载一个增量数据更新大约每个月与大量的数据数十亿行。将有新的数据以及更新的条目。
解决这个问题的最佳方法是什么,我知道hive最近升级了,并且支持update/insert/delete。
我一直在想的是如何找到将被更新的条目,并将它们从主表中删除,然后插入新的增量更新。但是在尝试这个之后,插入速度非常快,但是删除速度非常慢。
另一种方法是使用update语句来匹配主表和增量更新中的键值,并更新它们的字段。我还没试过这个。这听起来也很慢,因为hive必须逐个更新每个条目。
有人对如何最有效地完成这项工作有什么想法吗??一般来说,我对Hive和数据库都很陌生。

mitkmikd

mitkmikd1#

如果无法在acid模式下更新或合并,则可以使用完全外部联接或使用union all+行号进行更新。要查找要更新的所有条目,可以将增量数据与旧数据合并:

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);

可以通过限制目标数据中的分区来优化这一点,这些分区将使用 WHERE partition_col in (select distinct partition_col from increment_data) 或者尽可能将分区列表作为参数传递并在where子句中使用,它的工作速度会更快。
另外,如果要用新数据更新所有列,可以将此解决方案应用于 UNION ALL+row_number() ,它比完全联接工作得更快:https://stackoverflow.com/a/44755825/2700344

rdlzhqv9

rdlzhqv92#

如果您使用的是旧的配置单元版本,下面是我的解决方案/解决方法。如果目标表中有大量数据,而我们无法每次都用完整数据删除和重新创建这些数据,则这种方法效果更好。
再创建一个表,比如delete\u keys table。这将保存主表中与其代理项一起被删除的所有项。
将增量数据加载到主表中时,请与主表进行左联接。对于所有匹配的记录,我们最好更新主表。但相反,我们从主表中获取所有匹配记录的键(以及代理键),并插入该键以删除表中的键。现在,我们可以将所有增量记录按原样插入主表,而不管它们是要更新还是插入。
使用delete keys table在主表上创建视图,以便不获取与delete keys table匹配的键。所以,这个视图将是最终的目标表。此视图不会显示用最新记录更新的主表中的记录。

相关问题