首先简单介绍一下Dremel是什么,能解决什么问题。第二部分着重讲Dremel的数据模型,即数据结构。第三部分将谈一下在此数据结构上设计的算法。

1 起源

Dremel的数据模型起源于分布式系统的应用环境(Protocol Buffers,一种在Google内广泛使用,现已开源的实现)。其数据模型是基于强类型的嵌套记录,抽象语法可以表示成下面公式:

一个例子:

2 嵌套列式存储

2.1 记录结构的无损表示

首先来看一下Dremel的数据模型是如何在列式存储下无损的表示出记录的结构的(lossless representation of record structure in a columnar format)。如果仅仅是数值(values)的话,数值本身无法传递出记录(record)的结构信息。我们不知道两个数值是属于两条不同的记录还是在一条记录下,同时我们也不知道一些可选的字段(field)是否显式定义。因此,我们引入了两个概念:Repetition LevelDefinition Level

为了说清楚Dremel模型是如何无损地表示数据的,我想到了两种画法。最终还是决定采用第一种画法,类似有向图,感觉与后面的FSM状态机能更好的对应上。

Repetition Level

Dremel论文中对repetition level的定义听起来比较抽象:at what repeated field in the field's path the value has repeated。意思就是在路径上,在哪个repeated字段上重复了。还是看个例子解释一下吧,以之前的图例中的文档r1中的Code字段为例。

上图清晰地表示出三个Code字段与文档中字段的对应关系。下面来看一下这三个Code的repetition level(简写为r) 0,2,1是如何计算出来的。下图忽略无关的字段,将三个Code字段的完整路径都表示出来。那么就可以简单易懂地看出,r就是这些字段路径上,发生重复了的字段的level。请参考下图中的注释就能很快理解。

大家可能还注意到Name.Code表中除了en-us、en和en-gb三行外,还有两行NULL。第二个NULL是描述文档r2的,我们就分析一下第一个NULL的含义吧。因为文档r1的第二个Name字段下没有Code,而为了说明en-gb是属于第三个Name字段下的,所以在en和en-gb之间加了一行NULL,其r也等于1(Name重复)。同时,由于Code在定义中是required的字段,所以事实上这一行NULL也暗示了:在第二个Name字段下Language也是不存在的。不然Language存在而下面却没有Name,这是不符合文档定义的。

以此类推,其他字段的r值都是这样计算出来的。同时注意一点:我们只保存了有值的字段,如DocId、Name.Url、Name.Language.Code等,而像Links、Name.Language等字段是没必要保存的。

Definition Level

definition level(简写为d)在论文中的定义还比较清楚:Each value of a field with path p , esp. every NULL, has a definition level specifying how many fields in p that could be undefined (because they are optional or repeated) are actually present. 尤其对于NULL来说,路径p上有多少字段可以是不存在(例如在文档定义中是optional或repeated,而不是required),然而实际却存在的。例如文档r1的Links下没有Backward字段,然而Links字段却存在(因为Links下有Forward),所以我们在Links.Backward表中保存一条NULL,并且d=1。对于非NULL字段来说,意义不大,因为d的值对于每种字段来说都是相同的,例如Code都是2,Country都是3。

值得注意的几点是:

Ø  在路径上计算多少字段本可以不存在时,包含了当前字段本身。例如计算Country:us时,Country本身也是optional,也计入总数,所以d=3。

Ø  每种字段只计算1次。例如最下面的Country:gb,在其路径上的3个Name都满足条件,但只计1次,所以d=3,而不是5。(前面提过,也许是我这第一种画法的缘故,需要这一条规则来限定)

数据压缩

前面介绍了数据的保存方法,实际上真正保存时,数据还会被进一步压缩。

Ø  不显式保存NULL,因为它可以通过d来确定:d < 路径上repeated和optional字段总数,就说明是NULL。可以通过前面的例子印证一下。

Ø  总是会被定义的字段的d不会被保存。

Ø  r也是仅在必要时才会保存。例如d=0暗示r=0,所以r可以省略不存。

Ø  像DocId这种所有level都是0的,实际上不会保存任何level信息。

Ø  尽可能使用位图。例如假如d最大是3,那么我们只使用2个bit来保存。

2.2 快速编码成列式存储

略,详见论文附录部分的伪代码。

2.3 高效地组装记录

高效地从列式存储数据中组装出记录,对像MapReduce这种面向记录的数据处理工具来说非常重要。我们的目标是:给定字段的子集,我们能重新构建出仅包含选中字段的原始记录,而过滤掉其他字段。的记录。

8.      FSM委托Reader1继续读取DocId第二行(之前Reader1就停在这里了)

9.      到这里应该已经很清楚了,最后过程就略说了:DocId中没有数据了,FSM状态变化,Reader2继续读取Country的最后一行数据,重建出记录。

注:论文原图中少了第二个Name字段,我觉得应该加上吧。在第五步被重新构建出来。为什么在原图中没有呢?

前面例子的完整FSM就是这样的:

