Hive 的更新很有趣。
Hive 的表有两种,一种是 managed table, 一种是 external table.
managed table 是 Hive 自动帮我们维护的表,自动分割底层存储文件,自动分区,这些自动化的操作,都是 Hive 封装了与 Hadoop 交互的接口。
external table 只是一种在 Hive 维护的与外部文件的映射。
managed table 与 external table 最大的区别在于删除的时候,external table 默认情况下只是删除表定义,而数据依旧在hadoop 上存储着;managed table 则是表定义连着表数据一起被删除了。
早期的时候, Hive 支持的表操作只有两种:OverWrite 和 Appand
Overwrite 并不是对某一行的数据做更新,而是对整张表做覆盖,所以感觉上 Hive 更像是在做 ETL 里面的 Staging, 而不像是最终存储计算结果的地方。Hive 超强的计算能力可以做为大数据量转换的工具,最终结果将被送到关系型数据库或者其他 Hive 实例上存储。
hortonworks 有一篇提出相关解决方案的文章,介绍了 4步走解决增量更新 Hive 表:
url如下:https://hortonworks.com/blog/four-step-strategy-incremental-updates-hive
Ingest
Reconcile
Compact
Purge
过程中,用到了四个 Hive 表,分别是:
base_table: 初始化装载源库来的表数据,表示最新数据
incremental_table:用来装载上一次增量更新以来,发生过更改的数据,包括新增,更新,和删除
reconcile_view:以 base_table, incremental_table 计算出来的最新数据,涉及到的操作,有删除,更新,和新增。每一次都要重复计算是不是有些多余,浪费很多对没有变更的数据的重复计算。如果有对数据有分区,只要对有数据更新的分区做增量更新,会有很大效率的提高。
reporting_table:将reconcile_view的数据,装载到 reporting_table中,用它来替换掉 base_table中的数据。
一) 取决于源数据库的服务是否支持直连抽取数据,可以有两种方法完成第一步 ingest, 即 Extract.
File