码迷,mamicode.com
首页 > 其他好文 > 详细

数据立方原理

时间:2015-05-08 11:01:21      阅读:1528      评论:0      收藏:0      [点我收藏+]

标签:数据分析

数据立方的产生缘由

数据可视化

  数据分析中一个很重要的内容就是数据可视化,目的就是让人们能够对整体数据有一个非常直观清晰的了解。
  那么传统数据库是如何处理数据可视化的呢?我们知道数据通常是多个维度的,数据库中的表格存储多个维度的数据,每一列代表一个维度。处理这些数据可以使用数据合并(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)
  讲义

数据立方原理

标签:数据分析

原文地址:http://blog.csdn.net/quantum_bit/article/details/45575551

(0)
(0)
   
举报
评论 一句话评论(0
登录后才能评论!
© 2014 mamicode.com 版权所有  联系我们:gaon5@hotmail.com
迷上了代码!