Google Dremel数据模型详解(上)的更多相关文章

  1. Google Dremel数据模型详解(下)

    "神秘"的r和d 单从数据结构来看的话,我们可以这样解释r和d的含义.r代表着当前字段与前一字段的关系,是在哪一层合并的,即公共的父结点在哪?举例来说,假如我们重建到了Code=' ...

  2. SSL/TLS协议详解(上):密码套件,哈希,加密,密钥交换算法

    本文转载自SSL/TLS协议详解(上):密码套件,哈希,加密,密钥交换算法 导语 作为一名安全爱好者,我一向很喜欢SSL(目前是TLS)的运作原理.理解这个复杂协议的基本原理花了我好几天的时间,但只要 ...

  3. IE8“开发人员工具”使用详解上(各级菜单详解)

    来源: http://www.cnblogs.com/JustinYoung/archive/2009/03/24/kaifarenyuangongju.html IE8“开发人员工具”使用详解上(各 ...

  4. C++框架_之Qt的窗口部件系统的详解-上

    C++框架_之Qt的窗口部件系统的详解-上 第一部分概述 第一次建立helloworld程序时,曾看到Qt Creator提供的默认基类只有QMainWindow.QWidget和QDialog三种. ...

  5. 前端后台以及游戏中使用Google Protocol Buffer详解

    前端后台以及游戏中使用Google Protocol Buffer详解 0.什么是protoBuf protoBuf是一种灵活高效的独立于语言平台的结构化数据表示方法,与XML相比,protoBuf更 ...

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

    [js高手之路]深入浅出webpack教程系列索引目录: [js高手之路]深入浅出webpack教程系列1-安装与基本打包用法和命令参数 [js高手之路]深入浅出webpack教程系列2-配置文件we ...

  7. Linux常用命令详解上

    Linux常用命令详解上 目录 一.shell 二.Linux命令 2.1.内部命令与外部命令的区别 2.2.Linux命令行的格式 2.3.编辑Linux命令行的辅助操作 2.4.获得命令帮助的方法 ...

  8. Linux主要shell命令详解(上)

    [摘自网络] kill -9 -1即实现用kill命令退出系统 Linux主要shell命令详解 [上篇] shell是用户和Linux操作系统之间的接口.Linux中有多种shell,其中缺省使用的 ...

  9. Mybatis全面详解——上(学习总结)

    原文地址:https://blog.csdn.net/ITITII/article/details/79969447 一.什么是Mybatis 这里借用官网的一句话介绍什么是mybatis:MyBat ...

随机推荐

  1. [HNOI 2008]GT考试

    Description 题库链接 问你长度为 \(n\) 的可含前导零的数字串中,不含长度为 \(m\) 的子串 \(X\) 有多少个,取模. \(1\leq n\leq 10^9,1\leq m\l ...

  2. [NOI 2001]炮兵阵地

    Description 司令部的将军们打算在N*M的网格地图上部署他们的炮兵部队.一个N*M的地图由N行M列组成,地图的每一格可能是山地(用“H” 表示),也可能是平原(用“P”表示),如下图.在每一 ...

  3. [TJOI2017]异或和

    题目描述 在加里敦中学的小明最近爱上了数学竞赛,很多数学竞赛的题都是与序列的连续和相关的.所以对于一个序列,求出它们所有的连续和来说,小明觉得十分的 简单.但今天小明遇到了一个序列和的难题,这个题目不 ...

  4. Codeforces Round #406 (Div. 1)

    B题打错调了半天,C题想出来来不及打,还好没有挂题 AC:AB Rank:96 Rating:2125+66->2191 A.Berzerk 题目大意:有一个东东在长度为n的环上(环上点编号0~ ...

  5. ●BZOJ 3126 [Usaco2013 Open]Photo

    题链: http://www.lydsy.com/JudgeOnline/problem.php?id=3126 题解: 单调队列优化DP,神奇.. (好像某次考试考过,当时我用了差分约束+SPFA优 ...

  6. NGUI制作可滚动的文本框(摘,如有侵权,联系删除)

    NGUI制作可滚动的文本框 1.首先创建一个UI Root 2.选择UI Root右键 Create 选择Scoll View创建. 3.Scroll view的大小是可以调节的,调节为你需要的适当大 ...

  7. P2P技术概要

          P2P(Peer to Peer)也就是 对等网络,即对等计算机网络,是一种在对等者(Peer)之间分配任务和工作负载的分布式应用架构[1]  ,是对等计算模型在应用层形成的一种组网或网络 ...

  8. python2.7练习小例子(二)

        2):题目:企业发放的奖金根据利润提成.利润(I)低于或等于10万元时,奖金可提10%:利润高于10万元,低于20万元时,低于10万元的部分按10%提成,高于10万元的部分,可提成7.5%:2 ...

  9. python webdriver环境搭建

    一.准备安装包 1.下载python 2.下载setuptools 3.下载pip 二.windows环境安装 1.安装python,建议选择python2.7.5版本. 2.安装setuptools ...

  10. 原生js之canvas时钟组件

    canvas一直是前端开发中不可或缺的一种用来绘制图形的标签元素,比如压缩上传的图片.比如刮刮卡.比如制作海报.图表插件等,很多人在面试的过程中也会被问到有没有接触过canvas图形绘制. 定义 ca ...