数据立方原理

数据立方的产生缘由

数据可视化

  数据分析中一个很重要的内容就是数据可视化,目的就是让人们能够对整体数据有一个非常直观清晰的了解。

  那么传统数据库是如何处理数据可视化的呢?我们知道数据通常是多个维度的,数据库中的表格存储多个维度的数据,每一列代表一个维度。处理这些数据可以使用数据合并(grouping/aggregation)语句,包括AVG(),COUNT(), SUM()等。使用这些基本语句可以执行一些基本的数据运算,例如计算一个月的平均气温。

  除了这些最基本的语法之外,某些系统允许用户使用预设好的语料库来设计添加自己的计算方程(aggregate function)。这些系统包括Red Brick和Illustra。

  但即便如此,SQL任然不能满足高维度数据分析的某些要求,我们需要一个可以对高维度数据做类似于SQL GROUP BY那样的操作。于是数据立方应运而生。

GROUP BY的缺陷

  GROUP BY是数据库系统中使用频率最高的一个运算。然而这个运算却存在着很多局限。如果要生成柱状图数据,则需要相对复杂的SQL语句来实现。类似的,roll-up,drill-down,cross-tab这样重要的运算也需要用冗长的语句来实现。

数据仓库

  数据仓库(data warehouse)是以数据立方的形式存数数据的。数据仓库的数据通常是高维度,而数据立方恰好是处理这类数据的最好选择。

数据立方

  那么什么是数据立方呢?我们先来通过一个简单地例子让大家有一个大概的了解:

  

  假设我们有一组汽车销量数据。根据汽车的不同颜色,品牌和销售时间段,我们可以做不同方面的数据汇总,比如说迄今为止红色汽车的销售额一共是多少?

  首先在上图的左上角位置是总销售额。根据汽车颜色,我们分成了红色,白色,蓝色,这样我们就知道在这个总销售额下,红色,白色,蓝色汽车的总销售额各是多少。如果再往下细分,我们可以知道红色的福特车总销售额是多少等等。如果再往下分,我们还可以知道销售额在不同年份的数据。

  对数据立方有一个大致认知之后,我们来做进一步的深化理解。我们换一个例子,假设我们有一堆销售数据,数据记录了不同产品在不同地域和不同时间的销售额。在接下来的讨论中,我们用这个例子作为讲解范例:

  

  这是一个立方的维度包括产品,时间,地区。立方中,存在很多小的数据方块(cuboid):

  

  例如,(product, time, location)是一个方块,(product,time)是另外一个方块。每一个方块对应了一个数据汇总的方式,比如说(product, time, location)记录了某一产品在某时间段某个地点的销售总额。一个方块实际上一个不同的GROUP BY。处在最底层的那个方块叫做基方块(base cuboid),这是维度最高的方块,依次向上,维度递减,如下图,基方块对应了整个三维立方,基方块上面一层(例如(time, location))对应了一个立方的面,再上面对应了一条线,最顶层对应了一个点(All,All,All)。

  

数据运算

  在了解了数据立方的构造之后,接下来看看我们如何在这个结构基础上做一些基本的数据分析。

Roll up (drill-up)

  Roll up用来做数据汇总:

  

  在以上这个例子中,我们将销售总额从不同城市汇总到不同国家。

Drill down (roll down)

  Drill down是Roll up的反相运算:

  

  这我们将每一季度的销售总额下分成每一个月的销售总额,这样可以展示出更多的细节。

Slice

  Slice相当于SQL的projection运算:

  

Dice

  Dice相当于SQ的SELECT运算:

  

Pivot

  

  Pivot比较简单,只是将空间旋转,换一个角度看数据。

创建数据立方

  说了这么多数据立方的用途,最后我们来看看数据立方的实现。如何建造一个数据立方呢?一个立方实际上是由一组方块组成。我们需要将所有可能的方块计算出来。首先我们来看看一个立方到底有多少个方块。

  

  在我们的例子中,产品,地点,时间这三个维度可以下分成以上多个维度,那么数据方块在这个例子中的总个数(所有可能的GROUP BY)为

T=∑i=1N(Li+1)=4×5×5=100

