“我是Tableau手册的深度解说家,而非官方文档的搬运工。”
原创作品,欢迎分享,禁止抄袭。

在业务分析中,我们经常会遇到下面的各种问题?

  • 我想在订单分析中体现门店的分类信息怎么办?

  • 在会员的静态表分析中,我想把会员和贡献的贡献额结合起来怎么办?

  • 如何把来自多个部门的分析数据合并起来呢?

  • 部分数据需要清理,应该在清理前连接还是清理后连接?

在大数据分析过程中,我们会频繁的遇到需要把数据结合到一起的情形;在Tableau中,数据联结在一起有多种方式;而在合适的地方选择合适的方法,是确保数据准确和性能的基础。

  • Tableau数据合并的方法及选择

  • Tableau数据连接与数据混合的对比

  • Tableau数据连接的多种可能

数据混合Blend是聚合级别的数据联结,而数据连接join则是行级别的。基于行级别连接只有一个数据源,随意更改会破坏所有的视图结果;而数据混合则保持了两个数据源的独立性,可以在每个视图上灵活修改。
因此,我喜欢称 数据混合为可以灵活调整的“软联结”,而数据连接为返回静态结果的“硬联结”——前者更灵活,后者更安全。

——喜乐君

续篇:

、三种联结方式与数据并集

在具体展开之前,我们先统一一下概念,我用“数据联结”(Data Connect)代表最为广义的统称,意指把来自不同数据源的数据结合在一起。在Tableau中,根据不同的合并方式和数据处理阶段,使用了不同的用词,其一是Data Union,翻译为“数据并集”,用于相同数据解构的上下追加,其二是Data Join,翻译为“数据连接”,用于有共同连接字段的数据左右相连,其三是Data Blend,翻译为“数据混合”,用于视图层面数据聚合后的联结查询

这里的关键区别是:并集需要数据结构一致、连接会在行级别增加数据的字段数量、数据混合不会生成新的数据源只是聚合查询。

屏幕快照 2019-08-01 上午7.06.09

1、数据并集

“数据并集”最容易理解,它用于数据结构完全一致的数据的合并,比如将分别存放的12个月的订单数据csv文件合并,合并不会增加新的列(Tableau自动生成的path和sheet除外),只是将不同文件的数据追加在一起(增加了行行数)。因此,并集一般在早期的数据处理阶段就执行。比如在下图中,我们手动把各个月的订单数据拖到右侧的并集中,就把结果合并在一起。

Tableau 并集 手动并集.jpg

只要数据结果完全一致,数据并集并不会增加新的字段;不过在Tableau中,系统自动生成几个辅助字段,来帮助查看并集的数据来源。在一些情况下,我们可以使用这个辅助字段,比如在上面的数据中,各月的数据中没有包含“日期”字段,我们可以使用path字段来生成日期字段。

数据连接 从辅助字段提取日期.jpg

2、略说 数据联结join和混合blend

相比数据并集,数据连接和数据混合不太容易区分,也是我们后面的重点。

简单的说,数据连接是在行级别联结数据的方式,而数据混合是在指定的聚合级别联结数据的方式。

【Jul 20, 2019补充】换一种方式说,所谓的数据混合,并没有生成一个单独的数据源,而只是数据查询而已——根据主数据源的视图要求,从辅数据源做了对应的聚合查询。在多次客户服务和培训之后,我想这是简单易懂的理解数据混合的关键。

从这个角度去区分,更容易理解以下的特征:

  • 数据连接一般在构建视图之前就处理,而数据混合是在构建视图过程中根据需要处理;

  • 数据连接容易产生数据垃圾(冗余),因为它是行级别的运算;

  • 数据连接的结果是静态的,不能更改;而数据混合可以根据连接字段的不同组合改变连接的结果,相当于指定了在哪个聚合层面做数据连接;

  • 数据连接更慢,它是行级别的操作。

二、数据连接 Join

举例来说:假定我们有两组数据,它们有共同的标题字段。分析之前,我们想要把两个数据结合在一起。连接有四种方式:查找共同的内容(内连接)、左侧为基准追加右侧数据源的其他字段(左连接)、右侧为基准、重复项同时保留差异(外连接)。用数据库的专业术语,就是:内连接、左连接、右连接和全连接。(有数据库基础的可直接跳过本段)

屏幕快照 2019-07-20 上午10.51.03.png

表的连接是关系型数据库的核心问题。

下面,我们用几行数据来解释四种连接的类型,后面我们会在此基础上讲解Tableau连接的高级用法。

1 内连接 inner join

最常用的是内连接,也就是根据关联字段查找两侧数据的重复项。如下图,我们用两侧的“维度”字段做连接,结果就是返回三行相同的数据,抛弃了其他的相关数据。

Screen Shot 2019-04-26 at 5.40.33 PM.png

2 左连接 Left join

