问题
- hive虽然已经支持更新操作但是效率低,所以要更新数据就要通过自己手动进行更新。
- 拿业务数据来说,使用sqoop脚本是可以直接把全量数据抽取到hive中,sqoop也有两种增量抽取数据的方法,一种是基于自增列,一种是基于时间列。可以参考:sqoop增量导入的两种方式;但是这两种方法里面是只可以把新增的数据拉去过来的,变化的数据是没有抽取过来,所以我们使用的增量抽取是使用的表里面的修改时间和创建时间来进行增量抽取。
- 抽取过来的数据就要考虑如何进行更新操作,因为抽取过来的数据既有新增也有变化。现在就要考虑到如何将变化的数据进行合并?
实现
考虑hive中储存历史状态变化的数据
使用拉链表(详细查看 拉链表制作)
以下实现方法是不考虑hive中储存历史状态变化的数据,只存储最新状态的数据。
1.使用窗口函数row_number进行实现
思路:
- 首先抽取的表必须要有一个唯一主键,先根据创建时间和修改时间将新增的和变化的数据拉去过来到一张临时表
- 将临时表和之前正式表进行union all操作
- 使用row_number函数根据唯一主键进行分组,根据修改时间进行排序,取出修改时间最大的那条数据,更新到正式表既可以(中间有个问题