Google Dremel数据模型详解(下)

“神秘”的r和d

单从数据结构来看的话,我们可以这样解释r和d的含义。r代表着当前字段与前一字段的关系,是在哪一层合并的,即公共的父结点在哪?举例来说,假如我们重建到了Code=‘en‘,通过r=2可以知道是在Language那一层发生了重复。

为了保持原纪录的结构,我们会保存一些NULL数据,而d就是用于重建NULL字段。通过d的值,就能知道NULL的结构。例如下图,通过r=1知道应该合并到Name那一层。而通过d=1则知道路径上只有一个字段,即不仅仅是Code字段不存在,Language也不存在。这样就把NULL正确地重建出来了,那么接下来的Code=‘en-gb‘的层级也就不会乱了。

然而这只是从静态的数据结构来解释,而r和d的深层次含义还是要看FSM是如何执行的。真正的因果关系是FSM的执行方式决定了数据结构的设计

3 记录查询

3.1 从FSM角度看r和d

先看一下前面例子的完整FSM的样子。如果把Protocol Buffer中对数据格式定义的schema看作是编译原理中的语法定义的话,那么一般可以使用工具如antlr, yacc自动生成自动机,手写的话是相当恐怖的吧。

对列数据的完整遍历就是这个样子的:

在讨论查询如何执行之前,先继续刚才未完成的题目,r和d的本质,这次通过动态的FSM的角度来分析,而不是静态的数据结构了:

?  FSM状态机只是定义了状态的变更,即处理流程应当如何在各个列的存储表之间跳转,而实际数据还是在表中保存。有点像数据库索引,遍历时是根据FSM进行跳转,然后对某一列的表进行table scan。但索引是靠字段值的顺序组织,因为数据库表之间没什么嵌套关系,而Dremel的FSM则是靠字段之间的嵌套关系来组织。

?  状态机中线条上的数字表示什么?回忆一下,数字表示的是:字段的数据表中当前行的下一行的r值。通过检测下一个r值来决定跳转。因为r=0,则说明下一行与当前行所表示的字段一定不在同一路径,否则必然会在某一Level上有共同的字段(路径的部分重叠)。注意这是由于Protocol Buffer的schema不是树,没有共同的根所导致,否则所有字段必然都会在根重复,上面对r的解释也就没意义了。以repeated的Forward为例,检查到下一行r=1说明40、60都是接在20字段下面的。Code字段也是同样道理。

?  Name.Language.Code到Name.Language.Country之间的线上为什么是0,1,2?因为Name.Language.Code是required不是repeated,读取后不管下一行的r值是多少都要去读Name.Language.Country。同理Name.Language.Country也是读完不管怎样都跳到下一字段。

?  最复杂的要属Name.Url了,因为它是schema里定义的最后一个字段。在Name.Url这要决定到底是继续下一文档如r2的处理,还是跳回到本文档的其他字段继续处理。具体分析一下:r=0说明当前文档中没有Name字段了。为什么这么说?因为如果文档后面真有Name字段,假如下面有Url,则当前表中的下一条应该是r=1;假如下面没有Url,则当前表的下一条应该是r=0的NULL。这里NULL又发挥用处了!所以中间部分的NULL能保持结构无损,而后面部分的NULL能提示文档是否结束

3.2 查询引擎

至此,我们已经彻底摸清Dremel数据模型以及FSM的基本运行方式了。现在终于可以分析Dremel是如何解析和执行类SQL查询的了。查询语言类似SQL,输出也是个嵌套式的记录,以及schema定义。

那么查询引擎如何执行呢?首先为查询语句中涉及到的每个字段都打开一个Reader来读取数据,然后就是根据WHERE中的条件过滤以及根据SELECT中的条件投影并聚合了。难点在于:重建出层次关系,再进行过滤和聚合。例如,过滤掉DocId=20很容易,但其实文档r2的所有记录都应被过滤。因为WHERE中两个条件是AND关系,同时DocId又是最底层的字段,所以相当于r2这一整棵树都被裁剪掉了。Code=en-gb也是由于所在的Name字段下没有满足http开头的Url字段,而被间接的过滤掉了。

聚合也是同样道理,有了层次关系,才能正确的聚合。例如Code=en-us,en和Url=http://A是同一个Name下的,COUNT和字符串拼接时会一起处理。而Url=http://B则是另一个Name下的,要分开处理。

参考资料

1 Dremel: Interactive Analysis of Web-Scale DataSets

时间: 2024-12-15 19:25:18

Google Dremel数据模型详解(下)的相关文章

Google Dremel数据模型详解

