关系代数的问题与尝试(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迈进了一步。

时间: 2024-08-14 02:30:43

关系代数的问题与尝试(4)层次数据与交互的相关文章

关系代数的问题与尝试(5)云数据组织

摘要: 本文来自北京润乾软件技术有限公司董事长蒋步星在清华大数据产业联合会的讲座. 最后再简单说一下云计算的数据组织问题. 云数据有这样几个特征: 第一,多样性.云计算要解决多租户的问题,显然不同用户的数据结构经常是不一样的,即使同一个用户.同一块业务,数据结构在不同地域.不同时期都会不一样.象我们这样一个小公司的财务系统,数据结构都年年在变,今年没有这种销售提成,明年有了,就要增加一些字段或表来处理. 数据的多样性其实是很本质的需求,世界就是这么复杂.多样性在关系数据库的时代也存在.只不过关系

关系代数的问题与尝试(2)关联运算及描述

下面我们来讲关系代数中的具体的问题,先谈关联运算的描述. 使用SQL对于单表进行查询并不是很难理解和实施,一般也就是选取字段.过滤.排序等,只有分组汇总稍复杂些,也不是多难懂. 但是,有意义的查询经常是多表的,比如查一下从北京到上海打了多少电话,存款超过10万元的人中本科学历及以上的有多少.这些都需要用到多表关联运算. SQL中用多表关联运算是用JOIN运算实现的,JOIN运算在关系代数中定义非常简单通用,就是两个表做笛卡尔积后再过滤. 简单的好处,就是适用面广,什么都能表达:但也有坏处,它没有

关系代数的问题与尝试(3)序运算与离散化

下面说序运算和离散化的问题. 人对有序计算是天然关心的.因为人最关心变化的东西,如果一个东西老不变,他不关心.这个东西变了,比昨天怎么样,比去年怎么样,他就会很关心,这个时候序运算就很重要了. 但是关系代数沿用了数学上的无序集合的概念,导致早期SQL没有办法直接做序运算.其实SQL的运算体系是完备的,它可以生成序号再去JOIN来实现序运算. 比如计算一只股票涨了多少钱,用早期SQL写出来是这样的: 对于一个用C++或JAVA的程序员会觉得这不可思议,这个运算怎么要写得这么麻烦,但它就是这样.先用

关系代数的并行计算

从Dremel和Impala的学习引申出了SQL查询的并行执行问题,于是借此机会深入学习一下关系数据库以及关系代数的并行计算. Speedup和Scaleup Speedup指用两倍的硬件换来一半的执行时间.Scaleup指两倍的硬件换来同等时间内执行两倍的任务.但往往事情不是那么简单,两倍的硬件也会带来其他问题:更多CPU带来的长启动时间和通信开销,以及并行计算带来的数据倾斜问题. 多处理器架构 共享内存:任意CPU都能访问任意的内存(全局共享)和磁盘.优点是简单,缺点是扩展性差,可用性低.

关系数据库_关系代数的并行计算_数据库分类

几张图看懂列式存储 从Dremel和Impala的学习引申出了SQL查询的并行执行问题,于是借此机会深入学习一下关系数据库以及关系代数的并行计算. Speedup和Scaleup Speedup指用两倍的硬件换来一半的执行时间. Scaleup指两倍的硬件换来同等时间内执行两倍的任务. 但往往事情不是那么简单,两倍的硬件也会带来其他问题: 更多CPU带来的长启动时间和通信开销, 以及并行计算带来的数据倾斜问题 多处理器架构 共享内存:任意CPU都能访问任意的内存(全局共享)和磁盘. 优点是简单,

四种典型大数据可视化交互模式及实例

大数据可视化交互设计中,有四种比较典型的交互模式,解决数据的复杂性问题.分别是动态改变视图.多视图关联.视图内容约减.焦点+上下文. 动态改变视图 动态改变视图:导航 动态改变视图:多属性排序 多视图关联 多视图是指将显示区域划分为多个视图或图层,是降低数据复杂性的一种方式.它包括采用同一编码方式编码多个数据子集的小多组图,以及采用不同的编码方式编码同一数据集的多样式图(多视图). 并列放置:便于对比,但需要更大的显示空间 图层叠加:图层数量有较大的限制 概览图和细节图采用相同的编码方式,解决数

js与mvc 数据的交互

在做考试系统中,遇到最头疼的问题,就是前台与后台的交互.对于使用easyui来说,刚接触不久,有点陌生. 查着文档,看着Demo.做起来着实有点头疼. 首先,前台使用的是MVC+Easyui,后台使用的WCF提供服务.那么前台的数据,是如何与后台进行交互的呢? 页面上的所有事件都是通过js来调用的.那么就必须是 js里面写事件,然后把前台的数据,传到Controller里面,然后利用Controller去调用后台提供的WCF服务. JS向后台提交数据方法: 利用js向后台提供数据.无非两种方法,

Flex与Servlet之间数据的交互

总结一下Flex与Servlet之间数据的交互: 代码1-Flex代码: <?xml version="1.0" encoding="utf-8"?> <mx:Application xmlns:mx="http://www.adobe.com/2006/mxml" creationComplete="sendRequest();"> <mx:Script> <![CDATA[ imp

[Aaronyang] 写给自己的WPF4.5 笔记10[层次数据需求处理,TreeView绿色文章1/4]

 我的文章一定要做到对读者负责,否则就是失败的文章  ---------   www.ayjs.net    aaronyang技术分享 AY留言: 文章根据难易,我根据游戏的规则进行了分色,希望读者能选择自己的能力去读.白色<绿色<蓝色<紫色<橙色<红色 博文摘要: 简单的TreeView静态写法,了解展开事件,选中事件 关于磁盘驱动器的图标的获得,文件夹的图标的获得,文件的图标的获得,系统自己shell32.dll的图标的获得(例如我的电脑,回收站等icon) 关于Tre