首页
学习
活动
专区
工具
TVP
发布
精选内容/技术社群/优惠产品,尽在小程序
立即前往

Apache Hive 3.0之物化视图 Part1

说到物化视图的生产应用,一切的原动力来自于2001年Jonathan和Per-Ake 两位大神在微软发表的一篇论文

Optimizing Queries Using Materialized Views: A Practical, Scalable Solution.

有兴趣的同学可以读一下这篇Paper。

物化视图是在当今的SQL On Hadoop领域一个比较令人期待的重要特性,属于数据库的高级功能,在传统的数据库领域基本已经都实现了物化视图, 但是在SQL On Hadoop领域里支持这个特性的还不多。引入物化视图的目的是为了优化数据访问的效率,从数据组织层面优化数据访问效率最常见的有下面几个方向:

1. 改变数据的物理分布,例如分布和排序等等;

2. 数据模型的反范式化;

3. 数据预处理;

随之而来的产生的问题也有很多,例如需要手工创建新表,业务SQL迁移和新旧表,聚合表与基表之间的一致性维护等等。物化视图属于数据预处理,同时对上层业务透明,也就是不需要进行业务SQL迁移。

为了做到对上层业务透明,在SQL解析层面就需要解析器具备识别物化视图并且重写SQL的能力。Apache Hive 3.0 里的物化视图实际上是基于Apache Calcite 项目的实现。具体可从下面的官方页面获得具体描述:

http://calcite.apache.org/docs/materialized_views#rewriting-using-plan-structural-information

不得不提一下Julian Hyde 这位大神,Apache Calcite的主创人员,个人觉得他可以拿Hadoop领域的诺奖,如果有的话。可惜的是他离开了Hortonworks, 去了一家创业公司做C LEVEL去了。

01

物化视图建表的语法规范

在Apache Hive 3.0 里创建一个物化视图的语法规范如下:

从语法规范上,可以看到Apache Hive 3.0 目前不仅仅支持常见的ORC文件格式,同时还通过Storage Handler来支持其他数据存储,例如Druid. 这也是Apache Hive 3.0 的另一个特性,不过这并不在本文的讨论范围内,这里先略过。

02

视图,物化视图与SQL重写

在视图和物化视图的优化方向上,都存在SQL的后台重写工作。其区别是视图只是创建一个虚表,只有表结构,没有数据,实际查询的时候再去改写SQL去访问实际的数据表。

优点

上层的业务查询和底层数据表解耦,业务上可以查的一张表,但是底层可能映射的是三张或多张表的数据,修改底层数据模型只需要重建视图即可,不需要上层业务修改业务逻辑。

缺点

无法再对视图进行优化,而且并没有提升查询速度,只是使上层的业务逻辑变得更清晰简洁

物化视图,实际和视图是两个东西。它没有破坏上层的业务查询逻辑,而是从底层入手。由于物化视图里是一个物理表,因此SQL解析器对基于物化视图的SQL改写就非常重要了。

03

示例1: 简单Join

这个表是将员工表和部门表按部门ID join 的结果集。当有业务来查询的时候,比如查询2018年1月到3月的新入职人员和所在部门的信息:

虽然查询还是写的查询emps 和 depts 表按部门ID做Join 操作再过滤时间。但是因为Hive 知道有这个物化视图的存在,它会在后台把SQL改写成:

从业务的角度来看,他的查询是查两张表,但是在后台执行层面,实际是从物化视图表进行简单过滤操作得到的结果集。从而大大的提升了查询的响应时间,也省了很多计算资源。这就是物化视图的SQL重写。另外,不仅仅在查询范围全命中的情况下会改写SQL,部分命中的情况下也会改写SQL。

04

示例2: 星形模型

当业务需要查询

注意到这里mv的表是基于一个5张表的星型模型建立的,虽然在业务层面,查询的是lineorder和date 这两张表,但是,Hive会识别已有的物化视图,并且自动的把SQL改写成基于mv的查询。至于原理,就是Calcite这个项目和关系代数神教干的事。除了能在表级进行优化外,Apache Hive 3.0的物化视图还能判断数据粒度,更科学高效的利用已有数据来给出结果。

05

示例3:基于时间的单表聚合

业务查询的SQL为

而实际后台真正执行的SQL是

上面的三个例子基本展示了在Apache Hive 3.0 中物化视图的能力和使用方法,后续的篇章会在具体实现原理和运维管理上讲解。

BYE..

  • 发表于:
  • 原文链接https://kuaibao.qq.com/s/20180518G01X2700?refer=cp_1026
  • 腾讯「腾讯云开发者社区」是腾讯内容开放平台帐号(企鹅号)传播渠道之一,根据《腾讯内容开放平台服务协议》转载发布内容。
  • 如有侵权,请联系 cloudcommunity@tencent.com 删除。

扫码

添加站长 进交流群

领取专属 10元无门槛券

私享最新 技术干货

扫码加入开发者社群
领券