下图是最新的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试用浅谈的更多相关文章

  1. 浅谈Hybrid技术的设计与实现第三弹——落地篇

    前言 接上文:(阅读本文前,建议阅读前两篇文章先) 浅谈Hybrid技术的设计与实现 浅谈Hybrid技术的设计与实现第二弹 根据之前的介绍,大家对前端与Native的交互应该有一些简单的认识了,很多 ...

  2. python浅谈正则的常用方法

    python浅谈正则的常用方法覆盖范围70%以上 上一次很多朋友写文字屏蔽说到要用正则表达,其实不是我不想用(我正则用得不是很多,看过我之前爬虫的都知道,我直接用BeautifulSoup的网页标签去 ...

  3. 【转】 浅谈Radius协议

    浅谈Radius协议 2013-12-03 16:06 5791人阅读 评论(0) 收藏 举报  分类: Radius协议分析(6)  从事Radius协议开发有段时间了,小弟不怕才疏学浅,卖弄一下, ...

  4. 转:浅谈Radius协议 -来自CSDN:http://blog.csdn.net/wangpengqi/article/details/17097221

    浅谈Radius协议 2013-12-03 16:06 5791人阅读 评论(0) 收藏 举报  分类: Radius协议分析(6)  从事Radius协议开发有段时间了,小弟不怕才疏学浅,卖弄一下, ...

  5. 浅谈MVC、MVP、MVVM

    MVC M: Model            模型——数据            (对于前台而言例如:ajax.jsonp等从后台获取数据的) V:  View             视图——表现 ...

  6. 转:浅谈深度学习(Deep Learning)的基本思想和方法

    浅谈深度学习(Deep Learning)的基本思想和方法  参考:http://blog.csdn.net/xianlingmao/article/details/8478562 深度学习(Deep ...

  7. 【转】.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 ...

  8. 虚拟化构建二分图(BZOJ2080 题解+浅谈几道双栈排序思想的题)

    虚拟化构建二分图 ------BZOJ2080 题解+浅谈几道双栈排序思想的题 本题的题解在最下面↓↓↓ 不得不说,第一次接触类似于双栈排序的这种题,是在BZOJ的五月月赛上. [BZOJ4881][ ...

  9. 【分析】浅谈C#中Control的Invoke与BeginInvoke在主副线程中的执行顺序和区别(SamWang)

    [分析]浅谈C#中Control的Invoke与BeginInvoke在主副线程中的执行顺序和区别(SamWang) 今天无意中看到有关Invoke和BeginInvoke的一些资料,不太清楚它们之间 ...

随机推荐

  1. pocsuite 实现一个verify检测功能

    今天在测试中发现一个命令执行漏洞,尝试用创宇的pocsuite框架实现.说实话,这玩意儿确实没有自己写POC顺手,非得就着他的标准来,就很难受,以至于耽误了很多时间在规范上.. 影响参数后直接用||连 ...

  2. 使用.NET Framework中的对象来检索网页和处理其内容

    实现效果:(截取其部分) 实现代码: $webclient=New-Object System.Net.WebClient $content=$webclient.DownloadString(&qu ...

  3. 2017.9.2Java中的自定义类型的定义及使用&&自定义类的内存图

    今日内容介绍 1.自定义类型的定义及使用 2.自定义类的内存图 3.ArrayList集合的基本功能 4.随机点名器案例及库存案例代码优化 01引用数据类型_类 * A: 数据类型 * a: java ...

  4. 菜鸟笔记 -- Chapter 6.2.5 代码块

    6.2.5  代码块 在编程过程中我们通常会遇到如下这种形式的程序: package democlass; public class CodeBlock { { System.out.println( ...

  5. 数据库查询服务DBCacheServer

    各个业务系统,都需要查询各类数据库; 一般查询数据库都是客户端自己连接,根据现在的情况,存在以下几点问题 1.客户端连接很多,连接大小,峰值不可控 2.客户端SQL程序员自己写,参差不齐 3.SQL书 ...

  6. ios微信公众号分享回调事件

    IOS手机在分享成功后,回调事件无法正常执行,在回调方法里面加入: setTimeout(function () { //todo }, ); 例如: //分享 Share({ title: &quo ...

  7. aes 加密,解密

    Javaaes加密: package com.sh.auth.util; import java.security.InvalidKeyException; import java.security. ...

  8. python查找目录及子目录下特定文件

    写这篇博客的缘由: 面试归来翻脉脉发现一个陌生的朋友提出一个面试题,设计实现遍历目录及子目录,抓取.pyc文件. 并贴出两种实现方法: 个人感觉,这两种方法中规中矩,不像是python的风格.pyth ...

  9. HTTP基本内容

    *********************HTTP基本交互*************************** HTTP请求格式:HTTP 请求由三部分组成:请求行.请求头和请求正文请求行: 请求方 ...

  10. 二进制部署etcd集群

    kuberntes 系统使用 etcd 存储所有数据,本文档介绍部署一个三节点高可用 etcd 集群的步骤,这三个节点配置复用 ,我在这里没有做认证,如果有需要也可以做. 下载二进制文件 到 http ...