跳转到内容

Table Union All 步骤

用于将列结构相同的多个数据表合并为一个数据表。例如,时间序列数据就非常适合此转换。结果包含被合并各表中的所有记录。

表 A东部西部东部表 B北部南部东部Union All — 6 行东部西部东部北部南部东部
Union All 将列相同的表堆叠起来,并保留每一行,两个“东部”行都会保留。要删除重复项,请使用 Union Distinct。

源 部分是要追加到一起的所有数据表的集合。通常,所有数据表的列结构相同(或相似)。有两个按钮可用于将数据表添加到列表中:

  • 插入行
  • 追加行

此外,在 选择要编辑的源 窗口中右键单击会显示相同的选项。在已添加的表上右键单击还会显示 删除 选项。

要正确执行此转换,源 部分中每个要追加的源数据表都需要有一个条目。这些条目按其追加的顺序列出。要调整顺序,请在表上右键单击,会显示以下选项:

  • 下移(如适用)
  • 移到底部(如适用)
  • 上移(如适用)
  • 移到顶部(如适用)

默认情况下,每个源命名为 New Frame,但建议建模人员双击名称并重命名,以提供具有描述性的名称。

默认情况下,目标表 为空。命名之前请注意,数据表必须遵循 Linux 命名约定。因此,建议名称只包含字母和数字。Analyze 会自动清除名称中的无效字符。此外,名称长度限制为 256 个字符,因此请保持简洁。

目标表

表目标

要设置目标表,可以通过目标表下拉列表选择现有表作为目标表,也可以单击绿色的 “+” 号新建一个表作为目标。

创建表

新建表时,您可以选择将其创建为视图或表。

视图:

视图的优点是步骤的执行时间明显短于使用表的情况。缺点是视图在表的详细信息模式下不便于探索数据。

表:

使用表作为目标时,步骤的执行时间会更长,但在详细信息模式下探索数据比使用视图快得多。

表选择

选择表(或在第二种方式中选择多个表)有两种方式:

第一种方式是使用 指定表 下拉列表选择表。

第二种方式是使用 匹配搜索的表 选项,通过指定搜索路径和搜索文本来选择符合搜索条件的一个或多个表。 如果您的工作流会创建一系列名称相近、并在名称后附加日期保存的表,此选项会非常有用。

表动态选择

数据映射器配置

Table Data Mapper

数据映射器用于将源数据中的列映射到目标数据表。

检查并填充映射器

使用 检查源 菜单按钮可以通过更多方式将源中的列映射到目标:

  • 填充两个映射表:将源数据表中的所有值传播到目标数据表。这是默认行为。
  • 仅填充源映射表:仅映射源数据表中的所有值。当源列结构发生变化而需要修改现有工作流时,此选项很有用。
  • 仅填充目标映射表:仅将所有值传播到目标数据表。

如果上述源列和目标列选项仍不够用,还可以通过以下几种方式向目标数据表添加其他列:

  • 全部传播 会将所有源列插入目标数据表,无论这些列是否已存在。
  • 传播所选项 仅插入所选的源列。
  • 在目标侧右键单击并选择 插入行,可在当前所选行的正上方插入一行。
  • 在目标侧右键单击并选择 追加行,可在目标数据表的底部(最右侧)插入一行。

删除列

要从目标数据表中删除列,请选择所需的列,然后右键单击并选择 删除。

不再列出的源列

目标行可能指定了某个 源列,而源数据表已不再列出该列,例如在重新检查源之后。步骤绝不会自动移除这样的行,而是将列名显示为红色,并在前面加上 ⚠ 警告标志;将鼠标悬停在其上,会提示该列不在源列中。在包含多个表的步骤(如联合)中,每个表都会分别对照其自身的源列进行检查。

带有 常量、表达式 或 计数(含空值) 汇总的行不会被标记,因为步骤不会读取其源列。当源数据表没有列出任何列时(例如首次检查源之前),也不会标记任何内容。

保存仍含有已标记行的步骤时,会出现 发现过时列 对话框,按其所在的选项卡或表列出这些行,并提供三个选项:

  • 全部移除并保存 — 移除已标记的行,然后保存。
  • 仍然保存 — 按现状保存步骤。
  • 取消 — 返回步骤,不保存。

要保留某一行并清除其警告,请将该列重新添加到源数据表,或选择源数据表中列出的某一列。

源表中缺少的列

保存时,会按源数据表的当前状态对其进行检查。如果步骤在其源列中列出了某一列,而该表中并没有这一列(例如前面的步骤已将其重命名或删除),就说明步骤的列已经过时,读取该列的步骤在运行时会失败。此时保存会弹出 缺少源列 对话框,列出每个表及其缺少的列,并提供两个选项:

  • 仍然保存 — 按当前状态保存步骤。
  • 取消 — 返回步骤而不保存。

