建立表关系对Power BI用户是一个习以为常的操作,和Qlik一样,这是所有基于数据模型的BI工具的共性。不过,最近事情有了一些变化,因为Tableau也加入了进来,不要小看这个新功能,对于一个数据可视化工具,这是一个从0到1的突破。这篇文章是我对Tableau最新版引入的关系功能的看法,供各位参考。
Tableau的从0到1
最新版本的Tableau 2020.2加入了定义表间关系的能力,使得Tableau数据建模能力达到了一个新高度,被称为是继详细级别表达式之后的又一重大更新,Another Game Changer. 那这个功能究竟是做什么的呢?简单的说,它可以像Power BI一样在表和表之间建立关系,然后基于关系执行表间的运算。操作也很简单,看下面这个图,使用体验我个人觉得要好于Power BI。
作为BI市场的两个主要竞争对手,Tableau是可视化领域的扛把子,Power BI强于数据建模,双方各占优势。但是,只要任意一方在对方的优势领域里拿出一个相似的产品,不需要追平对手,只要功能接近,局势很可能就会发生明显变化。所以,Tableau这个可以建立表关系的新功能是否真正威胁到了Power BI的根基 - 数据模型呢?
这里先说结论:新数据模型简化了Tableau过去需要LOD才能完成的一些复杂运算,优化了底层SQL的执行效率。不过这个结构只是看起来像模型,并不具备真正DataWarehouse的能力,功能非常有限,还不能与PowerBI相提并论。
了解Tableau的New Data Model
Power BI用户对于在表和表之间建立关系、使用关系并不陌生,我们把表和关系统称为数据模型。数据模型可以帮助我们灵活的实现各种跨表计算,而不需要提前把所有表合并到一起。我们甚至可以在计算过程中通过DAX启用和关闭特定的关系,以实现一些更为复杂的计算。在Power BI中,数据模型还有另一个名字:Semantic layer,语义层。基于模型的计算是Power BI的强项,因为Power BI从一开始就是一个面向模型的工具(Model-based tool)这种定位的优点是可以在模型层面建立通用计算,缺点是定义报表级别的计算不够灵活。
而Tableau恰好就是基于报表的工具,它在报表级别的计算非常灵活,但是一直缺少真正意义上的语义层,也就是无法在模型之上开展计算。直到最新版本中加入了关系。
在关系引入前,Tableau通过数据联接的方式将所有表合并为一张宽表,这种方式对来自数仓的数据源并不友好,增加了额外的工作量,产生不必要的数据冗余。
除了数据联接外,数据混合也可以完成类似计算,它的缺点是性能不够好,并且无法复用。某种程度上这也是报表工具需要做出牺牲的地方。
随着关系的加入,以上问题有了新的解决方案。让计算发生在语义层,可以避免合并宽表的大量预计算,性能也好于数据混合。具体会给Tableau带来哪些积极变化,官网有详细的介绍,大家也可以参考官方的这个总结。
总的来看,这些优势对于Power BI用户可能不会有明显的触动,因为早就已经具备了。但是对于Tableau的用户来说,确实是非常大的提升。
局限
新数据模型是否可以让Tableau挑战Power BI的核心优势呢,答案是还不行。我举两个例子:
对关系的使用
观察第一张图,你会发现Tableau中的关系是没有方向的,虽然也可以像Power BI中那样选择一端和多端,但这里的作用只是判断聚合运算的逻辑,即使关系列包含重复值,你也可以将其设置为一端,只不过这会导致在视图中显示重复的聚合值。但是在PowerBI中,这是不被允许的。
多事实表使用受限
两个事实表不能连接到同一个维度表,如果你有订单表和发货表两个事实表,想从时间维度同时查看两张表的变化趋势时,Power BI中我们可以用一个日期表同时和它们建立关系就可以进行分析,但目前在Tableau中无法实现。
Tableau的逻辑层与真正的数仓的语义层还是有明显的区别,Tableau中第一个拖入画布的表是根表(root),后续所有加入的表都会与它存在直接或间接的关系。这种结构建立星形模型很方便,但是无法很好的支持多事实表的关系模型。
总结
Tableau通过新数据模型首次加入了语义层,对于报表工具来说这是很了不起的一个更新,其重要性不亚于详细级别表达式。不过,受限于工具本身的定位,我并不认为在它在模型层面会有太大的提升空间,这个功能很可能会和数据联接、数据混合一起,三足鼎立互为补充,让用户在处理数据源的时候多一种选择。
而对定位于模型工具的Power BI来说,在模型层有非常多的工具和手段,基本上已经把友商远远甩在身后。在未来发布的新功能中,PowerBI把语义层又推到了一个新高度,你可以在一个文件中导入多套模型(multiple semantic models) ,同时对它们展开分析。
所以,没有完美的工具,你需要根据自己的使用场景做出选择。