,这里Li是每个维度的子维度数量。

  我们如何将这100个可能的方块全部计算出来呢?数据是以最底层的方块格式展现的(在我们的例子中是(product, time, location)),我们可以从最底层开始,向上计算每一个方块,从三维(product, time, location)开始,并行计算(product, time, ),(product, , location),(*, time, location)这三个方块,得到了上一层的方块,再用相同的方法继续往上计算。我们来举一个例子。

  

  我们有一个大到无法放入内存的三维立方(维度A,B,C),我们把这个立方分成64块,每次把一块放入内存处理。我们指定ABC各有40,400,4000个不同值,每一个值占用一个单位内存。我们以用(A,B,C)方块来计算(A,B,*),(A,*,C),(*,B,C)方块为例:

  

  我们先从A开始汇总,然后汇总B,最后C,如果按照这个顺序,我们先将64个小方块中的第一个方块(图中标注来蓝色1)放入内存,得到几组(A,B,C)的值,然后我们将第2,3,4个方块放入,这时我们可以得到一组(*,B,C)的值了,所以我们可以将这组结果写入磁盘然后将其从内存中删除。注意,在计算(*,B,C)的同时我们还在计算(A,B,*),(A,*,C),因为计算过程是并行化的,我们此时还没有得到一组完整的(A,B,*)值和一组完整的(A,*,C)值,因为在读完所有1-4个方块后,在AC面上我们聚齐了所有蓝色的*点,但是一组完整的(A,*,C)值必须包含四个不同颜色的*点,也就是说,只有把方块1-16全部读取之后,我们才能得到完整的4组(A,*,C)值。之后我们接着读取剩下的数据(方块17-64)。按照这个过程,我们最后就能得出(A,B,*),(A,*,C),(*,B,C)的所有值,也就求出了(A,B,*),(A,*,C),(*,B,C)方块。

  所以在内存中,我们需要有足够的空间来同时放置1个BC块,4个AC块,16个AB块,我们来计算一下具体要多少内存单位,我们知道A有40个不同的值,如果整个立方有64 = 4 x 4 x 4块,A的所有值被分成4块,每一块有40/4 = 10个值,类似地,C有1000个,B有100个,一组BC块就占用1000 x 100个内存单位,所以,我们的内存必须大于

1×100000+4×10000+16×1000

个内存单位。

  这里就有一个问题了,如何选择汇总顺序(上一个例子我们用的是A — B — C)使得占用内存最小?其实AB,AC,BC块占用的内存是不变的,我们只需要改变上述公式每项的系数(1,4,16)使得总和最小就行了,所以上述计算方法就是最优方案。

数据立方的计算成本

  找到了所有数据方块之后,我们就可以给每个方块放入数据组(tuple)了,但是这里有一个问题,举个例子:

  

  假设维度是N,每个维度下有一个变量叫做Ai,我们要在此基础上建一个数据立方,汇总量(measure)为数组的个数(COUNT(*))。

  左图中的需要计算的数组个数为2N,右图为|D|2N?1+1。我们发现数据立方的计算时间为O(2N),如果数据的维度很大,那么我们根本无法计算出整个数据立方。

数据立方简化计算

  我们在上文提到数据立方的计算成本过大,面对这种情况,我们可以选择只计算立方的部分数据(iceberg cube),举个例子:

Select month, city, product, sum(sales)
from Sales-Info
cube by month, city, product
having sum(sales) >= 10000$

  这里只有总销售额大于10000的方块数据点才会被读取进来搭建立方,这样大大减少了计算量。

数据立方相关计算

  目前为止我们详细介绍了数据立方和数据方块,我们讨论了如何进行数据汇总来得到不同数据方块,那么汇总究竟是如何进行的呢?这里我们通过例题来让大家体会:

假设我们有一个100个维度的数据立方,已知两个基数据(base cell)(a1,a2,?,a100), (b1,b2,?,b100),求有多少条可能的汇总数据(aggregate cell)?

  对于每一个维度,我们有两种选择:具体数值或者汇总(*),除开基数据和其中一个重合的(*, *, ……,*),我们有

(2100?1+2100?1)?1

多少汇总数据至少出现两次?

  唯一满足条件的只有两个(*, *, ……,*)。

假设基方块(base cuboid)有两条维度为10的基数据(a1,a2,a3,b4,?,b9,b10), and (b1,b2,b3,b4,?,b9,b10),汇总量(measure)为出现次数(count),问一个完整的立方有多少条不同的汇总数据?

  对于(b1,b2,b3,b4,?,b9,b10),每一个维度可以选择具体数值或者汇总(*),所以我们有

210?1

  对于(a1,a2,a3,b4,?,b9,b10),如果我们选择将一个或两个维度汇总,我们可以保证汇总出来的数据不会和(b1,b2,b3,b4,?,b9,b10)的相同,所以

C110+C210

  但是当我们要汇总三个或三个以上的维度时,我们要确保a1,a2,a3不同时汇总,不然就会和(b1,b2,b3,b4,?,b9,b10)的重复,假设我们要汇总3≤k≤9个维度,那么汇总数据条数为

Ck10?1×Ck?37

  最后汇总条数总数为

210?1+C110+C210+∑k=310(Ck10?Ck?37)=1918????

如果我们不计算整个立方,只包括出现次数至少为二的数据,那么汇总数据又是多少?

  当(a1,a2,a3,b4,?,b9,b10)中a1,a2,a3被汇总,并且(b1,b2,b3,b4,?,b9,b10)中b1,b2,b3被汇总,剩下的维度就在两条基数据中就完全相同了,我们可以任意汇总而且能保证出现次数是2:

∑i=17Ci7=127???

更多资源(英文)

  数据立方论文(1)

  数据立方论文(2)

  讲义

时间: 2024-08-08 08:39:57

数据立方原理的相关文章

网站统计中的数据收集原理及实现