系统不会替您移除任何内容,因为有问题的可能是表本身,而且表在步骤运行之前还可能再次变化。如果同时还有行被标记为不再列出,两者会一并显示在 发现过时列 对话框中,全部移除并保存 只会移除被标记的行。当源列列表为空时,改为检查步骤所映射的列,但带有 常量、表达式 或 计数(含空值) 汇总的行除外,因为这些行不读取任何列。

用变量命名的源,例如 {year}/Sales,会按保存时变量的当前值进行检查,对话框中会给出实际检查的表名,例如 2026/Sales (from {year}/Sales)。由循环设置的变量保存的是最后一次迭代的值,因此对结构各异的多个表进行循环时,可能会针对下次运行并不会读取的表发出警告。尚不存在的表(例如工作流中前面某个步骤将要创建的表)不会被检查;变量没有值的源、步骤在运行时通过搜索查找的表,以及当前无法读取的表,同样不会被检查。

列数据类型

每个目标列都带有一个 类型。从源传播而来的列沿用源列的类型;手动添加的行起初为 文本,需要设置 类型 来指明其实际类型 — 打算求和或排序的列需要使用数值或日期类型,因为文本会按文本方式排序和求和。

保存时没有任何类型的列,步骤仍可运行。类型会在步骤启动时根据该列所读取的源列确定。如果无处可读,则视为文本:提取 SQL 步骤的列来自您编写的查询,而不是映射的源;如果多个源中存在同名列但类型不一致,则使用文本,而不是随意选择其中一种 — 猜错会产生仓库可能拒绝的转换,而任何类型都可以转换为文本。

自行设置 类型 仍然是指明列应为何种类型的方式。不设置则意味着接受源列恰好具有的类型。

更改列顺序

要重新排列目标数据表中的列,请选择所需的列。可以使用以下任一方式:

  • 批量移动箭头:从右上角的箭头中选择所需的移动选项
  • 上下文菜单:右键单击并选择 移到顶部、上移、下移 或 移到底部。

仅返回非重复记录

要仅返回非重复的选项,请选择 非重复 菜单选项。这会为源中的每一列切换显示一组复选框。只需勾选相应列旁边的复选框,即可仅返回非重复的结果。

视情况而定,您可能需要考虑改用汇总。

非重复处理会保留找到的第一条唯一记录,并丢弃其余记录。如果运行之间的一致性很重要,可能需要对数据进行排序。

聚合与分组

要聚合结果,请选择 汇总 菜单选项。这会为目标数据表中的每一列切换显示一组选择框。请为每一列选择合适的汇总方法。

当 检查源 填充列时,如果数值列的名称读起来像标识符(例如 id、customer_id、Order No 或 CustomerKey),或者其所在表将其设为键,或者联接将其用作键,则该列起初为 分组依据,而不是 求和。

  • 分组依据
  • 求和
  • 最小值
  • 最大值
  • 第一个
  • 最后一个
  • 计数
  • 计数(含空值)
  • 平均值
  • 标准差
  • 样本标准差
  • 总体标准差
  • 方差
  • 样本方差
  • 总体方差
  • 高级非分组

有关表达式、清理和常量等高级数据映射器用法,请参阅高级数据映射器用法

Table Data Filters

为了获得最大的灵活性,源数据和目标数据都可以使用数据筛选器。对于较大的数据集,在源端筛选掉部分行尤其有益,这样后续操作只需处理较小的数据集。

选择数据子集

此筛选器类型用于根据指定条件筛选传入的源数据。

对结果数据应用二次筛选器

此筛选器类型用于根据指定条件对转换后的结果数据应用筛选器。 对转换后的结果应用筛选器,可以基于复杂计算、汇总或窗口函数的结果进行排除。

最终数据表切片(限制)

行切片功能可根据范围和起始点限制结果集中的行数。

筛选器语法

筛选器语法使用 Python SQLAlchemy,与其他表达式的语法相同。

有关示例和表达式函数,请参阅表达式部分。

目标表 下的 列匹配依据 用于选择各源的对齐方式:

  • 名称(默认)— 每个源的列按名称与第一个源的列匹配。
  • 位置 — 各源按顺序堆叠,与 Spark 的 union 相同。结果采用第一个源的列名,并且每个源的列数必须相同。不使用每个源的列映射,因此其 表数据选择 选项卡处于禁用状态。

使用 位置 时,每一列采用所有源都适用的类型:两种数值类型变为范围更宽的那一种,日期和时间戳变为时间戳,其他混合情况变为文本。布尔或二进制列与其他类型混合时没有公共类型,会导致步骤失败,各源列数不同时同样如此。

无论哪种模式,如果所有源表都缺失,步骤都会完成并给出警告,而不是失败。

每个源生成的列必须与第一个源相同:列名相同,并且在两者都声明了类型时,类型也相同。目标表根据第一个源的列构建。源的列顺序可以不同,因为列是按名称匹配的。如果保存的步骤中各源存在差异,则会被拒绝,并指出每个差异:Source ‘east’ must produce the same columns as ‘west’: missing region; not in ‘west’: area.

保存时还会为每个有源表、但没有源列或目标列的源,根据该表填充其映射,效果与 填充两个映射表 相同。