BI领军者之一Tableau试用浅谈
下图是最新的Gartner BI Magic Quadrant,其中领军者之一的Tableau表现的异常突出,执行力象限上直接甩开其它产品一条街,前瞻性象限上略微超越了MSBI,怀着无比的好奇心,特意去Tableau官网下载了Desktop试用版体验一把,从种种细节中能够感受到浓浓的情怀,产品的确极具人性化,甚至官网的教学视频都是略带播音腔的中文语音,但为了客观分析这款产品的用户体验,我没有跟着视频去系统学习Tableau,只是浅尝辄止的拿自己项目中经常要用到的分析案例做些试验,毕竟不是Tableau开发专家,所以有说的不对的地方还请行家指正。

打开Tableau Desktop客户端,首先需要连接到数据源,支持的数据源非常全面,这里选择SQL Server做个ROLAP玩玩,看到
,这不就是工匠情怀的体现嘛 :)


我连接的数据源是本地的AW数据库,需要指定几个待分析的表,我拖过去的是DimProduct, DimCustomer, FactInternetSales三张表,因为数据源有完善的主外键关系,所以这里也被正确的识别出表关系,另外,为Tableau随处可见的模糊查询输入框点个赞

看一下工作薄左侧数据源区域,Tableau并不是按物理表来区分维度和事实,而是默认根据表里的字段类型来做区分,用于聚合汇总的数字类型都被认为是事实度量值,其它类型如文本,日期以及主外键关键字都被认为是维度,也有一些字段本身既可做度量亦可作维度,例如UnitPrice单价,这时候是可以把UnitPrice从度量区域拖放到维度区域的。吐槽下数据源树状菜单没有找到"折叠全部"的功能,要定位到具体的字段比较麻烦,只能用查找字段的模糊输入框,还得敲键盘(还能更懒点吗?)。

工作薄中间的内容区域就很像数据透视表了,行上我拖放一个ProductKey, 列上我拖放一个Gender

用Profiler捕捉到执行的查询脚本如下,就是个简单的Group By

这时候在Tableau上做个一键行转列
,或者把ProductKey和Gender维度都放在行区域上,观察到Tabular并没有去数据源刷新数据,而是客户端处理完成,也就是说Tableau客户端缓存了结果集,而Excel客户端是不会对结果集进行缓存的,所以Excel做类似的交互操作都必须得去数据源刷新数据,除非手动指定延迟布局更新。

Tableau这种做法有利有弊,利在于节省了重复加载数据的开销,而弊端在于如果数据源数据发生了变化,是无法通知Tableau客户端进行缓存过期,我做了个试验,执行下面脚本更新下数据源,然后再Tableau上进行上述的交互操作,发现Tableau客户端呈现的数据未做相应变更,Profiler也没有捕捉到任何查询命令,直到我在行区域再追加了一个维度,才得到正确的数据,Profilter也证实了数据刷新。那么Tableau至少应该有个手动触发刷新的功能吧,没找到这个功能。。。难道说只能部署到Tableau Server以后才能在页面上触发刷新?
update FactInternetSales set SalesAmount=SalesAmount+1

切换图表类型,这个在Tableau和Excel上都不会去数据源刷新,excel的图表的确不如tableau多样、美观,但tableau貌似是直接把透视表变成了透视图,而不像excel能够同时显示透视图表,并且图表还能互相联动


对ProductKey添加筛选器,还是得肉眼检索,或逐个录入,excel原生功能也是只能如此,而通常BU会希望能一把贴进去一堆sku key(以换行符或逗号间隔),excel可以定制功能来完善这个用户体验,详见XPivot用户手册里的Filter功能http://www.cnblogs.com/xpivot/p/4317706.html,Tabular似乎不具备这样的扩展性

但还是发现一处亮点,按公式指定条件来定义一些复杂逻辑,我假定一个需求是:汇总购买过sku 214或者购买过sku217的会员销售情况, 注意筛选器务必选择CustomerKey维度

生成的脚本有点复杂,这是ROLAP难以避免的问题,工具组织出来的SQL就不要指望性能多优越了,甚至这种脚本表达方式都没多少优化空间,除非in memory rolap,否则应对稍大点的数据量就会非常吃力。建议阅读下这个脚本,以充分理解rolap的工作原理

注意这里的"汇总购买过sku 214或者购买过sku217的会员销售情况"这个需求,不等同于sku 214和217的销售情况,主语不同(前者是分析人,后者是分析sku),分析的结果也完全不同,下图是后者的筛选器设置以及查询结果,注意筛选器换成了ProductKey