转载自:http://blog.sina.com.cn/s/blog_62b832910102w5mx.html Avinash Kaushik将点击流数据的获取方式分为4种:log files.web beacons.JavaScript tags和packet sniffers,其中包嗅探器(packet sniffers)比较不常见,最传统的获取方式是通过WEB日志文件(log files):而beacons和JavaScript是目前较为流行的方式,Google Analytics目前就

网站统计中的数据收集原理及实现(share)

转载自:http://blog.codinglabs.org/articles/how-web-analytics-data-collection-system-work.html 网站数据统计分析工具是网站站长和运营人员经常使用的一种工具,比较常用的有谷歌分析.百度统计和腾讯分析等等.所有这些统计分析工具的第一步都是网站访问数据的收集.目前主流的数据收集方式基本都是基于javascript的.本文将简要分析这种数据收集的原理,并一步一步实际搭建一个实际的数据收集系统. 数据收集原理分析 简单来

《统计推断(Statistical Inference)》读书笔记——第6章 数据简化原理

在外行眼里统计学家经常做的一件事就是把一大堆杂七杂八的数据放在一起,算出几个莫名其妙的数字,然后再通过这些数字推理出貌似很靠谱的结论,简直就像是炼金术士用“贤者之石”把一堆石头炼成了金矿.第六章,应该是全书最抽象的一章,就是介绍统计学中的“贤者之石”——数据简化原理.从蕴含信息的角度看,样本全体蕴含了所有的信息,但是这些信息过于分散,研究起来无从下手,必须有简化样本的手段,把分散在每一个样本的信息聚集起来.这里的聚集是一对矛盾的对立统一体,即样本简化和信息损失的对立统一,这一章便从理论的高度探讨

Android native CursorWindow数据保存原理

我们通过Uri查询数据库所得到的数据集,保存在native层的CursorWindow中.CursorWindow的实质是共享内存的抽象,以实现跨进程数据共享.共享内存所采用的实现方式是文件映射. 在ContentProvider端透过SQLiteDatabase的封装查询到的数据集保存在CursorWindow所指向的共享内存中,然后通过Binder把这片共享内存传递到ContentResolver端,即查询端.这样客户就可以通过Cursor来访问这块共享内存中的数据集了. 那么CursorW

大数据行业人士必知10大数据思维原理

大数据思维原理是什么?简单概括为10项原理,当样本数量足够大时,你会发现其实每个人都是一模一样的. 一.数据核心原理 从"流程"核心转变为"数据"核心 大数据时代,计算模式也发生了转变,从"流程"核心转变为"数据"核心.Hadoop体系的分布式计算框架已经是"数据"为核心的范式.非结构化数据及分析需求,将改变IT系统的升级方式:从简单增量到架构变化.大数据下的新思维--计算模式的转变. 例如:IBM将使用以

Android Content Provider在应用程序之间共享数据的原理分析

本文参考Android应用程序组件Content Provider在应用程序之间共享数据的原理分析http://blog.csdn.net/luoshengyang/article/details/6967204和<Android系统源代码情景分析>,作者罗升阳. 0.总图流程图如下: 总体类图: 1.MainActivity进程向AriticlesProvider进程发送IContentProvider.QUERY_TRANSACTION 如图:第一步 ~/Android/framework

转载:深入了解Struts2返回JSON数据的原理及具体应用范例

早在我刚学Struts2之初的时候,就想写一篇文章来阐述Struts2如何返回JSON数据的原理和具体应用了,但苦于一直忙于工作难以抽身, 渐渐的也淡忘了此事.直到前两天有同事在工作中遇到这个问题,来找我询问,我又细细地给他讲了一遍之后,才觉得无论如何要抽一个小时的时间来写这篇文章, 从头到尾将Struts2与JSON的关系说清楚. 其实网络中,关于这个问题的答案已是海量,我当初也是从这海量的答案中吸收精华,才将“Struts2返回JSON数据”这个问题搞清楚的.但 是这些海量的答案,有一个共同

Android应用程序组件Content Provider在应用程序之间共享数据的原理分析

文章转载至CSDN社区罗升阳的安卓之旅,原文地址:http://blog.csdn.net/luoshengyang/article/details/6967204 在Android系统中,不同的应用程序是不能直接读写对方的数据文件的,如果它们想共享数据的话,只能通过 Content Provider组件来实现.那么,Content Provider组件又是如何突破应用程序边界权限控制来实现在不同的应用程序之间共享数据的呢?在前面的文章中,我们已经简要介绍过它是通过 Binder进程间通信机制以

006-网站统计中的数据收集原理及实现

网站数据统计分析工具是网站站长和运营人员经常使用的一种工具,比较常用的有谷歌分析.百度统计和腾讯分析等等.所有这些统计分析工具的第一步都是网站访问数据的收集.目前主流的数据收集方式基本都是基于javascript的.本文将简要分析这种数据收集的原理,并一步一步实际搭建一个实际的数据收集系统. 数据收集原理分析 简单来说,网站统计分析工具需要收集到用户浏览目标网站的行为(如打开某网页.点击某按钮.将商品加入购物车等)及行为附加数据(如某下单行为产生的订单金额等).早期的网站统计往往只收集一种用户行