zoukankan      html  css  js  c++  java
  • 关系代数的问题与尝试(4)层次数据与交互

    摘要: 本文来自北京润乾软件技术有限公司董事长蒋步星在清华大数据产业联合会的讲座。

    说到交互运算,我们先复习一下OLAP这个概念。这个词字面的意思是在线分析,但在线分析实际上是在做什么事呢?

    • 用户对发生的现象做出猜测
    • 基于历史数据计算以验证或证伪猜测
    • 根据计算结果修正猜测,重复此过程直到得出有益结论

    业务用户看到了一些现象,他会猜是什么原因,猜完了以后开始拿着历史数据去看,看我猜的对不对。销售增长,可能是某个销售特别强,我要用数据去验证,销售量降低了,可能哪发灾害了,我要拿数据验证。猜对了,可能得到一个有益的结论,猜错了,我就再换一个猜测。OLAP从字面上看应当是这样的过程。

    但是现在OLAP这个词已经被严重狭义化了。一说到OLAP就指转来转去的那个CUBE,旋转、切片这些。严格地说,这个操作谈不上分析,它就没有过程,它只能算是分析结果的灵活呈现。

    而分析的过程,我要看上一步的结果才知道下一步的动作,你不可能事先设计一个端到端的路径。你让业务人员自己做,他不会自己建模,需要的运算自己不会做,他就只能找技术人员,很多用户机构大一点的时候,象移动、银行,他找技术人员帮忙的周期是以星期为单位的,这就没法玩了,等算出来这个结论时市场已经不需要了。除非你能找到既懂业务、又懂技术的牛人,但是这种人很少、也很贵。我们最好还是让业务人员能自己做很多运算。

    从这个意义上讲,Excel才是最好的OLAP工具,比Cognos,BO这些都好用得多。Excel像计算器一样的操作,我做一步,得到结果再看下一步怎么做,这才是真正的OLAP工具,Excel的缺点无非就是能支撑的数据量少一点,目前版本的极限是100万行,但灵活分析时用户经常也没那么大数据量。

    传统要建模的OLAP体系象笨重的火车模式,跑得快拉得多,但太死板。而用户更需要灵活的汽车模式,我不需要拉那么多跑那么快,我需要想去哪就去哪。

    我们来仔细看Excel,我不管它的格式能力,是不是能做一个好看的报表出来,我只关心它对于数据的运算能力。

    Excel的运算模型可以理解成关系代数的变种,它有天然的有序性和离散性,关联性弱一些,你要把两个表JOIN起来,要用Lookup函数去写,很麻烦。不过这不是今天的讨论重点,就不展开了。

    Excel的基本模型是单层的表,这个模型对分组的运算不封闭。大家用过Excle都有这个体会,你让它做一下分组,它就会变成另外一个东西了,你不能再自由地对分组后各个层次执行单层表的动作。

    比如我想对这样的分层组表算一个占比,公式会很难填。

    Excel的$符号只能管一层,你用D36除以D4,公式拖到下一个格子就不对了,换到下一组就更没戏了,只能一个个手工硬写,这没法接受了。其它动作,比如针对分组层的再排序再过滤都难办。

    Excel背后的代数体系对分组运算没有封闭性。我们需要设计一个对分组运算封闭的代数,这样就可以支持多层表格,分组的结果仍然是这种数据类型,这样就可以连续地操作了。

    这是我们基于这种思路开发的一个桌面工具。

    这个产品在外貌上很象Excel,不同的是它的模型就支持多层表格,从表的左边可以看到每行的有层次信息,这样它可以自动处理分组的层次,各个层次等同处理。

    我要想算占比,填入一个格子的公式,其他的同地位的格子都会正确复制,比如这里面要算D35除以D2,这个公式复制到下一组就会自动变成D413除以D325,它会把事情搞对。

    我们将这个表格代数和数的运算做一个类比。

    我们在整数范围能可以自由地做加减乘,结果还是整数,但是不能做除法,一除就可能出去了,不再是整数了,整数对除法不封闭,除法在整数集合内是不可逆的。

    如果我们把数据的范围扩大到有理数,它对除法运算就封闭了,我就可以随意连续运算了。但我要重新定义针对有理数的加减乘除运算规则,这些运算和整数不一样了,比整数的情况要复杂。

    类似地,在Excel这种单层模型中,我们可以自由地做过滤、排序、加计算列等运算,但是一做分组就出了范围,不能继续做下去了,它对分组运算不封闭。

    凑巧的是,分组运算在关系代数中恰好就被称为除法。严格来讲关系代数对除法也是封闭的,但它只保留了聚合部分,相当于在整数下定义的除法只保留商的整数部分,这样的运算是不可逆的,你做一下就回不来了,但我们在交互运算中需要可逆的分组。

    我们可以设计出对分组运算封闭且可逆的多层表格模型,即分组之后的表格仍然属于这种数据类型,这样各种运算就可以连续执行,复杂一些交互运算也就可行了。

    同样地,需要重新定义在多层表格下原来那些单层表格的运算的规则,如排序、过滤、填计算列等。

    实际应用中还需要更复杂的多个多层表格连接合并等运算,这些内容太多,就不细说了。

    我们来看两个例子,在多层表格模型下如何完成运算。

    原始数据:

    问题和计算思路:

    这个问题需要分组后实现组内排序和计算列,然后再对分组汇总层次做排序。

    按股票代码分组后计算每支股票连涨的情况。

    计算出每组最长上涨天数后再在分组层次排序。

    第二个问题,原始数据:

    问题和思路:

    这里的麻烦在于,在第5步需要打掉分组再变成一个单层表格,即要求运算体系对分组是可逆的。Excel对分组运算不可逆,这个过程就操作不下去。

    计算出每科目前十名之后。

    打掉科目分组,再按学生重新分组,即可得到结果。

    有这样一个多层表格模型,就可以让交互的数据运算更方便地做下去。这就向真正的OLAP迈进了一步。

  • 相关阅读:
    进程间通信 之 管道
    单调递增连续最长子序列
    使用EasyUI实现加入和删除功能
    android file.createnewfile ioexception
    60个可爱的云图案设计,激发你的灵感
    关于Platinum库的MediaRender具体C++代码实现探讨
    《程序员的第一年》---------- 学会抛出异常 你的程序人生才幸福
    LA 3027 Corporative Network 并查集记录点到根的距离
    Struts2 学习第一步准备工作
    Android编程心得-图片自适应心得
  • 原文地址:https://www.cnblogs.com/raqsoft/p/4599105.html
Copyright © 2011-2022 走看看