我们再来定义个需求,汇总购买过sku 214并且购买过sku217的会员销售情况,脚本和截图如下,筛选器用的还是CustomerKey,可以看到数据查询结果和前两个需求不一样了
max(iif([ProductKey]=214,1,0))+max(iif([ProductKey]=217,1,0))=2


上面的几个示例强调的是筛选器的选择需要格外注意,稍不留神就会用错,例如同样的需求,如果在Gender这个筛选器里设置公式,会发现也能顺利执行,但数据完全不对

追溯到脚本才发现原来是使用了Gender作为子查询关联字段了,BU当然没有这个能力去查看核对脚本,如果不注意是非常容易犯错误的

我又尝试用Tableau访问SSAS MOLAP数据源,Tableau对多维数据库的支持程度不足以实现以上几个典型的需求分析,可能还是受限于MDX的表达方式,工具难以把可视化设置简单无误的翻译成MDX脚本逻辑,显然这个难度是远远大于翻译成SQL的(PS: 对SSAS ROLAP的支持程度理论上来说应该会好过MOLAP吧,这个没做测试)。
由上可见,Tableau的可视化功能足够强大,至少上面这几个需求案例在excel里本身是无法实现的,我在excel BI解决方案里也是通过扩展插件功能来实现类似功能,但不像Tableau这种需要编码的条件组织方式,因为这种编码方式不但门槛略高,而且很容易用错,不适合给BU使用。另外,一些用户体验细节不如excel,找一个功能相对比较费劲,excel通常会把同样的功能做成各种快捷入口,以满足不同操作习惯的用户,不过话说回来,如果excel后续版本也能支持Tableau这种按公式定义筛选器的功能,还是很让人欢欣鼓舞的,至少IT角色的BI工作人员会非常喜欢。
这次试用主要是想体验下筛选器的灵活性,的确有值得称赞的设计,以后有机会的话再体验下传说中强大的计算引擎是怎么个工作原理,会不会是类似PowerPivot的Vertipaq引擎呢?始终认为这类东西就好比傻瓜相机和单反的区别,特定场合的确能够发挥优势,但涉及到针对性的调优就很无力,不如RDBMS的调优空间大,数据从RDBMS到MOLAP引擎就已经丧失了很多调优能力,再放到其它引擎能不能有足够的渠道用于灵活解决性能问题呢?BI产品在做宣传时,总能听到夸大其辞的宣称能够做到真正的BU-Driven秒出报表,故意忽略几个前提条件,其一就是得有一个干净的数据源,事实上绝大多数的业务生产库都不具备这样的前提条件,如果BU真的去业务生产库上做即时查询,别说秒出了,能够做到查询逻辑毫无破绽都是非常困难的事情。至于性能,是否都能做到秒出,取决于硬件和数据源调优,in-memory rolap性能足以媲美molap,如果公司硬通货缺乏的时候也能补充些软实力,可以先把rdbms的调优做好,再结合molap,使两者各擅所长的处理业务问题
BI领军者之一Tableau试用浅谈的更多相关文章
- 浅谈Hybrid技术的设计与实现第三弹——落地篇
前言 接上文:(阅读本文前,建议阅读前两篇文章先) 浅谈Hybrid技术的设计与实现 浅谈Hybrid技术的设计与实现第二弹 根据之前的介绍,大家对前端与Native的交互应该有一些简单的认识了,很多 ...
- python浅谈正则的常用方法
python浅谈正则的常用方法覆盖范围70%以上 上一次很多朋友写文字屏蔽说到要用正则表达,其实不是我不想用(我正则用得不是很多,看过我之前爬虫的都知道,我直接用BeautifulSoup的网页标签去 ...
- 【转】 浅谈Radius协议
浅谈Radius协议 2013-12-03 16:06 5791人阅读 评论(0) 收藏 举报 分类: Radius协议分析(6) 从事Radius协议开发有段时间了,小弟不怕才疏学浅,卖弄一下, ...
- 转:浅谈Radius协议 -来自CSDN:http://blog.csdn.net/wangpengqi/article/details/17097221
浅谈Radius协议 2013-12-03 16:06 5791人阅读 评论(0) 收藏 举报 分类: Radius协议分析(6) 从事Radius协议开发有段时间了,小弟不怕才疏学浅,卖弄一下, ...
- 浅谈MVC、MVP、MVVM
MVC M: Model 模型——数据 (对于前台而言例如:ajax.jsonp等从后台获取数据的) V: View 视图——表现 ...
- 转:浅谈深度学习(Deep Learning)的基本思想和方法
浅谈深度学习(Deep Learning)的基本思想和方法 参考:http://blog.csdn.net/xianlingmao/article/details/8478562 深度学习(Deep ...
- 【转】.NET(C#):浅谈程序集清单资源和RESX资源 关于单元测试的思考--Asp.Net Core单元测试最佳实践 封装自己的dapper lambda扩展-设计篇 编写自己的dapper lambda扩展-使用篇 正确理解CAP定理 Quartz.NET的使用(附源码) 整理自己的.net工具库 GC的前世与今生 Visual Studio Package 插件开发之自动生
[转].NET(C#):浅谈程序集清单资源和RESX资源 目录 程序集清单资源 RESX资源文件 使用ResourceReader和ResourceSet解析二进制资源文件 使用ResourceM ...
- 虚拟化构建二分图(BZOJ2080 题解+浅谈几道双栈排序思想的题)
虚拟化构建二分图 ------BZOJ2080 题解+浅谈几道双栈排序思想的题 本题的题解在最下面↓↓↓ 不得不说,第一次接触类似于双栈排序的这种题,是在BZOJ的五月月赛上. [BZOJ4881][ ...
- 【分析】浅谈C#中Control的Invoke与BeginInvoke在主副线程中的执行顺序和区别(SamWang)
[分析]浅谈C#中Control的Invoke与BeginInvoke在主副线程中的执行顺序和区别(SamWang) 今天无意中看到有关Invoke和BeginInvoke的一些资料,不太清楚它们之间 ...
随机推荐
- html嵌套关系
哪些元素可以出现在什么地方,哪一个元素可以被包涵在另一个元素里面,这个都是有规则的 1.块级元素可以包涵行内元素 2.块级元素不一定包涵块级元素 p包涵div是不合法的,在浏览器里面会自动在p里面 ...
- nginx安装和基础代理配置
mac上执行 npm install nginx 安装好后运行nginx sudo nginx 一般mac下nginx会安装在 /usr/local/etc/nginx 下 里面的nginx.conf ...
- Android学习笔记_52_全面了解Android开发规范:性能及UI优化
一.Android编码规范 1.java代码中不出现中文,最多注释中可以出现中文 2.局部变量命名.静态成员变量命名 只能包含字母,单词首字母出第一个外,都为大写,其他字母都为小写 3.常量命名 只能 ...
- javascript操作Date对象
Date 对象用于处理日期和时间. 创建 Date 对象的语法: var myDate=new Date() Date 对象会自动把当前日期和时间保存为其初始值. 参数形式有以下5种: new Dat ...
- spring(二)-反射、动态代理
主要是对上一篇文章中涉及到的点做补充,欢迎指正! 1. java反射知识-Spring IOC 依赖注入 Java反射机制主要提供了以下功能: 在运行时判断任意一个对象所属的类:在运行时构造任意一个 ...
- 菜鸟崛起 DB Chapter 5 MySQL 5.6数据库表的基本操作
5 数据库表的基本操作 在数据库中,数据表是数据库中最重要.最基本的操作对象,是数据存储的基本单位.数据表被定义为列的集合,数据在表中是按照行和列的格式来存储的.每一行代表一条唯一的记录,每一列代 ...
- .net mvc里AutoMapper更为便捷的使用方法
前言:AutoMapper的下载安装我就不多说了,网上百度一大堆.今天我就说说它的更为简单的使用,什么叫更为简单呢?按照一般的使用方法,我们首先建DTO,然后建每个对应的Profile,然后还要把每个 ...
- js解决异步的方法汇总
参考:https://www.cnblogs.com/zuobaiquan01/p/8477322.html 一.callback回调函数 回调是一个函数被作为一个参数传递到另一个函数里,在那个函数执 ...
- c c++面试c工程开发之宏定义和条件编译
多数c语言的初学者对c工程开发过程各个阶段的作用理解不到位,而这方面的的知识又是实际开发过程中经常用到的技能点,所以就成为面试考察中一个重要的考察方面.例如:头文件的作用.头文件的内容:链接的作用和意 ...
- 字符串拼接在Oracle和mysql中的用法
oracle拼接字符串 1.使用 '||' 或者 concat(参数1,参数2) select 'aa' || 'bb' || 'cc' from dual; 结果:aabbcc select co ...