首先简单介绍一下Dremel是什么,能解决什么问题.第二部分着重讲Dremel的数据模型,即数据结构.第三部分将谈一下在此数据结构上设计的算法. 1 起源 Dremel的数据模型起源于分布式系统的应用环境(Protocol Buffers,一种在Google内广泛使用,现已开源的实现).其数据模型是基于强类型的嵌套记录,抽象语法可以表示成下面公式: 一个例子: 2 嵌套列式存储 2.1 记录结构的无损表示 首先来看一下Dremel的数据模型是如何在列式存储下无损的表示出记录的结构的(lossle

Android Google Map v2详解之:开发环境配置

Android Google Map v2详解之:开发环境配置                                       --转载请注明出处:coder-pig 说在前面: 说到地图定位,现在越来越多的社交app都加入了地图和定位的功能模块,用户很多的时候 也会用到这些东东,比如,到外面吃饭,次次吃饭前都要拍下照片发到朋友圈,定个位,然后发条说说, 炫耀一下自己今天吃了什么高大上的东东,炫耀和攀比心理我懂,不过,一次下班去吃饭,看到一妹子 吃饭,拍照+发朋友圈,足足用了大概20

Android研究之属性动画(Property Animation)完全解析详解下

 上一篇Android研究之属性动画(Property Animation)完全解析详解上已经基本展示了属性动画的核心用法: ObjectAnimator实现动画,ValueAnimator实现动画,AnimatorSet的使用等~ 当然了属性动画还有一部分的知识点,也能做出很不错的效果,将在本篇博客为您展示~ 1.如何使用xml文件来创建属性动画 大家肯定都清楚,View Animator .Drawable Animator都可以在anim文件夹下创建动画,然后在程序中使用,甚至在The

JEPLUS之列表字段项配置详解下——JEPLUS软件快速开发平台

JEPLUS之列表字段项配置详解--下 在上篇的文章中我介绍了一些列表字段项配置,在这里我接着上篇中列表配置项中的高级配置项介绍下. 一.效果展示 二.准备工作 1.JEPLUS平台5.0.0.2 2.数据库MySql 5.7 三.详解步骤 1.统计类型 :可以对表格整列进行统计 可以进行多选操作,统计描述:统计数据的文字描述,总统计描述:统计分为单页统计与全局统计 统计类型: 2.隐藏:可以控制字段的显隐,编辑:设置字段是否支持字段列表编辑,批量更新:列表数据可以进行批量更新操作.分布加载:把

Android Touch事件传递机制详解 下

尊重原创:http://blog.csdn.net/yuanzeyao/article/details/38025165 资源下载:http://download.csdn.net/detail/yuanzeyao2008/7660997 在前一篇文章中,我主要讲解了Android源码中的Touch事件的传递过程,现在我想使用一个demo以及一个实例来学习一下Andorid中的Touch事件处理过程. 在Android系统中,和Touch事件分发和处理紧密相关的三个函数如下:(1) public

NoSQL数据模型详解(四)の聚合型小结

背景 在前三篇文章中已经介绍了NoSQL中属于聚合模型的三种数据库:键值型.文档型.列族型.下面针对三种聚合数据模型的共同点和不同点加以分析以便很好的来认识掌握各自的特点. 相同点 三种面向聚合的数据模型的共同点是,他们都是用聚合这一概念,而且聚合中都有一个可以查找其内容的索引键.在集群上运行时,聚合都是重点环节,因为数据库必须保证将聚合内的数据存在同一节点上.聚合还是"更新"操作的最小数据单位,对于事务控制来说,以聚合为操作单元,其大小正合适. 不同点 键值数据模型将聚合看作不透明的

NoSQL数据模型详解(二)の文档模型

背景 "文档"是文档数据库中的主要概念.此类数据库可存放并获取文档.其格式可以是XML.JSON.BSON等.这些文档具备子属性.呈现树状数据结构,可以包含映射表.集合和纯量值.数据库中的文档彼此相似,但不必完全相同.文档数据库所存放的文档,就相当于键值数据库所存放的"值".文档数据库可以视为其值可查的键值数据库.流行的文档数据库有:MongoDB.CouchDB.Terrastore.OrientDB.RavenDB. 一致性 为了在Mongodb数据库中确保&q

Mongodb(五):Mongodb的增删改查(4)----查询详解(下)

(1) $all查询:用于查询数组,匹配数组中的元素,要全部匹配才能有结果:示例: 现在我如果写成这个样子: db.customer.find({"books":{"$all":["java", "jQuery"]}}),那么是查不出结果的,因为 在document中匹配不到结果,只有将["java", "jQuery"]在document中全部匹配到,才能查询出来.它与sql语句中的i

[js高手之路]深入浅出webpack教程系列3-配置文件webpack.config.js详解(下)

本文继续接着上文,继续写下webpack.config.js的其他配置用法. 一.把两个文件打包成一个,entry怎么配置? 在上文中的webpack.dev.config.js中,用数组配置entry webpack.dev.config.js文件代码: 1 console.log( __dirname ); //D:\ghostWu\bak\webpack\demo2 2 module.exports = { 3 entry : ['./src/js/main.js', './src/js/