作者·2010-11-20 18:41
·

数据仓库中多维分析的数据展现

字数 5760阅读 2051评论 0赞 0

1 引 言

    随着信息化时代的到来,企业纷纷建立起了自己的数据库应用系统,由计算机管理代替手工操作,以此来收集、存贮、管理业务操作数据,改善办公环境,提高操作人员的工作效率。这类系统主要是传统的数据库应用系统,是面向业务操作设计的。但在面对越来越激烈的市场竞争时,企业必须把业务经营同市场需求联系起来,在此基础上作出科学、正确的决策,以求生存和发展。越来越多的企业认识到,只有靠充分利用、发掘其现有数据,才能实现更大的效益。面向业务操作的系统越来越难以满足这种需求,因此面向分析操作的数据仓库系统应运而生,在此基础上为了提高面向分析的操作性能发展起了在线联机分析处理(OLAP)技术,它目标是提供给用户从多种角度快速、稳定、交互地存取数据,以便深入观察数据,为决策提供支持。OLAP以多维的方式来组织和显示数据,它的一个重要特点是多维数据分析,多维分析是指对以多维形式组织起来的数据采取切片、切块、旋转、上卷、下钻等各种分析动作,以求剖析数据,使最终用户能从多个角度、多侧面地观察数据库中的数据,从而深入地了解包含在数据中的信息、内涵。

    该文提出了一种多维数据的二维表格形式展现的设计,并给出了实现的算法,通过此工具可以支持多维分析的各种分析动作,将数据直观地展现在最终用户面前。

2 数据仓库与联机分析处理技术

    2.1 数据仓库

    著名的数据仓库专家W.H.Inmon在其著作《Building the Data Warehouse》一书中给予如下描述:数据仓库(Data Warehouse)是一个面向主题的(Subject Oriented)、集成的(Integrate)、相对稳定的(Non-Volatie)、反映历史变化(Time Variant)的数据集合,用于支持管理决策。整个数据仓库系统是一个包含数据源,数据的存储与管理,OLAP服务器,前端工具四个层次的体系结构。

    2.2 联机分析处理(OLAP)

    关系数据库之父E.F.Codd提出了多维数据库和多维分析的概念,即OLAP。维就是人们观察数据的角度,维存在细节程度不同的多个描述方面,维的多个描述方面称为维的层次。例如,时间维有日、月、季、年等层次来描述。多维数据一般都以数据立方体的结构存放。它用三维或更多的维数来描述一个对象,每个维彼此垂直。数据的测量值发生在维的交叉点上,数据空间的各个部分都有相同的维属性。

    2.3 多维数据分析

    多维数据分析是OLAP的一个重要属性,是指对以多维形式组织起来的数据采取切片、切块、旋转、上卷、下钻等各种分析动作,以求剖析数据,使最终用户能从多个角度、多侧面地观察数据库中的数据。

    (1)切片(Slice)与切块(Dice):切片是指在多维数组的某一维上选定一维成员的动作称为切片,切块在多维数组的某一维上选定某一区间的维成员的动作称为切块,即限制多维数组的某一维的取值区间。显然,当这一区间只取一个维成员时,即得到一个切片。

    (2)旋转:是改变一个报告或页面显示的维方向。例如,交换行和列,或是把行维移到列维中去,或是把页面显示中的一个维和页面外的维进行交换。

    (3)上卷(Roll Up)与下钻(Drill Down):上卷是在某一维上将低层次的细节数据概括到高层次的汇总数据,或者减少维数;而下钻则相反,它从汇总数据深入到细节数据进行观察,或增加新维。这两者都是改变维的层次和变换分析的粒度的操作。

3 二维形式表格工具的设计思想

    数据仓库是按主题组织数据的,每个主题可以看作是一个数据立方体,一般每个数据立方体都有好几个维,每个维内又有一些层次。复杂的数据立方体在展现上缺乏直观性,尤其当维度超出三维后,数据的表示就比较困难,因此这里采用一种二维表格的形式来表示整个数据立方体,并在此之上进行多维分析操作。数据立方体中的维都被划分到行维或列维两种维度中去,在二维表的固定行和固定列中用树型结构体现维的层次结构和层次关系,在行维和列维交织成的二维表中显示相应的度量数据,实现以二维表格反映多维特征,提供数据立方体的可视化表示。

    该设计的关键在于要在二维表中的固定行和固定列中用树型结构体现维的层次结构和层次关系。实现的方法是在固定行和固定列的每个单元格对象中加入能反映层次关系的属性,并在单元格的一端留出适当的空白,在空白中用加减号显示有没有下一级层次和下一级层次有没有展开,并画出反映层次的树枝。在单元格中添加方法,使程序能响应用户鼠标的点击,完成下一级层次单元格的收放,这样的单元格称为树型单元格。在此类单元格支持的基础上,将固定行和固定列中的单元格统一管理,形成树型固定行和树型固定列对象,提供获取单元格类型、插入或删除子树、设置扩展一层单元格、设置收起下面所有层单元格等方法。通过树型单元格对象与树型固定行和固定列对象的配合实现用户的上卷和下钻操作。

    由于用户的切片、切块和旋转操作涉及大量数据的检索和计算,因此客户端将用户的选择变成相应的查询请求提交给后台的OLAP服务器进行,然后通过记录集或多维数组的形式接收服务器返回的结果,然后再显示到二维表格中。客户端向后台的OLAP服务器发出的查询请求中包括用户选择了哪些维中的哪些层次,选择了什么值,以什么样的顺序进行分组。本质上就是一个具有如下形式的多维查询:

    Select 某变量 from 某数据立方
    Where 切片层次 1=Value1 and … 切片层次 n=ValueN
    Group By 层次 1,…,层次n