那如果是左连接呢?也就是以左侧为主,不仅匹配相同数据,同时保留左侧的不匹配数据,相当于在上面的基础上增加了左侧的B、C两行,需要注意不匹配的项目中,右侧数据的字段会用“空值”填充,往往用null来代替,而不是0. 示例如下:

Screen Shot 2019-04-26 at 5.00.25 PM.png

3、右连接 right join

右连接的结果也就容易理解了,相当于在内连接的基础上追加了右侧数据的不重复数据,示例如下:

Screen Shot 2019-04-26 at 4.59.57 PM

4 外连接 out join

外连接相当于既保留了重复项,也保留了不重复项,不匹配的字段用空值代替,示例如下:

Screen Shot 2019-04-26 at 5.03.49 PM

所有的数据连接都是这四种连接方式之一,没有例外。「补充Jul 20, 2019」但是有人会说,我左侧的数据是订单数据,右侧的是退货订单,我想要从左侧订单数据中删除退货订单,属于哪个类型呢? 其实是上面两个类型的计算,使用Tableau的连接功能,可以非常简单的实现以下连接。这个我们会放在后面部分单独讲解。

屏幕快照 2019-07-20 下午12.07.53.png

5、数据连接属性 data join

用上面的图片我们再来说一下“数据连接”join的几个特征,

其一,数据连接是在行级别的连接,左侧数据源的“维度”列的A行在右侧找到了相等的匹配项,就会在A行的后面追加右侧的字段“度量2”,默认会把右侧所有字段全部追加到后面;因此:

其二,行级别连接默认追加所有字段的方式,会产生大量的数据垃圾(冗余),想象一下,如果我们只想要右侧的一个字段,但是右侧数据源有30个字段,这30个字段都会被追加到同一个数据缓存中。如下图,右侧十几个字段全部被连接进来:

Tableau 数据连接 生成冗余字段.jpg

如果我们一方面想要数据连接,另一方面不想因为数据垃圾影响性能怎么办? 使用数据混合,也就是在构建完视图之后,根据需要去查询,而非底层连接数据。

6、跨数据源的数据连接(增补)

在Tableau 10版本之后,推出来了跨数据源的数据连接,其本质与此前一致,却极大的扩大了数据连接的应用范围。和默认情况下的 同一数据源的不同数据表连接相比,相当于同时把SQL查询发送到两个数据源位置。我们可以用示例图做一个简单对比,如下。

屏幕快照 2019-04-30 上午7.46.07.png

三、数据混合Blend

和数据连接相比,数据混合是在指定的聚合级别对数据进行“合并”(没有真正的合并,其实只是在视图上在一起);它的结果,依赖于我们的操作。数据混合如何能避免上面的数据垃圾呢?这就需要了解它的运行机制。

每个数据混合都有一个主数据源,和至少一个辅助数据源,后者用橙色标记。主辅关系一旦确定不能更改,想要更改必须重建。

datablending_basicblend

1、数据混合的运行方式

数据连接是在行级别的数据合并,默认会合并所有字段,生成一个数据表;之后我们在视图中使用数据连接的结果。而数据混合本质上不是数据联结,而是数据跨数据源查询,当我们指定了数据混合的连接字段,然后使用这些字段或其他字段时,Tableau把我们的拖拽转化为一次查询,从第二个工作表中查找结果,然后返回并展示到视图中。因此,数据混合只会返回我们拖拽的字段的聚合结果,这样就减少了数据垃圾。我借鉴了Tableau大神 Milligan的图,翻译说明如下:

屏幕快照 2019-04-30 上午7.28.01.png

比如说上面的“月订单数据”和“客户数据”,我们用数据混合的方式建立关联。在Tableau中,系统会自动推荐匹配的字段。如果我们希望修改或者建立更多匹配,可以从顶部菜单“数据”——“编辑关系”通过“自定义”添加或编辑即可。

Screen Shot 2019-04-26 at 8.02.46 PM.png

这里需要注意,首先在视图中引用的数据源会被认定为“主数据源”,另外的数据源即为“从数据源”。当我们从主数据源加入一个字段,然后从从数据源中把另一个字段加入视图时,Tableau背后的计算逻辑是以关联字段为匹配依据,从“从数据源”中返回相应的匹配项,显示到视图中。因此,它并不会引用其他的任何字段,如此一来,没有了数据冗余,速度也就更快。

数据混合 .jpg

2、在数据混合中更改联结的详细级别

我们说数据混合优于数据连接的一个地方在于可以在构建视图过程中指定联结的字段,联结字段决定了联结的聚合级别。我们看一下官方示例工作簿“超市”,有一个工作簿“性能”,分析了每个月不同细分的销售达成情况。

