因为hadoop/hive本质上不支持更新,所以hive不能够采用update行级别的维度数据的更新。可以采用的变通的方式我总结有以下三种。
- hive和hbase结合
我认为这是首选的方式,hbase本质上也是不支持行级更新,只不过是追加行加上时间戳,然后取最新的时间戳的数据而已,但是对于我们来说是透明的。可以在hbase中建立一张表,然后在hive中也建立这张维度表,再hive中将这张表映射到hbase中,然后在hbase中按照行级别更新维度数据就简单多了。在ETL中,往往从其他的在线的系统的数据库中导出有更新的维度信息,然后加载到hadoop,用MR更新到hbase的表,这样就达到了更新hive中维度表的作用。
- hive中建立临时表
这样做的思路是将有更新的维度数据线加载到一张临时表中,然后select原来hive中维度表的信息只是过滤那些没有更新的行(通过将临时表作为子查询来过滤),然后union这个临时表的行再overwrite到原来的维度表,以达到维度更新的目的,这样比下面一种的方法的好处是只是需要在在线的系统数据库中获取有更新的行,这在跨网络传输的时候是比传输这个表的数据要高效得多。
- 完全更新hive维度表