Looker 中的探索由 Looker 开发者设计,旨在利用数据字段与表之间的指定关系,以最有效的方式合并数据库表中的数据。因此,通常最好使用单个探索来检查您的数据。
但有时,Looker 开发者并未创建您需要的关系,或者他们遇到了一些技术限制。在这种情况下,您可以使用联接数据页面联接(或合并)来自不同探索(甚至来自不同模型或项目)的两个或更多查询的结果,并将查询结果显示为单个查询。您可以使用联接查询来创建数据表,以便探索和创建可视化图表,并作为概念验证来进一步开发和定义 LookML 项目和模型。
了解联接的结果
联接或合并查询时,先基于单个探索创建单个查询,然后再将其他查询与第一个查询合并。
第一个查询默认为主查询。主查询非常重要,因为当 Looker 匹配数据以创建联接结果时,它会将每个添加的查询与主查询(而不是与添加的其他查询)相匹配。无论何时添加查询,都需要在查询中包含一个可以与主查询中的某个维度相匹配的维度。
例如,请考虑以下查询。
主查询会返回以下结果:
| 商品类别 | 商品数量 |
|---|---|
| 有效 | 5 |
| 牛仔裤 | 9 |
| 正装 | 3 |
次级查询会返回以下结果:
| 商品类别 | 库存商品数量 |
|---|---|
| 有效 | 11 |
| 牛仔裤 | 16 |
| 正装 | 6 |
如果您在商品类别字段中联接这些查询,Looker 会生成以下联接结果:
| 商品类别 | 商品数量 | 库存商品数量 |
|---|---|---|
| 有效 | 5 | 11 |
| 牛仔裤 | 9 | 16 |
| 正装 | 3 | 6 |
联接结果不会执行实际的 SQL 联接(除非您使用的是数据库内合并查询)。不过,对于熟悉 SQL 联接的用户来说,联接查询会以类似于左联接的方式合并多个探索的结果。新增查询的结果会与主查询的结果合并,就像它们被左联接到主查询中一样。
您无需熟悉左联接的概念,即可了解联接结果的工作原理。在实际应用中,指定主查询非常重要,原因如下:
- 字段名称的显示方式:对于匹配的字段,联接结果中使用的是主查询的字段名称,如上例所示。
联接结果如何处理没有匹配值的查询:下一部分如果某个查询没有匹配的数据值,该怎么办?讨论了当只有部分查询在匹配维度中具有特定值时,Looker 如何处理合并数据。
如需了解有关缺失或 null 联接结果值的更多问题排查提示,请参阅为什么我的次要联接结果查询中存在 null 值?最佳实践页面。
联接结果如何处理具有多个匹配值的查询:本页面后面的如果一个查询有多个行具有相同的值,该怎么办?部分讨论了当某些查询在匹配维度中具有多个行且具有特定值(或值的组合)时,Looker 如何处理合并数据。
如果某个查询没有匹配的数据值,该怎么办?
主查询之所以重要的另一个原因在于匹配维度中 null 值的处理方式:
- 如果某行存在于主查询中,但不存在于附加查询中,则附加查询的字段会针对该行显示 NULL (
∅)。 - 如果某行存在于添加的查询中,但不存在于主查询中,则该行根本不会显示在结果中。
为了说明此行为,请参考以下示例查询。
主查询会返回以下结果:
| 商品类别 | 产品部门 | 商品数量 |
|---|---|---|
| 有效 | 儿童 | 522 |
| 有效 | 成人 | 545 |
| 连衣裙 | 成人 | 878 |
| 正装 | 成人 | 349 |
次级查询会返回以下结果:
| 商品类别 | 商品品牌名称 | 库存商品数量 |
|---|---|---|
| 有效 | 品牌 1 | 223 |
| 连衣裙 | 品牌 2 | 80 |
| 连衣裙 | 品牌 3 | 3 |
| 牛仔裤 | 品牌 3 | 8 |
| 牛仔裤 | 品牌 2 | 19 |
如果您在商品类别字段中联接这些查询,Looker 会生成以下联接结果:
| 商品类别 | 产品部门 | 商品品牌名称 | 商品数量 | 库存商品数量 |
|---|---|---|---|---|
| 有效 | 成人 | 品牌 1 | 545 | 223 |
| 有效 | 儿童 | 品牌 1 | 522 | 223 |
| 连衣裙 | 成人 | 品牌 2 | 878 | 80 |
| 连衣裙 | 成人 | 品牌 3 | 878 | 3 |
| 正装 | 成人 | ∅ | 349 | ∅ |
主查询有一行 Formalwear,因此联接结果会显示此行。添加的查询没有 Formalwear 行,因此添加的查询中的任何字段都会针对 Formalwear 显示 NULL (∅)。
添加的查询有两行 Jeans,但主查询没有 Jeans 行。因此,这些行根本不会显示在联接结果中。
在此示例中,如果您切换主查询,将添加的查询设为新的主查询,Looker 则会生成以下联接结果:
| 商品类别 | 商品品牌名称 | 产品部门 | 库存商品数量 | 商品数量 |
|---|---|---|---|---|
| 有效 | 品牌 1 | 成人 | 223 | 545 |
| 有效 | 品牌 1 | 儿童 | 223 | 522 |
| 连衣裙 | 品牌 2 | 成人 | 80 | 878 |
| 连衣裙 | 品牌 3 | 成人 | 3 | 878 |
| 牛仔裤 | 品牌 2 | ∅ | 19 | ∅ |
| 牛仔裤 | 品牌 3 | ∅ | 8 | ∅ |
Looker 不再显示 Formalwear 行,因为它们在新的主查询中不存在。不过,Looker 现在会显示 Jeans 行,并且这些行会针对仅存在于添加到主查询的查询中的维度和测量显示 NULL (∅)。
如需了解有关缺失或 null 联接结果值的更多问题排查提示,请参阅为什么我的次级联接结果查询中存在 null 值? 最佳实践页面。
如果一个查询中同一值有多行,该怎么办?
指定主查询也很重要,因为这会影响具有匹配值的多行的处理方式。如果添加的查询有两行或更多行的值与主查询中的某一行匹配,则主查询行会复制相应次数。
在以下示例中,添加的查询有两行 Dresses。在联接结果中,主查询中的连衣裙值会出现两次,分别对应添加的查询中的每个连衣裙行。
主查询会返回以下结果:
| 商品类别 | 产品部门 | 商品数量 |
|---|---|---|
| 有效 | 儿童 | 522 |
| 有效 | 成人 | 545 |
| 连衣裙 | 成人 | 878 |
| 正装 | 成人 | 349 |
次级查询会返回以下结果:
| 商品类别 | 商品品牌名称 | 库存商品数量 |
|---|---|---|
| 有效 | 品牌 1 | 223 |
| 连衣裙 | 品牌 2 | 80 |
| 连衣裙 | 品牌 3 | 3 |
| 牛仔裤 | 品牌 3 | 8 |
| 牛仔裤 | 品牌 2 | 19 |
联接结果查询(在商品类别字段上合并)会返回以下结果:
| 商品类别 | 产品部门 | 商品品牌名称 | 商品数量 | 库存商品数量 |
|---|---|---|---|---|
| 有效 | 成人 | 品牌 1 | 545 | 223 |
| 有效 | 儿童 | 品牌 1 | 522 | 223 |
| 连衣裙 | 成人 | 品牌 2 | 878 | 80 |
| 连衣裙 | 成人 | 品牌 3 | 878 | 3 |
| 正装 | 成人 | ∅ | 349 | ∅ |
在这种情况下,如果您切换主查询,则仍会有两行连衣裙,因为新指定的主查询有两行连衣裙。联接查询时,结果中的行数可能比主查询中的行数多,但绝不会少于主查询中的行数。
数据库内合并查询
默认情况下,联接查询在 Looker 内存中处理,因此每个查询最多只能联接 5,000 行。如果您的 Looker 管理员启用了数据库内合并查询 Looker Labs 功能,则在 BigQuery 数据库本身中执行同一 BigQuery 连接上的两个查询之间的联接。在数据库中执行联接可提高性能,并允许联接无限行。
此外,当您为合并结果创建每个探索查询时,Looker 界面会包含一个行数上限字段。Looker 会以不同的方式使用行数上限字段,具体取决于合并结果查询的处理方式:
- 对于在 Looker 内存中计算的联接查询,Looker 会检索每个查询的行数限制字段中指定的行数,并联接这些数据以创建联接结果。
- 对于数据库内合并查询,Looker 会忽略每个源查询的行数上限值,并联接每个源查询的完整数据集。
如果 Looker 能够为联接查询执行数据库内联接,则会显示一个横幅,指明查询正在数据库中运行,并且 Looker 会忽略每个源查询的行数限制。
然后,在数据库内合并查询的结果表中,Looker 会显示合并结果字段,而不是行数上限字段。合并结果字段会限制结果表中显示的行数,而不是要处理的行数,因为数据库内合并结果查询对可处理的行数没有限制。
联接查询
如需联接多个查询的结果,请按照以下步骤操作:
- 创建第一个源查询,称为主查询。
- 添加下一个源查询。
- (可选)为联接查询配置联接规则。
- (可选)直观呈现联接查询。
- 创建联接查询后,保存或共享联接查询。
- (可选)修改联接查询。
创建主查询
如需联接多个查询的结果,请先准备主查询,方法是从探索菜单中选择一个探索,然后从字段选择器中选择感兴趣的维度和测量。在此步骤中,请勿透视任何维度。或者,选择一个 Look 或信息中心,然后点击 Look 或信息中心板块上的从此处探索。
现在,您可以开始合并结果了。不过,您也可以通过以下可选方式进一步优化查询:
添加下一个源查询
创建好主探索查询后,请按照以下步骤添加另一个源查询:
- 在“探索”配置面板中,点击合并查询(联接数据),打开联接数据页面。
在添加联接窗口中,选择您要用于添加其他来源查询的方法:
- 根据“探索”构建新查询:Looker 会显示探索列表。选择要用作来源查询的探索,然后点击添加查询。Looker 会显示配置联接的字段页面。为新查询选择维度和测量,并添加任何过滤条件或自定义字段。请勿在来源查询中透视任何维度,而应在联接结果中透视维度。请务必至少包含一个维度,其值与主查询中的某个维度完全匹配。完成新来源查询的配置后,点击保存并继续。
- 粘贴预建查询网址:在添加预建查询网址字段中,输入要用作来源查询的查询、Look 或信息中心图块的网址,然后点击添加查询。
- 选择 Look:Looker 会显示 Look 列表。选择要用作来源查询的 Look,然后点击添加查询。
- 选择信息中心图块:Looker 会显示信息中心列表。选择一个信息中心,Looker 就会显示该信息中心内的图块列表。选择一个图块,然后点击添加查询。
配置联接规则
为了联接两个或更多查询,Looker 会在查询中查找值能匹配的维度。每个添加的查询都必须至少有一个共同维度,且该维度的值能够与主查询中的某个维度完全匹配。例如,如果您想将客户数据添加到订单探索中,并且订单探索和客户查询都具有值匹配的客户 ID 字段,则可以使用客户 ID 字段联接查询。但是,如果两个查询都有日期维度,但一个查询使用值 "2017-10-01",另一个查询使用值 "October 2017",Looker 便无法使用此维度联接查询。
选择并配置主要和附加来源查询后,Looker 会自动选择最匹配的联接字段,并在联接数据页面上的配置联接窗口中创建联接规则。主查询和每个联接规则在来源查询和联接规则下显示为单独的条目。
在来源查询和联接规则部分中,您可以通过以下方式修改联接规则:
- 更改主查询或源查询的联接字段。
- 添加新的联接字段。
- 删除联接字段。
- 将源查询设为主查询。切换主查询时,联接结果可能会发生变化。请参阅了解联接结果,了解主查询的作用。
- 点击添加联接,添加新的来源查询。
配置图表样式
如需直观呈现联接查询,请点击选择图表以选择可视化类型。或者,您也可以使用自动可视化选项,让 Gemini 选择适当的可视化图表。然后选择图表样式,为该图表类型配置图表选项。
如需查看所有可用可视化设置和受支持图表类型的完整指南,请参阅配置和修改可视化图表。
保存或共享联接查询
创建联接查询后,您可以点击保存或共享以执行以下操作:
- 保存到新的信息中心:Looker 会显示另存为新信息中心窗口。为新信息中心命名,然后选择要保存新信息中心的文件夹。
- 保存到现有信息中心:Looker 会显示添加到此文件夹中的信息中心窗口。为新信息中心图块输入标题,然后选择要将查询保存到的信息中心。
- 复制网址:Looker 会显示分享网址窗口,其中包含查询的短网址和展开后的网址。您可以分享该网址,也可以在浏览器中为其添加书签,以便日后再次运行相同的联接查询。您无法将联接结果保存为 Look。
将联接查询添加到信息中心后,您可以添加或应用信息中心过滤条件到联接查询图块、重新排列图块、修改图块或向信息中心添加新图块。您无法直接从基于联接结果的图块下载数据,但可以将信息中心下载为 PDF 文件或下载为 CSV 文件集合。
修改联接查询
创建联接查询后,您可以在联接数据页面上通过以下方式与结果互动并修改查询:
- 检查数据并对其进行排序,包括展开数据细目。 不过,如果您深入分析用于联接两个探索的维度,Looker 只会显示主要探索中的深入分析字段。
- 在配置联接窗口中,选择主查询旁边的修改查询,以打开查询的数据表,并使用字段选择器进行更改,例如添加或移除字段、添加表计算或更改源查询的过滤条件(请注意,您无法直接向联接结果添加过滤条件)。您还可以选择主查询旁边的选项,以重命名或删除主查询。
- 在配置联接窗口中,选择要在联接规则中修改的查询旁边的修改查询。对于每个额外的来源查询,您还可以选择选项,然后重命名或删除该查询(如果您想在删除查询后将其重新添加到联接结果中,可以使用浏览器中的返回按钮),或者将该来源查询设为联接查询的主查询。
- 在联接字段和图表样式窗口的联接字段标签页中,透视一个或多个联接查询字段,并添加表计算。请注意,源查询中的表计算在联接结果中显示为标准维度。
- 在联接字段和图表样式窗口的图表样式标签页中,更改联接查询可视化图表的设置。
- 使用总计切换开关,在联接查询中添加或移除总计。 Looker 会计算每个组件查询的总计,并在联接结果中使用这些总计。因此,总计值可能看起来过高,因为您看到的是在联接结果之前计算的总计值。始终显示最新数据的一种方法是使每个查询的过滤条件保持一致。
- 点击更改图表,为联接查询选择其他可视化图表。
进行任何更改后,您可以点击运行以更新,查看更新后的联接查询的结果。
在信息中心修改联接查询图块
如需修改信息中心内的联接查询图块,请按以下步骤操作:
- 将信息中心置于修改模式。
- 在图块上选择修改合并的查询。
- Looker 会直接在信息中心修改画布中打开联接数据页面。
- 对主查询、其他源查询、联接规则或可视化图表进行更改。
- 选择保存以更新联接查询设置,然后选择保存以更新信息中心上的图块。
在嵌入式 Look、信息中心和探索中合并查询
如果您拥有适当的权限,则可以在嵌入式 Look、信息中心和探索中联接查询:
- 如需将嵌入式 Look 或嵌入式信息中心图块的查询与另一个查询联接,请点击从此处探索,从 Look 或信息中心图块打开“探索”,然后按照联接查询的步骤操作。
- 在嵌入式“探索”中,点击配置面板中的合并查询(联接数据),然后按照联接查询的步骤操作。
备注
- 主查询的所有字段都会显示在联接结果中,这些字段使用主查询的名称。如果主查询和添加的查询对匹配维度使用不同的名称,则结果中仅显示主查询的维度名称。
联接查询可能存在行数限制:
- 默认情况下,联接查询的联接在 Looker 内存中处理,因此每个联接查询最多只能联接 5,000 行(如果管理员指定了更高的上限,则最多可联接 50,000 行)。 如果您要联接的查询返回的行数超过了行数上限,则联接结果中不会显示任何超出上限的行。
- 如果您的 Looker 管理员启用了数据库内合并查询 Looker Labs 功能,并且您要合并来自同一 BigQuery 连接的两个查询的结果,则这两个查询之间的联接会在 BigQuery 数据库本身中执行。数据库内合并查询可提高性能,并可联接无限行。如需了解详情,请参阅本页面上的数据库内合并查询部分。
对于在 Looker 内存中处理的联接查询,合并查询是一项查询后处理功能,如果使用不当,可能会过度消耗 Looker 实例资源,并导致 Looker 实例对所有用户的响应速度变慢。如果您无法利用数据库内合并查询,最佳实践是在 LookML 中定义函数和逻辑,LookML 会生成由数据库处理的 SQL。如需详细了解如何优化 Looker 性能,请参阅优化 Looker 性能最佳实践页面。
总结
请尽可能使用单个“探索”中的数据,因为 Looker 开发者已仔细考虑过应如何合并不同数据库表中的数据。不过,在需要时,联接查询是一种强大的技术,可让您合并来自多个探索和数据库的数据。