注意视图的详细级别是“类别细分”,为了确保在同一个聚合级别做数据混合,我们把 从数据源“销售目标”的三个维度字段点亮(注意后面的链条图表)。这样主数据源“每个类别下、每个细分的每个月”销售目标,就对应了从数据源中相同聚合级别的数据——在这里使用了全部字段,相当于实现了行级别的联结。

数据混合 超市字段

如果我们从上面的视图中移除“细分”字段,也就是详细级别改为了“每个类别每个月的销售额”,这时我们当然希望数据混合的聚合级别保持不变,Tableau也恰好如此聪明,结果是下面的图:

数据混合 不同聚合级别的混合.jpg

也就是说,数据混合可以根据视图需要,在不同聚合级别实现数据联结;而不像数据连接join的结果如此确定性、难以灵活更改。

因此,我喜欢称 数据混合为可以灵活调整的“软联结”,而数据连接为返回静态结果的“硬联结”。

【好奇者补充说明】

上面的数据混合是高于行级别的混合,Tableau会自动调整,即便我们再点亮“细分”字段,结果也不会有差异,因为更高聚合的销售目标其实也是更低详细级别的聚合而已。但是如果我们的视图是更低的详细级别,比如“类别细分”,而我们此时把默认的联结的三个字段关掉一个“细分”,视图就会明显的变化。结果就是:

  • 视图:销售额:类别*月*细分的详细级别;
  • 目标值:类别*月。

数据混合 不同聚合级别的混合 2.jpg

3、数据混合的特殊情况

既然数据混合是一次查询,那么就会出现找不到或者找到了无法返回的情况,比如主数据源的“A公司”在辅数据源中对应了三条不同的“子公司”,那么当我们把“子公司”拖到视图中,视图无法同时显示三条数据,因此就会返回 星号“ * ”,代表这里的属性不是唯一的。这表示单个标记中的多个维度值,因为数据混合使用聚合结果并将它们合并在视图中。

另外,如果存在多维数据源,那么多维数据只能作为主数据源。

 

四、如何选择数据联结的类型

前几天培训回来,发现大家依然难以迅速建立如何选择数据联结方式的方法意识,这里缺少一个明确的判断逻辑。这个逻辑有很多种表达方式,我坦言还没有找到最佳的判断方式,权且先用下面的这个图来展示。

1、选择数据类型的基本逻辑

屏幕快照 2019-07-17 上午8.37.10.png

(1)当且仅当多个数据的数据结构完全一致时,才使用数据并集

数据并集就是不同数据源的上下追加,它会让数据越来越长,而非越来越宽。

(2)当且仅当行级别的数据有必要性和意义时,才使用数据连接

数据连接是“硬连接”,它会延长前一个数据源的字段数量,一旦连接就不要再想断开——除非以所有视图重建为代价。

(3)如果需要数据提前整理,特别是需要提前聚合之后再联结时,使用数据混合

特别是遇到日期类别的聚合,比如只有一个日期字段,但是想要在“年”的层级上联结两个数据源的字段,就要使用数据混合。。

屏幕快照 2019-07-17 上午8.44.57.png

 

2、合适选择数据混合(补充)

数据混合是一种灵活的数据联结方式,在一下情况下推荐使用:

(1)您想要合并的数据来自跨数据库联接不支持的不同数据库。

跨数据库联接不支持多维数据集连接(例如 Oracle Essbase)或一些纯数据提取连接(例如 Google Analytics)。在这种情况下,设置您需要分析的数据的单独数据源,然后使用数据混合在一个工作表上合并数据源。

(2)数据位于不同的详细级别。

(3)您有大量数据。

数据混合将数据聚合到适当的级别,然后在视图中将其合并。在某些情况下,这种操作顺序的变化可能带来性能优势。

 

五、 数据连接与数据混合的高级区别

1、数据连接支持更复杂的判断,比如“不等于”“大于等于”,而数据混合只支持“相等”这一种。数据连接join连接方式更加多样,而数据混合更加灵活

比如会员分析中,我想查找此前在线下购买过产品的线上会员,可以可以联结两个字段:会员电话=会员电话,线下购买日期早于线上购买日期,如下:

prep联结.jpg

另外,我们刚才上面说的,一些特别的数据连接方式,就会用到这种不等于判断。在下面的这个分析需求中,我们默认使用左连接,然后联结字段设置为“表A的订单ID不等于表B的订单ID”即可。

屏幕快照 2019-07-20 下午12.07.53

2、数据连接是在行级别的联结,而数据混合是在视图级别的联结。简单的说,构建视图前用join,构建视图后用blend。

3、数据混合中经常使用辅助数据源的维度字段怎么办?创建主组,可以加入主数据源。(有待补充)

 

更多参见下篇——数据合并的Prep方法:

 

Apr 26, 2019 G152
Apr 27, 2019
Apr 30, 2019 增加cross database join
Jun 27, 2019 update
Jul 17, 2019 增加第四部分判断逻辑
Jul 20, 2019 增加数据混合部分