4 二维形式表格工具的实现

    树型列单元格和固定列对象配合在列的方向上实现树型结构。

    树型列单元格的定义为:

    Object TreeFixedColumnCell{
    Int iRow,iCol;//单元格所在的行和列的编号
    Int iHeight,iWidth;//单元格的高度和宽度
    Int iLevel;//单元格所在的层次在树中的层号,层号从1开始
    Bool IsVisible;//是否可见
    String strText;//单元格的内容
    DrawTreeGragph()//设置单元格左边的空白,并在空白中画出表示下一层状态的+/-号和反映层数的树枝
    }

    树型固定列的对象的定义为:

    Object TreeFixedColumn{
    Int iRowCount;//被其管理的树型列单元格的个数
    TreeCellHasPlusMinus(iRow);//判断指定行是否有下一级的层次
    InsertTreeBranch(iRow,TreeStru);//在指定行下插入一个TreeStru结构的子树
    TreeExpandOrCollapse(iRow);//判断下一步是扩展还是收起下面的层次
    TreeExpandOneLevel(iRow);//在指定行下展开下一层的单元格
    TreeCollapseAllSubLevel(iRow);//将指定行下所有层次的单元格收起
    TreeDisplayLines(n);//设置处是显示时展开到第& 层
    TreeRefreshRows();//按照树型单元格的可见属性调整被其管理的树型列单元格的高度后重画整个表格
    }

    树型行单元格和固定行对象配合在行的方向上实现树型结构,它们的定义与列上的基本一致,只不过是将行和列的操作对换了一下。当重画整个表格时,系统自动根据每个单元格的长和宽重新在客户端的屏幕上绘制出来。

    可以看到,这种实现方法中上卷操作实际上并不删除行或列,而是使它们的高度或宽度设为0,使用户看不到它们,当用户再次作下钻操作时可再将它们显示出来,而不用再次发起查询请求。这样就节省了系统的各种开销,如网络带宽、服务器和客户端CPU利用率等。此方法并不保存一个树型的结构,而是通过对相邻单元格的层号和可见属性的计算,设置相应的可见属性,再通过单元格自身的绘制方法在用户面前展示出树型的结构。这种方法具有复杂度低、运算量小等优点。

5 数据的填充

    5.1 填充算法

    由以上结构的表格可知,表格里将显示用户所选维的所有不同层次的不同粒度的数据。因此服务器端将返回给客户端包含各种粒度的聚集数据的一组记录集或一组多维数组,这一组记录集根据所有层次在固定行和固定列中的分布情况进行编号,聚集程度越高编号越小。如固定列的维的层次分别是a,b,固定行的维的层次分别为d,e,f,M代表变量,则记录集的编号顺序如下:

    记录集[0]的字段顺序为a,d,M
    记录集[1]的字段顺序为a,d,e,M
    记录集[2]的字段顺序为a,d,e,f,M
    记录集[3]的字段顺序为a,b,d,M
    记录集[4]的字段顺序为a,b,d,e,M
    记录集[5]的字段顺序为a,b,d,e,f,M

    在此基础上,填充算法如下:

    根据所选维的层次关系从记录集中读取数据在表格的第一行上用树型行单元格和树型固定行对象构造树型结构,在第一列上用树型列单元格和树型固定列对象构造树型结构:

    FOR 每一行 DO
    FOR 行中的每列 DO
    获取所在行的树型列单元格的层号i
    获取所在列的树型行单元格的层号j
    从编号为[(i-1)*固定行对象的层次总数+j-1]的记录集中读取一条记录
    IF 该条记录的维的层次值与该单元格所在的行和列上树型结构的值一致
    THEN
    将记录中的变量值填入单元格中,该记录集的指针向下移一条
    ELSE
    在单元格中填入默认值
    END IF
    END FOR
        END FOR

    5.2 数据的动态填充

    上面介绍的填充算法要求将用户选定的所有维的所有层次的数据一次性的填充进表格中,这需要后台的OLAP服务器返回各种程度聚集操作的结果,需要进行大量的查询和计算。当数据量很大时,在性能上就会变得很差,很难保证能在较短时间内返回的查询结果。而与此同时,最终用户在通过二维表格观察数据时,很少需要从最开始就看到所有层次的数据,而是先看聚集程度较高的层次,然后根据自己关心的领域和程度,有选择地进行下钻操作,直到最后也不一定将所有层次的数据都看到。这就允许在返回查询结果时,不返回全部层次的结果,而只是返回一部分聚集程度较高的结果,只把这部分数据填入表格,而展现给用户的层次也最多只到有数据填充的层次。当用户进行进一步下钻操作时,将用户所作的选择提交给OLAP服务器进行查询, 返回结果后再填充进相应的单元格中。由于下钻时只扩展一层,因此查询量很小,所花费的时间在可承受范围之内,当系统性能好时,用户基本感觉不到。这种填充方式称为动态填充。

6 结束语

    文章提出了一种多维数据用二维表格形式展现的方法,实现以二维表格反映多维特征,提供数据立方体的可视化表示。并考虑大数据量时,查询性能可能产生的问题,采用动态填充技术,在不影响用户观察数据的情况下,大大提高了数据查询速度。目前已代码实现了此方法,展现结果如图4所示,并在中科院计算技术研究所智能信息处理重点实验室开发的多策略通用数据采掘工具MSMiner中获得应用,取得了较好的效果。

如果觉得我的文章对您有用,请点赞。您的支持将鼓励我继续创作!

0

添加新评论0 条评论

Ctrl+Enter 发表

作者其他文章

相关问题

相关资料

X社区推广