

# 使用 AWS Glue 托管转换转换数据
<a name="edit-jobs-transforms"></a>

 AWS Glue Studio 提供了两种类型的转换：
+  **AWS Glue-原生转换** — 适用于所有用户并由 AWS Glue 管理。
+  **自定义视觉转换** — 允许您上传自己的转换以在 AWS Glue Studio 中使用 

## AWS Glue 托管数据转换节点
<a name="edit-jobs-transforms-glue-managed"></a>

AWS Glue Studio 提供一组内置转换，可用于处理数据。您的数据从任务图中的一个节点传递到名为 `DynamicFrame` 的数据结构（这是 Apache Spark SQL `DataFrame` 的扩展）中的另一个节点。

在作业的预填充图中，数据来源节点和数据目标节点之间是**更改架构**转换节点。您可以将此转换节点配置为修改数据，也可以使用其他转换。

以下内置转换适用于 AWS Glue Studio：
+ **[ChangeSchema](transforms-configure-applymapping.md)**：将数据来源中的数据属性键映射到数据目标中的数据属性键。您可以重命名键、修改键的数据类型以及选择要从数据集中删除的键。
+ **[SelectFields](transforms-configure-select-fields.md)**：选择要保留的数据属性键。
+ **[DropFields](transforms-configure-drop-fields.md)**：选择要删除的数据属性键。
+ **[RenameField](transforms-configure-rename-field.md)**：重命名单个数据属性键。
+ **[Spigot](transforms-configure-spigot.md)**：将数据样本写入 Amazon S3 存储桶。
+ **[Join](transforms-configure-join.md)**：使用指定数据属性键上的比较短语将两个数据集联接到一个数据集。您可以使用内部、外部、左、右、左半和左反联接。
+ **[联合](transforms-configure-union.md)**：合并多个数据来源中具有相同架构的行。
+ **[SplitFields](transforms-configure-split-fields.md)**：将数据属性键拆分为两个 `DynamicFrames`。输出是 `DynamicFrames` 集合：一个具有选定的数据属性键，另一个具有剩余的数据属性键。
+ **[SelectFromCollection](transforms-selectfromcollection-overview.md)**：请从 `DynamicFrames` 集合中选择一个 `DynamicFrame`。输出是选定的 `DynamicFrame`。
+ **[FillMissingValues](transforms-configure-fmv.md)**：查找数据集中缺少值的记录，并添加包含由输入决定的建议值的新字段
+ **[Filter](transforms-filter.md)**：根据筛选条件将数据集拆分为两个。
+  **[删除 Null 字段](transforms-dropnull-fields.md)**：如果列中的所有值都为“null”，则从数据集中移除这些列。
+  **[删除重复项](transforms-drop-duplicates.md)**：通过选择匹配整行或指定键，从数据来源中删除行。
+ **[SQL](transforms-sql.md)**：在文本输入字段中输入 SparkSQL 代码以使用 SQL 查询转换数据。输出为单个 `DynamicFrame`。
+  **[聚合](transforms-aggregate-fields.md)**：对所选字段和行执行计算（例如平均值、总和、最小值、最大值），并使用新计算的值创建新字段。
+ **[扁平化](transforms-flatten.md)**：将结构内的字段提取到顶级字段中。
+ **[UUID](transforms-uuid.md)**：为每行添加一个带有通用唯一标识符的列。
+ **[标识符](transforms-identifier.md)**：为每行添加一个带有数字标识符的列。
+ **[到时间戳](transforms-to-timestamp.md)**：将列转换为时间戳类型。
+ **[格式化时间戳](transforms-format-timestamp.md)**：将时间戳列转换为格式化字符串。
+ **[条件路由器转换](transforms-conditional-router.md)**：对传入数据应用多个条件。传入数据的每一行都通过一组筛选条件进行评估，然后处理到相应的组中。
+  **[串联列转换](transforms-concatenate-columns.md)**：使用带有可选间隔符的其他列的值来生成新的字符串列。
+  **[拆分字符串转换](transforms-split-string.md)**：使用正则表达式将字符串分解为令牌数组，以定义拆分的完成方式。
+  **[数组转列转换](transforms-array-to-columns.md)**：将数组类型的列的部分或全部元素提取到新列中。
+  **[添加当前时间戳转换](transforms-add-current-timestamp.md)**：用数据处理时间标记行。这对于审计目的或跟踪数据管道中的延迟非常有用。
+  **[将行转置为列转换](transforms-pivot-rows-to-columns.md)**：通过旋转选定列上的唯一值来聚合数字列，这些列会变成新列。如果选择了多列，则将这些值串联起来命名新列。
+  **[反转置列为行转换](transforms-unpivot-columns-to-rows.md)**：将列转换为新列的值，为每个唯一值生成一行。
+  **[自动平衡处理转换](transforms-autobalance-processing.md)**：更好地在工作线程之间重新分配数据。当数据不平衡或数据来自源时不允许对其进行足够的并行处理时，这很有用。
+  **[派生列转换](transforms-derived-column.md)**：根据数学公式或 SQL 表达式定义一个新列，您可以在其中使用数据中的其他列以及常量和文字。
+  **[查找转换](transforms-lookup.md)**：当键与数据中定义的查找列匹配时，从定义的目录表中添加列。
+  **[分解数组或映射到行转换](transforms-explode-array.md)**：将嵌套结构中的值提取到更易于操作的单个行中。
+  **[记录匹配转换](transforms-record-matching.md)**：调用现有的记录匹配机器学习数据分类转换。
+  **[移除空行转换](transforms-remove-null-rows.md)**：从数据集中移除所有列均为空（null）或空（empty）的行。
+  **[解析 JSON 列转换](transforms-parse-json-column.md)**：解析包含 JSON 数据的字符串列并将其转换为结构或数组列，具体取决于 JSON 是对象还是数组。
+  **[提取 JSON 路径转换](transforms-extract-json-path.md)**：从 JSON 字符串列中提取新列。
+  **[从正则表达式中提取字符串片段](transforms-regex-extractor.md)**：使用正则表达式提取字符串片段并从中创建新列，如果使用正则表达式组则创建多列。
+ **[Custom transform](transforms-custom.md)**：在文本输入字段中输入代码以使用自定义转换。输出是 `DynamicFrames` 的集合。

# 在 AWS Glue Studio 中使用数据准备配方
<a name="glue-studio-data-preparation"></a>

 借助**数据准备配方**转换，您可以使用交互式网格创作界面全新创作数据准备方法。此外您还可以导入现有的 AWS Glue DataBrew 配方，然后在 AWS Glue Studio 中对其进行编辑。

 **数据准备配方**节点可从“资源”面板中找到。您可以将**数据准备配方**节点连接到可视化工作流程中的另一个节点，无论它是数据来源节点还是其他转换节点。选择 AWS Glue DataBrew 配方和版本后，配方中应用的步骤将显示在节点属性选项卡中。

## 先决条件
<a name="glue-studio-databrew-prerequisites"></a>
+  要导入 AWS Glue DataBrew 配方，您需要拥有 [在 AWS Glue Studio 中导入 AWS Glue DataBrew 配方](glue-studio-data-preparation-import-recipe.md) 中描述的必要 IAM 权限。
+  必须创建数据预览会话。

## 限制
<a name="glue-studio-databrew-limitations"></a>
+  仅 [商业 DataBrew 区域](https://docs.aws.amazon.com/general/latest/gr/databrew.html)才支持 AWS Glue DataBrew 配方。
+  并非所有 AWS Glue DataBrew 配方都受 AWS Glue 支持。有些配方将无法在 AWS Glue Studio 中运行。
  +  不支持含有 `UNION` 和 `JOIN` 转换的配方，不过 AWS Glue Studio 已经拥有“Join”和“Union”转换节点，这些节点可以在**数据准备配方**节点之前或之后使用。
+  从 AWS Glue 4.0 版开始的作业支持**数据准备配方**节点。在作业中添加**数据准备配方**节点后，将自动选择此版本。
+  **数据准备配方**节点需要 Python。当向作业中添加**数据准备配方**节点时，会自动设置此值。
+  如果向可视化图表添加新的**数据准备配方**节点，则将自动使用正确的库重新启动数据预览会话，以便使用该**数据准备配方**节点。
+  不支持导入或在**数据准备配方**节点中编辑以下转换：`GROUP_BY`、`PIVOT`、`UNPIVOT` 和 `TRANSPOSE`。

## 其他功能
<a name="glue-studio-data-preparation-recipe-transform-features"></a>

 选择**数据准备配方**转换后，将可以在选择**创作配方**后执行其他操作。
+  添加步骤 – 您可以根据需要选择“添加步骤”图标向配方添加其他步骤，也可以选择某个操作来使用“预览”窗格中的工具栏。  
![\[屏幕截图显示了“添加配方”图标。\]](http://docs.aws.amazon.com/zh_cn/glue/latest/dg/images/add-recipe-icon.png)  
![\[屏幕截图显示了“添加配方”图标。\]](http://docs.aws.amazon.com/zh_cn/glue/latest/dg/images/author-recipe-toolbar.png)
+  导入配方 – 选择**更多**，然后选择**导入配方**以用于您的 AWS Glue Studio 作业。  
![\[屏幕截图显示了“更多”图标。\]](http://docs.aws.amazon.com/zh_cn/glue/latest/dg/images/data-preparation-recipe-node-more-icon.png)  
![\[屏幕截图显示了“更多”图标。\]](http://docs.aws.amazon.com/zh_cn/glue/latest/dg/images/data-preparation-recipe-node-more-features.png)
+  下载为 YAML – 选择**更多**，然后选择**下载为 YAML** 以下载配方并在 AWS Glue Studio 之外保存。
+  下载为 JSON – 选择**更多**，然后选择**下载为 JSON** 以下载配方并在 AWS Glue Studio 之外保存。
+  撤销和重做配方步骤 – 在网格中使用数据时，可以在“预览”窗格中撤销和重做配方步骤。  
![\[屏幕截图显示了“更多”图标。\]](http://docs.aws.amazon.com/zh_cn/glue/latest/dg/images/author-recipe-toolbar-undo-redo.png)

# 在可视化 ETL AWS Glue 作业中创作和运行数据准备配方
<a name="glue-studio-data-preparation-recipe-transform-tutorial"></a>

 在此场景中，您可以创作数据准备配方，而无需首先在 DataBrew 中创建配方。您必须满足以下条件后才能开始创作配方：
+  已有活动的“数据预览”会话在运行。当数据预览会话准备就绪后，**创作配方**将会激活，并且您可以开始创作或编辑配方。  
![\[屏幕截图显示数据预览会话的状态为“已完成”。\]](http://docs.aws.amazon.com/zh_cn/glue/latest/dg/images/data-preparation-recipe-data-preview-complete.png)
+  确保启用了**自动导入 Glue 库**切换开关。  
![\[屏幕截图显示“自动导入 Glue 库”选项已启用。\]](http://docs.aws.amazon.com/zh_cn/glue/latest/dg/images/data-preparation-recipe-automatically-import-glue-libraries.png)

   您可以通过选择“数据预览”窗格中的齿轮图标来执行此操作。  
![\[屏幕截图显示“自动导入 Glue 库”选项已启用。\]](http://docs.aws.amazon.com/zh_cn/glue/latest/dg/images/data-preview-preferences.png)

**在 AWS Glue Studio 中创作数据准备配方：**

1.  将**数据准备配方**转换添加到作业画布中。您的转换应会连接到数据来源节点父级。添加**数据准备配方**节点时，该节点将使用相关库重新启动，并且您会看到正在准备数据帧。  
![\[屏幕截图显示在添加数据准备配方后正在加载数据帧。\]](http://docs.aws.amazon.com/zh_cn/glue/latest/dg/images/data-preparation-preparing-dataframe.png)

1.  “数据预览”会话准备就绪后，包含任何先前所应用步骤的数据将显示在屏幕底部。

1.  选择**创作配方**。这将让您可以在 AWS Glue Studio 中创建新配方。  
![\[屏幕截图显示了“转换”面板，其中包含“名称”和“节点”父级字段，以及“创作配方”选项。\]](http://docs.aws.amazon.com/zh_cn/glue/latest/dg/images/data-preparation-recipe-transform-tab-new.png)

1.  在作业画布右侧的**转换**面板中，输入数据准备配方的名称。

1.  左侧画布将被替换为数据的网格视图。右侧的**转换**面板将变为显示配方步骤。选择**添加步骤**，以添加配方中的第一个步骤。  
![\[屏幕截图显示了选择“添加步骤”后的“转换”面板。选择某一列时，相关选项将动态变化。您可以选择排序、对列执行操作以及筛选值。\]](http://docs.aws.amazon.com/zh_cn/glue/latest/dg/images/author-recipe-preview-data-transform-panel.png)

1.  在**转换**面板中，选择排序、对列执行操作以及筛选值。例如，选择**重命名列**。  
![\[屏幕截图显示了选择“添加步骤”后的“转换”面板。选择某一列时，相关选项将动态变化。您可以选择排序、对列执行操作以及筛选值。\]](http://docs.aws.amazon.com/zh_cn/glue/latest/dg/images/author-recipe-add-step.png)

1.  在右侧的“转换”面板中，通过重命名列的选项，您可以选择要重命名的源列并输入新的列名。完成后，选择**应用**。

    您可以预览每个步骤、撤销步骤、对步骤重新排序以及使用任何操作图标，例如“筛选”、“排序”、“拆分”、“合并”等。在数据网格中执行操作时，这些步骤将被添加到“转换”面板中的配方中。  
![\[屏幕截图显示了“预览”数据网格，其中突出显示了工具栏。您可以使用其中的任何工具来应用操作，并且该操作将被添加到右侧“转换”面板中的配方中。\]](http://docs.aws.amazon.com/zh_cn/glue/latest/dg/images/author-recipe-preview-data-grid.png)

    如果需要进行更改，可以在“预览”窗格中预览每个步骤的结果、撤销某个步骤并对步骤重新排序，从而完成更改。例如：
   +  撤销/重做步骤 – 选择**撤销**图标即可撤销步骤。选择**重做**图标可以重复某个步骤。  
![\[屏幕截图显示了“更多”图标。\]](http://docs.aws.amazon.com/zh_cn/glue/latest/dg/images/author-recipe-toolbar-undo-redo.png)
   +  对步骤重新排序 – 对某个步骤重新排序时，AWS Glue Studio 将验证每个步骤并告知您该步骤是否无效。

1.  应用某个步骤后，“转换”面板将显示配方中的所有步骤。您可以清除所有步骤以重新开始，选择“添加”图标以添加更多步骤，或选择**完成创作配方**。  
![\[屏幕截图显示了“转换”面板，其中包含添加到配方中的步骤。完成后，选择完成创作配方或选择“添加”图标以向配方添加更多步骤。\]](http://docs.aws.amazon.com/zh_cn/glue/latest/dg/images/author-recipe-done-authoring-recipe.png)

1.  选择屏幕右上角的**保存**。在您保存作业之前将不会保存配方步骤。

# 在 AWS Glue Studio 中导入 AWS Glue DataBrew 配方
<a name="glue-studio-data-preparation-import-recipe"></a>

 在 AWS Glue DataBrew 中，配方是数据转换步骤的集合。AWS Glue DataBrew 配方规定了如何转换已读取的数据，但没有描述在何处如何读取数据，以及如何在何处写入数据。这是在 AWS Glue Studio 的“源节点”和“目标节点”中配置。有关配方的更多信息，请参阅 [Creating and using AWS Glue DataBrew recipes](https://docs.aws.amazon.com/databrew/latest/dg/recipes.html)。

 要在 AWS Glue Studio 中使用 AWS Glue DataBrew 配方，请先在 AWS Glue DataBrew 中创建配方。如果您已有要使用的配方，则可跳过这一步。

## AWS Glue DataBrew 的 IAM 权限
<a name="glue-studio-databrew-permissions"></a>

 本主题提供的信息可帮助您了解 IAM 管理员了解可以在数据准备配方转换的 AWS Identity and Access Management（IAM）policy 中使用的操作和资源。

 有关 AWS Glue 中的其他安全信息，请参阅 [Access Management](https://docs.aws.amazon.com/glue/latest/dg/security.html)。

**注意**  
 下表列举了用户导入现有 AWS Glue DataBrew 配方时需要的权限。


**数据准备配方转换操作**  

| Action | 说明 | 
| --- | --- | 
| databrew:ListRecipes | 授予检索 AWS Glue DataBrew 配方的权限。 | 
| databrew:ListRecipeVersions | 授予检索 AWS Glue DataBrew 配方版本的权限。 | 
| databrew:DescribeRecipe | 授予检索 AWS Glue DataBrew 配方描述的权限。 | 



 您用于访问此功能的角色应包含一个允许多项 AWS Glue DataBrew 操作的策略。您可以通过使用包含必要操作的 `AWSGlueConsoleFullAccess` 策略或在角色中添加以下内联策略来实现此目的：

------
#### [ JSON ]

****  

```
{
  "Version":"2012-10-17",		 	 	 
  "Statement": [
    {
      "Effect": "Allow",
      "Action": [
        "databrew:ListRecipes",
        "databrew:ListRecipeVersions",
        "databrew:DescribeRecipe"
      ],
      "Resource": [
        "*"
      ]
    }
  ]
}
```

------



 要使用数据准备配方转换，必须将 `IAM:PassRole` 操作添加到权限策略中。


**其他必需的权限**  

| Action | 说明 | 
| --- | --- | 
| iam:PassRole | 向 IAM 授予权限，允许用户传递已批准的角色。 | 

如果没有这些权限，则会发生以下错误：

```
"errorCode": "AccessDenied"
"errorMessage": "User: arn:aws:sts::account_id:assumed-role/AWSGlueServiceRole is not 
authorized to perform: iam:PassRole on resource: arn:aws:iam::account_id:role/service-role/AWSGlueServiceRole 
because no identity-based policy allows the iam:PassRole action"
```



## 导入 AWS Glue DataBrew 配方
<a name="glue-studio-databrew-import-steps"></a>

**导入 AWS Glue DataBrew 配方并在 AWS Glue Studio 中使用：**

 如果已有**数据准备配方**节点，并且想要直接 AWS Glue Studio 在中编辑配方步骤，则必须将配方步骤导入到 AWS Glue Studio 作业中。

1.  使用数据来源在 AWS Glue Studio 中启动 AWS Glue 作业。

1.  将**数据准备配方**节点添加到作业画布中。  
![\[屏幕截图显示了“添加节点”模式窗口，其中包含可供选择的数据准备配方。\]](http://docs.aws.amazon.com/zh_cn/glue/latest/dg/images/glue-add-node-data-preparation-recipe.png)

1.  在“转换”面板中，输入配方的名称。

1.  通过从下拉列表中选择画布上的可用节点来选择一个或多个父节点。

1.  选择**创作配方**。如果**创作配方**为灰色，则在选择父节点并完成数据预览会话之前，它不可用。  
![\[Author Data Preparation Recipe form with name field and node parents selection dropdown.\]](http://docs.aws.amazon.com/zh_cn/glue/latest/dg/images/glue-author-data-preparation-recipe.png)

1.  数据框加载并显示有关源数据的详细信息。

    选择**更多操作**图标，然后选择**导入配方**。  
![\[Data preparation interface showing "Build your Recipe" with an "Add step" button.\]](http://docs.aws.amazon.com/zh_cn/glue/latest/dg/images/glue-dataframe-import-recipe.png)

1.  使用导入配方向导完成相关步骤。在步骤 1 中，搜索您的配方，将其选中，然后选择**下一步**。  
![\[Import recipe interface showing two recipes, with one selected for import.\]](http://docs.aws.amazon.com/zh_cn/glue/latest/dg/images/import-recipe-step-1.png)

1.  在步骤 2 中，选择您的导入选项。您可以选择将新配方附加到现有配方或覆盖现有配方。选择**下一步**。  
![\[Import recipe interface showing selected recipe, version, and two imported steps.\]](http://docs.aws.amazon.com/zh_cn/glue/latest/dg/images/import-recipe-step-2.png)

1.  在步骤 3 中，验证配方步骤。导入 AWS Glue DataBrew 配方后，您可以直接在 AWS Glue Studio 中编辑此配方。  
![\[Recipe import interface showing two steps and a validation progress indicator.\]](http://docs.aws.amazon.com/zh_cn/glue/latest/dg/images/import-recipe-step-3.png)  
![\[Import recipe interface showing validated steps for sorting and formatting data.\]](http://docs.aws.amazon.com/zh_cn/glue/latest/dg/images/import-recipe-step-3-validated-2.png)

1.  之后，这些步骤将作为 AWS Glue 作业的一部分导入。在**作业详细信息**选项卡中进行必要的配置更改，例如根据需要为作业命名以及调整分配的容量。选择**保存**以保存作业和配方。
**注意**  
 配方导入不支持 JOIN、UNION、GROUP\$1BY、PIVOT、UNPIVOT、TRANSPOSE 等操作，也不能在配方创作模式下使用。

1.  您也可以根据需要添加其他转换节点并添加数据目标节点，从而完成作业编写。

    如果您在导入配方后对步骤重新排序，则 AWS Glue 会对这些步骤执行验证。例如，假设您重命名某列后将其删除，然后将删除步骤移到顶部，则重命名步骤将会无效。然后您可以编辑步骤以修复验证错误。

# 从 AWS Glue DataBrew 迁移到 AWS Glue Studio
<a name="databrew-migration-to-glue-studio"></a>

 如果您在 AWS Glue DataBrew 中有配方，请使用以下清单将您的配方迁移到 AWS Glue Studio。


| 如果要… | 然后执行此操作 | 
| --- | --- | 
|  允许用户检索 AWS Glue DataBrew 配方、配方版本和配方描述。 |  向允许您的角色访问必要操作的策略添加 IAM 权限。请参阅[AWS Glue DataBrew 的 IAM 权限](glue-studio-data-preparation-import-recipe.md#glue-studio-databrew-permissions)。 | 
|  将现有 AWS Glue DataBrew 配方导入 AWS Glue Studio。 |  按照[导入 AWS Glue DataBrew 配方](glue-studio-data-preparation-import-recipe.md#glue-studio-databrew-import-steps)中的步骤操作。 | 
|  使用 JOIN 和 UNION 导入配方。 |  不支持使用 UNION 和 JOIN 转换的配方。在数据准备配方节点之前或之后，使用 AWS Glue Studio 中的 Join 和 Union 转换。 | 

# 使用更改架构重新映射数据属性键
<a name="transforms-configure-applymapping"></a>

*更改架构*转换将源数据属性键重新映射到目标数据所需的配置。在“更改架构”转换节点中，您可以：
+ 更改多个数据属性键的名称。
+ 如果支持新数据类型并且两种数据类型之间存在转换路径，则更改数据属性键的数据类型。
+ 指示要删除的数据属性键，以选择数据属性键的子集。

您还可以根据需要（例如，为了修改其他数据来源或遵循*联接*转换），为作业图添加其他*更改架构*节点。

## 使用更改架构来处理十进制数据类型
<a name="transforms-configure-applymapping-decimal-datatype"></a>

 使用**更改架构**转换处理十进制数据类型时，**更改架构**转换会将精度修改为默认值（10,2）。要修改此精度并针对您的使用案例进行设置，您可以使用 **SQL 查询**转换并以特定的精度转换列。

 例如，如果您有一个名为“DecimalCol”、类型为“Decimal”的输入列，并且您想将其重新映射到名为“OutputDecimalCol”、特定精度为（18,6）的输出列，则需要：

1.  在**更改架构**转换之后添加一个后续的 **SQL 查询**转换。

1.  在 **SQL 查询**转换中，使用 SQL 查询将重新映射的列转换为所需的精度。SQL 查询将如下所示：

   ```
   SELECT col1, col2, CAST(DecimalCol AS DECIMAL(18,6)) AS OutputDecimalCol
   FROM __THIS__
   ```

    在上面的 SQL 查询中：
   +  `col1` 和 `col2` 是数据中的其他列，您希望在不做任何修改的情况下传递这些列。
   +  `DecimalCol` 是输入数据中的原始列名。
   +  `CAST(DecimalCol AS DECIMAL(18,6))` 将 `DecimalCol` 转换为 Decimal 类型，并指定精度为 18 位，包含 6 位小数。
   +  `AS OutputDecimalCol` 会将转换后的列重命名为 `OutputDecimalCol`。

 通过使用 **SQL 查询**转换，您可以覆盖由**更改架构**转换设置的默认精度，并将 Decimal 列显式转换为所需的精度。利用这种方法，您可以利用**更改架构**转换来重命名和重构数据，同时通过后续的 **SQL 查询**转换来处理 Decimal 列的精度要求。

## 将更改架构转换添加到您的作业
<a name="transforms-configure-applymapping-add-to-job"></a>

**注意**  
**更改架构**转换不区分大小写。

**将更改架构转换节点添加到作业图**

1. （可选）打开资源面板，然后选择**更改架构**将新转换添加到作业图（如果需要）。

1. 在节点属性面板中，输入作业图中节点的名称。如果尚未选择父节点，请从 **Node parents (父节点)** 列表中选择一个节点，用作转换的输入源。

1. 选择节点属性面板中的**转换**选项卡。

1. 修改输入架构：
   + 要重命名数据属性键，请在 **Target key (目标键)** 字段中输入键的新名称。
   + 要更改数据属性键的数据类型，请从 **Data type (数据类型)** 列表中为键选择新数据类型。
   + 要从目标架构中删除数据属性键，请选中该键对应的 **Drop (删除)** 复选框。

1. （可选）配置转换节点属性后，您可以选择节点详细信息面板中的 **Output schema (输出架构)** 选项卡，查看数据的修改架构。当您首次为任务中的任何节点选择此选项卡时，系统会提示您提供 IAM 角色以访问数据。如果您尚未在 **Job details (任务详细信息)** 选项卡上指定 IAM 角色，系统会提示您在此处输入 IAM 角色。

1. （可选）配置节点属性和转换属性后，您可以选择节点详细信息窗格中的 **Data preview (数据预览)** 选项卡来预览已修改的数据集。当您首次为任务中的任何节点选择此选项卡时，系统会提示您提供 IAM 角色以访问数据。使用此功能会产生相关费用，并且一旦您提供 IAM 角色，则会立即开始计费。

# 使用删除重复项
<a name="transforms-drop-duplicates"></a>

 删除重复项转换为您提供两个选项，从而从数据来源中移除行。您可以选择删除完全相同的重复行，也可以选择要匹配的字段，并根据所选字段仅删除这些行。

 例如，在此数据集中，您有重复的行，其中一些行中的所有值与另一行中的所有值完全相同，而行中的某些值相同或不同。


| 行 | 名称 | 电子邮件 | Age | 状态 | 注意 | 
| --- | --- | --- | --- | --- | --- | 
| 1 | Joy | joy@gmail | 33 | NY |  | 
| 2 | Tim | tim@gmail | 45 | OH |  | 
| 3 | Rose | rose@gmail | 23 | NJ |  | 
| 4 | Tim | tim@gmail | 42 | OH |  | 
| 5 | Rose | rose@gmail | 23 | NJ |  | 
| 6 | Tim | tim@gmail | 42 | OH | 这是一个重复的行，并且与所有值完全匹配，如行 \$14 | 
| 7 | Rose | rose@gmail | 23 | NJ | 这是一个重复的行，并且与所有值完全匹配，如行 \$15 | 

 如果您选择匹配整行，则第 6 行和第 7 行将从数据集中删除。现在的数据集为：


| 行 | 名称 | 电子邮件 | Age | 状态 | 
| --- | --- | --- | --- | --- | 
| 1 | Joy | joy@gmail | 33 | NY | 
| 2 | Tim | tim@gmail | 45 | OH | 
| 3 | Rose | rose@gmail | 23 | NJ | 
| 4 | Tim | tim@gmail | 42 | OH | 
| 5 | Rose | rose@gmail | 23 | NJ | 

 如果您选择指定键，则可以选择删除与“姓名”和“电子邮件”匹配的行。这使您可以更精细地控制数据集的“重复行”。通过指定“姓名”和“电子邮件”，数据集现在为：


| 行 | 名称 | 电子邮件 | Age | 状态 | 
| --- | --- | --- | --- | --- | 
| 1 | Joy | joy@gmail | 33 | NY | 
| 2 | Tim | tim@gmail | 45 | OH | 
| 3 | Rose | rose@gmail | 23 | NJ | 



 请记住以下事项：
+  为了将行识别为重复行，值区分大小写。行中的所有值都必须具有相同的大小写 — 这适用于您选择的任一选项（匹配整行或指定键）。
+  所有值都以字符串形式读入。
+  **删除重复项**转换使用 Spark dropDuplicates 命令。
+  使用**删除重复项**转换时，保留第一行并删除其他行。
+  **删除重复项**转换不会更改数据帧的架构。如果您选择指定键，则所有字段都将保留在生成的数据帧中。

# 使用 SelectFields 删除大多数数据属性键
<a name="transforms-configure-select-fields"></a>

您可以使用 *SelectFields* 转换从数据集创建数据属性键的子集。您可以指明要保留的数据属性键，其余的属性键将从数据集中删除。

**注意**  
*SelectFields* 转换区分大小写。如果您需要以不区分大小写的方式选择字段，则使用 *ApplyMapping*。

**将 SelectFields 转换节点添加到任务图**

1. （可选）打开资源面板，然后选择 **SelectFields** 将新转换添加到作业图（如果需要）。

1. 在 **Node properties (节点属性)** 选项卡上，输入任务图中节点的名称。如果尚未选择父节点，请从 **Node parents (父节点)** 列表中选择一个节点，用作转换的输入源。

1. 选择节点详细信息窗格中的 **Transform (转换)** 选项卡。

1. 在标题 **SelectFields** 下面，选择要保留的数据集中的数据属性键。所有未选择的数据属性键都将从数据集中删除。

   您还可以选中列标题 **Field (字段)** 旁边的复选框，自动选择数据集中的所有数据属性键。然后，您可以取消选择单个数据属性键，将其从数据集中删除。

1. （可选）配置转换节点属性后，您可以选择节点详细信息面板中的 **Output schema (输出架构)** 选项卡，查看数据的修改架构。当您首次为任务中的任何节点选择此选项卡时，系统会提示您提供 IAM 角色以访问数据。如果您尚未在 **Job details (任务详细信息)** 选项卡上指定 IAM 角色，系统会提示您在此处输入 IAM 角色。

1. （可选）配置节点属性和转换属性后，您可以选择节点详细信息窗格中的 **Data preview (数据预览)** 选项卡来预览已修改的数据集。当您首次为任务中的任何节点选择此选项卡时，系统会提示您提供 IAM 角色以访问数据。使用此功能会产生相关费用，并且一旦您提供 IAM 角色，则会立即开始计费。

# 使用 DropFields 保留大多数数据属性键
<a name="transforms-configure-drop-fields"></a>

您可以使用 *DropFields* 转换从数据集创建数据属性键的子集。您可以指明要从数据集中删除的数据属性键，其余的键均保留。

**注意**  
*DropFields* 转换区分大小写。如果您需要以不区分大小写的方式选择字段，则使用*更改架构*。

**将 DropFields 转换节点添加到任务图**

1. （可选）打开资源面板，然后选择 **DropFields** 将新转换添加到作业图（如果需要）。

1. 在 **Node properties (节点属性)** 选项卡上，输入任务图中节点的名称。如果尚未选择父节点，请从 **Node parents (父节点)** 列表中选择一个节点，用作转换的输入源。

1. 选择节点详细信息窗格中的 **Transform (转换)** 选项卡。

1. 在标题 **DropFields** 下面，选择要从数据源中删除的数据属性键。

   您还可以选中列标题 **Field (字段)** 旁边的复选框，自动选择数据集中的所有数据属性键。然后，您可以取消选择单个数据属性键，以便将它们保留在数据集。

1. （可选）配置转换节点属性后，您可以选择节点详细信息面板中的 **Output schema (输出架构)** 选项卡，查看数据的修改架构。当您首次为任务中的任何节点选择此选项卡时，系统会提示您提供 IAM 角色以访问数据。如果您尚未在 **Job details (任务详细信息)** 选项卡上指定 IAM 角色，系统会提示您在此处输入 IAM 角色。

1. （可选）配置节点属性和转换属性后，您可以选择节点详细信息窗格中的 **Data preview (数据预览)** 选项卡来预览已修改的数据集。当您首次为任务中的任何节点选择此选项卡时，系统会提示您提供 IAM 角色以访问数据。使用此功能会产生相关费用，并且一旦您提供 IAM 角色，则会立即开始计费。

# 重命名数据集中的字段
<a name="transforms-configure-rename-field"></a>

您可以使用 *RenameField* 转换来更改数据集中单个属性键的名称。

**注意**  
*RenameField* 转换区分大小写。如果您需要不区分大小写的转换，则使用 *ApplyMapping*。

**提示**  
如果您使用*更改架构*转换，则可以使用单个转换重命名数据集中的多个数据属性键。

**将 RenameField 转换节点添加到任务图**

1. （可选）打开资源面板，然后选择 **RenameField** 将新转换添加到作业图（如果需要）。

1. 在 **Node properties (节点属性)** 选项卡上，输入任务图中节点的名称。如果尚未选择父节点，请从 **Node parents (父节点)** 列表中选择一个节点，用作转换的输入源。

1. 选择 **Transform (转换)** 选项卡。

1. 在标题 **Transform (数据字段)** 下面，从源数据中选择属性键，然后在 **New field name (新字段名称)** 字段中输入新名称。

1. （可选）配置转换节点属性后，您可以选择节点详细信息面板中的 **Output schema (输出架构)** 选项卡，查看数据的修改架构。当您首次为任务中的任何节点选择此选项卡时，系统会提示您提供 IAM 角色以访问数据。如果您尚未在 **Job details (任务详细信息)** 选项卡上指定 IAM 角色，系统会提示您在此处输入 IAM 角色。

1. （可选）配置节点属性和转换属性后，您可以选择节点详细信息窗格中的 **Data preview (数据预览)** 选项卡来预览已修改的数据集。当您首次为任务中的任何节点选择此选项卡时，系统会提示您提供 IAM 角色以访问数据。使用此功能会产生相关费用，并且一旦您提供 IAM 角色，则会立即开始计费。

# 使用 Spigot 对数据集进行采样
<a name="transforms-configure-spigot"></a>

要测试任务执行的转换，您可能需要获取数据样本，以检查转换是否按预期工作。*Spigot* 转换将数据集中的记录子集写入 Amazon S3 存储桶中的 JSON 文件。数据采样方法可以是文件开头的指定记录数，或用于选取记录的概率因子。

**将 Spigot 转换节点添加到任务图**

1. （可选）打开资源面板，然后选择 **Spigot** 将新转换添加到作业图（如果需要）。

1. 在 **Node properties (节点属性)** 选项卡上，输入任务图中节点的名称。如果尚未选择父节点，请从 **Node parents (父节点)** 列表中选择一个节点，用作转换的输入源。

1. 选择节点详细信息窗格中的 **Transform (转换)** 选项卡。

1. 输入 Amazon S3 路径或选择 **Browse S3 (浏览 S3)**，在 Amazon S3 中选择位置。在此位置，任务将数据写入包含数据样本的 JSON 文件。

1. 输入采样方法的信息。您可以为指定 **Number of records (记录数)** 的值，从数据集的开头开始写入，指定 **Probability threshold (概率阈值)**（以十进制值输入，最大值为 1），挑选任何指定记录。

   例如，要从数据集中写入前 50 条记录，您可以将 **Number of records (记录数)** 设置为 50，将 **Probability threshold (概率阈值)** 设置为 1（100%）。

# 联接数据集
<a name="transforms-configure-join"></a>

*Join* 转换允许您将两个数据集合成一个数据集。您可以在每个数据集的架构中指定键名称以进行比较。输出 `DynamicFrame` 包含键符合联接条件的行。每个数据集中满足连接条件的行将合并为输出 `DynamicFrame` 中的单一行，其中包含在任一数据集中找到的所有列。

**将 Join 转换节点添加到任务图**

1. 如果只有一个可用的数据源，则必须向任务图中添加新的数据源节点。

1. 为联接选择源节点。打开资源面板，然后选择**联接**将新转换添加到作业图。

1. 在 **Node properties (节点属性)** 选项卡上，输入任务图中节点的名称。

1. 在标题 **Node parents (父节点)** 下的 **Node properties (节点属性)** 选项卡中，添加一个父节点，以便有两个数据集为联接提供输入。父节点可以是数据源节点，也可以是转换节点。
**注意**  
一个联接只能有两个父节点。

1. 选择 **Transform (转换)** 选项卡。

   如果您看到一条消息，指出有存在冲突的键名称，您可以执行以下操作：
   + 请选择 **Resolve it (解决)**，自动将 *ApplyMapping* 转换节点添加到您的任务图。ApplyMapping 节点会为数据集中与其他数据集中的键同名的键添加前缀。例如，如果使用默认值 **right**，则右侧数据集中与左侧数据集中的键同名的键都重命名为 `(right)key name`。
   + 在任务图中的前面手动添加转换节点，以删除或重命名冲突的键。

1. 在 **Join type (联接类型)** 列表中选择联接类型。
   + **Inner join (内部联接)**：对于基于联接条件的每个匹配项，返回包含来自两个数据集的列的行。不会返回不满足联接条件的行。
   + **Left join (左侧联接)**：左侧数据集中的所有行，以及右侧数据集中满足连接条件的行。
   + **Right join (右侧联接)**：右侧数据集中的所有行，以及左侧数据集中满足连接条件的行。
   + **Outer join (外部联接)**：两个数据集中的所有行。
   + **Left semi join (左半联接)**：左侧数据集中基于连接条件在右侧数据集中具有匹配项的所有行。
   + **Left anti join (左反联接)**：左侧数据集中基于连接条件在右侧数据集中没有匹配项的所有行。

1. 在标题 **Join conditions (联接条件)** 下的 **Transform (转换)** 选项卡中，选择 **Add condition (添加条件)**。从每个数据集中选择要比较的属性键。比较运算符左侧的属性键称为左侧数据集，右侧的属性键称为右侧数据集。

   对于更复杂的联接条件，您可以多次选择 **Add condition (添加条件)**，添加其他匹配键。如果您意外添加了条件，您可以选择删除图标（![\[\]](http://docs.aws.amazon.com/zh_cn/glue/latest/dg/images/delete-icon-black.png)）将其删除。

1. （可选）配置转换节点属性后，您可以选择节点详细信息面板中的 **Output schema (输出架构)** 选项卡，查看数据的修改架构。当您首次为任务中的任何节点选择此选项卡时，系统会提示您提供 IAM 角色以访问数据。如果您尚未在 **Job details (任务详细信息)** 选项卡上指定 IAM 角色，系统会提示您在此处输入 IAM 角色。

1. （可选）配置节点属性和转换属性后，您可以选择节点详细信息窗格中的 **Data preview (数据预览)** 选项卡来预览已修改的数据集。当您首次为任务中的任何节点选择此选项卡时，系统会提示您提供 IAM 角色以访问数据。使用此功能会产生相关费用，并且一旦您提供 IAM 角色，则会立即开始计费。

有关连接输出架构的示例，请考虑使用以下属性键在两个数据集之间进行联接：

```
Left: {id, dept, hire_date, salary, employment_status}
Right: {id, first_name, last_name, hire_date, title}
```

使用 `=` 比较运算符将联接配置为匹配 `id` 和 `hire_date` 键。

因为两个数据集都包含 `id` 和 `hire_date` 键，所以您选择 **Resolve it (解决)** 可自动将前缀 **right** 添加到正确数据集中的键。

输出架构中的键如下：

```
{id, dept, hire_date, salary, employment_status, 
(right)id, first_name, last_name, (right)hire_date, title}
```

# 使用联合合并行
<a name="transforms-configure-union"></a>

 如果要联合来自多个具有相同架构的数据来源的行，则可以使用联合转换节点。

 联合转换有两种类型：

1. ALL — 应用 ALL 时，生成的联合不会删除重复行。

1. DISTINCT — 应用 DISTINCT 时，生成的联合会删除重复的行。

 **联合与联接** 

 您可以使用联合来合并行。您可以使用联接来合并列。

**在 Visual ETL 画布中使用联合转换**

1.  添加多个数据来源以执行联合转换。要添加数据来源，请打开资源面板，然后从“来源”选项卡中选择数据来源。在使用联合转换之前，必须确保联合中涉及的所有数据来源都具有相同的架构和结构。

1.  如果您至少有两个数据来源要使用联合转换进行组合，请将其添加到画布中来创建联合转换。打开画布上的资源面板并搜索“联合”。您也可以在资源面板中选择“转换”选项卡，向下滚动直到找到联合转换，然后选择**联合**。

1. 在作业画布上选择联合节点。在节点属性窗口中，选择要连接到联合转换的父节点。

1. AWS Glue 检查兼容性以确保联合转换可以应用于所有数据来源。如果数据来源的架构相同，则允许该操作。如果数据来源没有相同的架构，则会显示一条无效的错误消息：“此联合的输入架构不一样。请考虑使用 ApplyMapping 来匹配架构。” 要修复此问题，请选择使用 **ApplyMapping**。

1. 选择联合类型。

   1. 全部 - 默认情况下，选择“全部联合”类型；如果数据组合中有重复行，这将导致重复行。

   1. 不同 - 如果要从生成的数据组合中删除重复的行，请选择“不同”。

# 使用 SplitFields 将一个数据集拆分为两个
<a name="transforms-configure-split-fields"></a>

*SplitFields* 转换允许您选择输入数据集中的某些数据属性键，并将其放入一个数据集，将未选定的键放入单独的数据集。此转换的输出是 `DynamicFrames` 集合。

**注意**  
您必须使用 *SelectFromCollection* 转换将 `DynamicFrames` 集合转换为单个 `DynamicFrame`，然后将输出发送到目标位置。

*SplitFields* 转换区分大小写。如果您需要不区分大小写的属性键名称，则将 *ApplyMapping* 转换添加为父节点。

**将 SplitFields 转换节点添加到任务图**

1. （可选）打开资源面板，然后选择 **SplitFields** 将新转换添加到作业图（如果需要）。

1. 在 **Node properties (节点属性)** 选项卡上，输入任务图中节点的名称。如果尚未选择父节点，请从 **Node parents (父节点)** 列表中选择一个节点，用作转换的输入源。

1. 选择 **Transform (转换)** 选项卡。

1. 选择要放入第一个数据集的属性键。未选择的键将置于第二个数据集。

1. （可选）配置转换节点属性后，您可以选择节点详细信息面板中的 **Output schema (输出架构)** 选项卡，查看数据的修改架构。当您首次为任务中的任何节点选择此选项卡时，系统会提示您提供 IAM 角色以访问数据。如果您尚未在 **Job details (任务详细信息)** 选项卡上指定 IAM 角色，系统会提示您在此处输入 IAM 角色。

1. （可选）配置节点属性和转换属性后，您可以选择节点详细信息窗格中的 **Data preview (数据预览)** 选项卡来预览已修改的数据集。当您首次为任务中的任何节点选择此选项卡时，系统会提示您提供 IAM 角色以访问数据。使用此功能会产生相关费用，并且一旦您提供 IAM 角色，则会立即开始计费。

1. 配置 *SelectFromCollection* 转换节点，处理生成的数据集。

# *SelectFromCollection* 转换概览
<a name="transforms-selectfromcollection-overview"></a>

某些变换具有多个数据集（而不是单个数据集）作为输出，例如 *SplitFields*。*SelectFromCollection* 转换从数据集集合（一组 `DynamicFrames`）中选择一个数据集（`DynamicFrame`）。转换输出是选定的 `DynamicFrame`。

使用如下用于创建 `DynamicFrames` 集合的转换后，您必须使用此转换：
+ 自定义代码转换
+ *SplitFields*

如果您在这些转换之后没有将 *SelectFromCollection* 转换节点到您的任务图，您将收到任务错误。

此转换的父节点必须是返回 `DynamicFrames` 集合的节点。如果您为返回单个 `DynamicFrame` 的转换节点（例如 *Join* 转换）选择父节点，您的任务将返回错误。

同样，如果您在工作图中使用 *SelectFromCollection* 节点作为转换的父节点，而该转换需要单个 `DynamicFrame` 作为输入，那么您的工作将返回错误。

![\[屏幕截图显示了节点详细信息面板的 Node properties (节点属性) 属性选项卡上的 Node parents (父节点) 字段。选定的父节点为 SplitFields，显示的错误消息为“Parent node Split Fields outputs a collection, but node Drop Fields does not accept a collection.”\]](http://docs.aws.amazon.com/zh_cn/glue/latest/dg/images/screenshot-edit-splitfields-wrong-parent.png)


# 使用 SelectFromCollection 选择要保留的数据集
<a name="transforms-configure-select-collection"></a>

使用 *SelectFromCollection* 转换将 `DynamicFrames` 集合转换为单个 `DynamicFrame`。

**将 SelectFromCollection 转换节点添加到任务图**

1. （可选）打开资源面板，然后选择 **SelectFromCollection** 将新转换添加到作业图（如果需要）。

1. 在 **Node properties (节点属性)** 选项卡上，输入任务图中节点的名称。如果尚未选择父节点，请从 **Node parents (父节点)** 列表中选择一个节点，用作转换的输入源。

1. 选择 **Transform (转换)** 选项卡。

1. 在标题 **Frame index (帧索引)** 下面，选择您要从 `DynamicFrames` 集合中选择的 `DynamicFrame` 对应的数组索引编号。

   例如，如果此转换的父节点是 *SplitFields* 转换，则在该节点的 **Output schema (输出架构)** 选项卡上，您可以看到每个 `DynamicFrame` 的架构。如果您要保留与 **Output 2 (输出 2)** 的架构关联的 `DynamicFrame`，您需要选择 **1** 作为 **Frame index (帧索引)** 的值，这是列表中的第二个值。

   输出中仅包含 `DynamicFrame`。

1. （可选）配置转换节点属性后，您可以选择节点详细信息面板中的 **Output schema (输出架构)** 选项卡，查看数据的修改架构。当您首次为任务中的任何节点选择此选项卡时，系统会提示您提供 IAM 角色以访问数据。如果您尚未在 **Job details (任务详细信息)** 选项卡上指定 IAM 角色，系统会提示您在此处输入 IAM 角色。

1. （可选）配置节点属性和转换属性后，您可以选择节点详细信息窗格中的 **Data preview (数据预览)** 选项卡来预览已修改的数据集。当您首次为任务中的任何节点选择此选项卡时，系统会提示您提供 IAM 角色以访问数据。使用此功能会产生相关费用，并且一旦您提供 IAM 角色，则会立即开始计费。

# 查找并填充数据集中的缺失值
<a name="transforms-configure-fmv"></a>

您可以在数据集中使用 *FillMissingValues* 转换，查找数据集中缺少值的记录，并添加包含由输入决定的值的新字段。输入数据集用于训练机器学习（ML）模型，该模型确定缺失值。如果您使用增量数据集，则每个增量集都会用作 ML 模型的训练数据，因此结果可能不是如此准确。

**在任务图中使用 FillMissingValues 转换节点**

1. （可选）打开资源面板，然后选择 **FillMissingValues** 将新转换添加到作业图（如果需要）。

1. 在 **Node properties (节点属性)** 选项卡上，输入任务图中节点的名称。如果尚未选择父节点，请从 **Node parents (父节点)** 列表中选择一个节点，用作转换的输入源。

1. 选择 **Transform (转换)** 选项卡。

1. 对于 **Data field (数据字段)**，从要分析缺失值的源数据中选择列或字段名称。

1. （可选）在 **New field name (新字段名称)** 字段中，输入每条记录所添加字段的名称，该字段将保存所分析字段的估计替换值。如果分析的字段没有缺失值，则分析字段中的值将复制到新字段。

   如果没有为新字段指定名称，默认名称是已分析列的名称，已附加 `_filled`。例如，如果您为 **Data field (数据字段)** 输入 **Age**，没有为 **New field name (新字段名称)** 指定值，则名为 **Age\$1filled** 的新字段会添加到每个记录。

1. （可选）配置转换节点属性后，您可以选择节点详细信息面板中的 **Output schema (输出架构)** 选项卡，查看数据的修改架构。当您首次为任务中的任何节点选择此选项卡时，系统会提示您提供 IAM 角色以访问数据。如果您尚未在 **Job details (任务详细信息)** 选项卡上指定 IAM 角色，系统会提示您在此处输入 IAM 角色。

1. （可选）配置节点属性和转换属性后，您可以选择节点详细信息窗格中的 **Data preview (数据预览)** 选项卡来预览已修改的数据集。当您首次为任务中的任何节点选择此选项卡时，系统会提示您提供 IAM 角色以访问数据。使用此功能会产生相关费用，并且一旦您提供 IAM 角色，则会立即开始计费。

# 筛选数据集中的键
<a name="transforms-filter"></a>

使用 *Filter* 转换基于正则表达式从输入数据集中筛选记录，从而创建新记录。不满足筛选条件的行将从输出中删除。
+ 对于字符串数据类型，您可以筛选键值与指定字符串匹配的行。
+ 对于数值数据类型，您可以通过使用比较运算符 `<`、`>`、`=`、`!=`、`<=` 和 `>=`，将键值与指定值进行比较来筛选行。

如果您指定多个筛选条件，则默认使用 `AND` 运算符整合结果，但您可以改为选择 `OR`。

*Filter* 转换区分大小写。如果您需要不区分大小写的属性键名称，则将 *ApplyMapping* 转换添加为父节点。

**将 Filter 转换节点添加到任务图**

1. （可选）打开资源面板，然后选择**筛选器**将新转换添加到作业图（如果需要）。

1. 在 **Node properties (节点属性)** 选项卡上，输入任务图中节点的名称。如果尚未选择父节点，请从 **Node parents (父节点)** 列表中选择一个节点，用作转换的输入源。

1. 选择 **Transform (转换)** 选项卡。

1. 选择 **Global AND** 或者 **Global OR**。这将确定多个筛选条件的组合方式。所有条件都使用 `AND` 或者 `OR` 运算符。如果您只有一个筛选条件，则可以选择其中的任意一个。

1. 选择 **Filter condition (筛选条件)** 部分中的 **Add condition (添加条件)** 添加筛选条件。

   在 **Key (键)** 字段中，从数据集中选择属性键名称。在 **Operation (运算符)** 字段中，选择比较运算符。在 **Value (值)** 字段中，输入比较值。下面是一些筛选条件示例。
   + `year >= 2018`
   + `State matches 'CA*'`

   筛选字符串值时，请确保比较值使用与任务属性（Python 或 Scala）中选择的脚本语言相匹配的正则表达式格式。

1. 根据需要添加额外的筛选条件。

1. （可选）配置转换节点属性后，您可以选择节点详细信息面板中的 **Output schema (输出架构)** 选项卡，查看数据的修改架构。当您首次为任务中的任何节点选择此选项卡时，系统会提示您提供 IAM 角色以访问数据。如果您尚未在 **Job details (任务详细信息)** 选项卡上指定 IAM 角色，系统会提示您在此处输入 IAM 角色。

1. （可选）配置节点属性和转换属性后，您可以选择节点详细信息窗格中的 **Data preview (数据预览)** 选项卡来预览已修改的数据集。当您首次为任务中的任何节点选择此选项卡时，系统会提示您提供 IAM 角色以访问数据。使用此功能会产生相关费用，并且一旦您提供 IAM 角色，则会立即开始计费。

# 使用 DropNullFields 删除空值字段
<a name="transforms-dropnull-fields"></a>

 如果字段中的所有值均为“null”（空），请使用 *DropNullFields* 转换从数据集中删除字段。预设情况下，AWS Glue Studio 将识别空对象，但某些值（如空字符串、“null”（空）字符串、-1 整数或其他占位符（如零））不会自动识别为空。

**要使用 DropNullFields**

1.  将 DropNullFields 节点添加到任务图中。

1.  在 **Node properties**（节点属性）选项卡上，选择其他表示空值的值。您可以选择不选择任何值，也可以选择所有值：  
![\[屏幕截图显示了 DropNullFields 节点的 Transform（转换）选项卡。\]](http://docs.aws.amazon.com/zh_cn/glue/latest/dg/images/DropNullFields-transform-tab.png)
   +  空字符串(""或'')- 将删除包含空字符串的字段 
   +  “null string”（空字符串）- 将删除包含带有“null”（空）一词的字符串的字段 
   +  -1 整数 - 将删除包含 -1（负一）整数的字段 

1.  如果需要，还可以指定自定义空值。这些空值可能仅适用于您的数据集。要添加自定义空值，请选择 **Add new value**（添加新值）。

1.  输入自定义空值。例如，可以是零，也可以是用于表示数据集中空值的任何值。

1.  在下拉字段中选择数据类型。数据类型可以是字符串或整数。
**注意**  
 自定义空值及其数据类型必须完全匹配，才能将字段识别为空值并删除字段。部分匹配（只有自定义空值匹配，但数据类型不匹配）不会导致删除字段。

# 使用 SQL 查询转换数据
<a name="transforms-sql"></a>

您可以使用 **SQL** 转换以 SQL 查询形式编写您自己的转换。

SQL 转换节点可以有多个数据集作为输入，但只能生成单个数据集作为输出。包含文本字段，您可以在其中输入 Apache SparkSQL 查询。您可以为用作输入的每个数据集分配别名，以帮助简单地执行 SQL 查询。有关 SQL 语法的更多信息，请参阅 [Spark SQL 文档](https://spark.apache.org/docs/latest/sql-ref.html)。

**注意**  
如果您对 VPC 中的数据源使用 Spark SQL 转换，请将 AWS Glue VPC 终端节点添加到包含数据源的 VPC。有关配置开发终端节点的更多信息，请参阅《AWS Glue 开发人员指南》**中的[添加开发终端节点](https://docs.aws.amazon.com/glue/latest/dg/add-dev-endpoint.html)、[针对开发终端节点设置您的环境](https://docs.aws.amazon.com/glue/latest/dg/start-development-endpoint.html)和[访问您的开发终端节点](https://docs.aws.amazon.com/glue/latest/dg/dev-endpoint-elastic-ip.html)。

**在任务图中使用 SQL 转换节点**

1. （可选）在需要时将转换节点添加到任务图。对于节点类型，请选择 **Spark SQL**。
**注意**  
 如果使用数据预览会话和自定义 SQL 或自定义代码节点，则数据预览会话将按原样对整个数据集执行 SQL 或代码块。

1. 在 **Node properties (节点属性)** 选项卡上，输入任务图中节点的名称。如果尚未选择父节点，或者您希望为 SQL 转换选择多个输入，请从 **Node parents (父节点)** 列表中选择一个节点，用作转换的输入源。根据需要添加额外的父节点。

1. 选择节点详细信息窗格中的 **Transform (转换)** 选项卡。

1. SQL 查询的源数据集由您在每个节点的 **Name (名称)** 字段中指定的名称标识。如果您不想使用这些名称，或者这些名称不适合 SQL 查询，则可以将名称与每个数据集关联。控制台提供默认别名，例如 `MyDataSource`。

   例如，如果 SQL 转换节点的父节点名为 `Rename Org PK field`，您可以将名称 `org_table` 与此数据集一起使用。然后，您可以在 SQL 查询中使用此别名来代替节点名称。

1. 在标题 **Code block (代码数据块)** 下的文本输入字段中，粘贴或输入 SQL 查询。文本字段显示 SQL 语法突出显示和关键字建议。

1. 在选中 SQL 转换节点的情况下，选择 **Output schema (输出架构)** 选项卡，然后选择 **Edit (编辑)**。提供描述 SQL 查询输出字段的列和数据类型。

   使用页面的 **Output schema (输出架构)** 部分中的以下操作指定架构：
   + 要重命名列，请将光标放在列的 **Key (键)** 文本框（也称为 *field (字段)* 或者 *property key (属性键)*），然后输入新名称。
   + 要更改列的数据类型，请从下拉列表中选择该列的新数据类型。
   + 要为架构添加新的顶级列，请选择 Overflow (溢出)（![\[\]](http://docs.aws.amazon.com/zh_cn/glue/latest/dg/images/edit-schema-actions-button.png)）按钮，然后选择 **Add root key (添加根键)**。新列将添加到架构顶部。
   + 要从架构中删除列，请选择键名称最右侧的删除图标（![\[\]](http://docs.aws.amazon.com/zh_cn/glue/latest/dg/images/delete-icon-black.png)）。

1. 指定输出架构后，选择 **Apply (应用)** 保存您的更改并退出架构编辑器。如果不想保存更改，请选择 **Cancel (取消)** 以编辑架构编辑器。

1. （可选）配置节点属性和转换属性后，您可以选择节点详细信息窗格中的 **Data preview (数据预览)** 选项卡来预览已修改的数据集。当您首次为任务中的任何节点选择此选项卡时，系统会提示您提供 IAM 角色以访问数据。使用此功能会产生相关费用，并且一旦您提供 IAM 角色，则会立即开始计费。

# 使用聚合对选定字段执行汇总计算
<a name="transforms-aggregate-fields"></a>

**要使用 Aggregate 转换**

1.  将 Aggregate 节点添加到任务图中。

1.  在 **Node properties**（节点属性）选项卡上，通过选择下拉字段，选择要组合在一起的字段（可选）。您可以一次选择多个字段，也可以在搜索栏中键入来搜索字段名称。

    选择字段后，将显示名称和数据类型。要删除字段，请在字段上选择“X”。  
![\[屏幕截图显示了 Aggregate 节点的 Transform（转换）选项卡。\]](http://docs.aws.amazon.com/zh_cn/glue/latest/dg/images/Aggregate-transform-tab.png)

1.  选择 **Aggregate another column**（聚合另一列）。至少需要选择一个字段。  
![\[屏幕截图显示了选择 Aggregate another column（聚合另一列）时的字段。\]](http://docs.aws.amazon.com/zh_cn/glue/latest/dg/images/Aggregate-fieldtoaggregate.png)

1.  在 **Field to aggregate**（要聚合的字段）下拉列表中选择一个字段。

1.  选择要应用于所选字段的聚合函数：
   +  avg - 计算平均值 
   +  countDistinct - 计算唯一非空值的数量 
   +  count - 计算非空值的数量 
   +  first - 返回满足“group by”（分组依据）条件的第一个值 
   +  last - 返回满足“group by”（分组依据）条件的最后一个值 
   +  kurtosis - 计算频率分布曲线峰值的锐度 
   +  max - 返回满足“group by”（分组依据）条件的最高值 
   +  min - 返回满足“group by”（分组依据）条件的最低值 
   +  skewness - 衡量正态分布概率分布的不对称性 
   +  stddev\$1pop - 计算总体标准差并返回总体方差的平方根 
   +  sum - 组中所有值的总和。
   +  sumDistinct - 组中不同值的总和。
   +  var\$1samp - 组的样本方差（忽略空值） 
   +  var\$1pop - 组的总体方差（忽略空值） 

# 扁平化嵌套结构
<a name="transforms-flatten"></a>

*扁平化*数据中嵌套结构的字段，使它们成为顶级字段。使用以结构字段名称为前缀的字段名来命名新字段，用点分隔。

例如，如果数据中有一个名为“phone\$1numbers”的 Struct 类型的字段，该字段中有一个名为“home\$1phone”的“Struct”字段，其中包含两个字段：“country\$1code”和“number”。扁平化后，这两个字段将成为顶级字段，分别命名为“phone\$1numbers.home\$1phone.country\$1code”和“phone\$1numbers.home\$1phone.number”。

**将*扁平化*转换节点添加到任务图**

1. 打开资源面板，选择**转换**选项卡，然后选择**展平**将新转换添加到作业图。您也可以通过输入“展平”，然后单击“展平”节点来使用搜索栏。添加节点时选择的节点将是其父节点。  
![\[屏幕截图显示了资源面板和填充有“展平”字样的搜索栏。搜索结果显示了展平转换。\]](http://docs.aws.amazon.com/zh_cn/glue/latest/dg/images/transform-flatten.png)

1. （可选）在**节点属性**选项卡上，输入任务图中节点的名称。如果尚未选择父节点，请从 **Node parents (父节点)** 列表中选择一个节点，用作转换的输入源。

1. （可选）在**转换**选项卡上，可以限制要扁平化的嵌套级别的最大值。例如，将该值设置为 1 意味着只会扁平化顶级结构。将最大值设置为 2 将扁平化顶级结构及其下一级结构。

# 添加 UUID 列
<a name="transforms-uuid"></a>

添加 *UUID*（通用唯一标识）列时，将为每行分配一个唯一的字符串（36 个字符）。

**将 *UUID* 转换节点添加到任务图**

1. 打开资源面板，然后选择 **UUID** 将新转换添加到作业图。添加节点时选择的节点将是其父节点。

1. （可选）在**节点属性**选项卡上，输入任务图中节点的名称。如果尚未选择父节点，请从 **Node parents (父节点)** 列表中选择一个节点，用作转换的输入源。

1. （可选）在**转换**选项卡上，您可以自定义新列的名称。默认情况下，新列将被命名为 "uuid"。

# 添加标识符列
<a name="transforms-identifier"></a>

为数据集中的每一行分配一个数字*标识符*。

**在任务图中添加*标识符*转换节点**

1. 打开资源面板，然后选择**标识符**将新转换添加到作业图。添加节点时选择的节点将是其父节点。

1. （可选）在**节点属性**选项卡上，输入任务图中节点的名称。如果尚未选择父节点，请从 **Node parents (父节点)** 列表中选择一个节点，用作转换的输入源。

1. （可选）在**转换**选项卡上，您可以自定义新列的名称。默认情况下，将被命名为“id”。

1. （可选）如果作业以增量方式处理和存储数据，则要避免在两次作业运行之间重复使用相同的 id。

   在**转换**选项卡上，勾选复选框选项**唯一**。标识符中会包含作业时间戳，使标识符在多次运行之间是唯一的。为了允许较大的数字，列（而不是 Long 数据类型）将为十进制。

# 将列转换为时间戳类型。
<a name="transforms-to-timestamp"></a>

您可以使用转换*到时间戳*将数值列或字符串列的数据类型更改为时间戳，这样就可以将列存储为该数据类型，或将列应用于需要时间戳的其他转换。

**将 *To timestamp* 转换节点添加到任务图**

1. 打开资源面板，然后选择**转换为时间戳**将新转换添加到作业图。添加节点时选择的节点将是其父节点。

1. （可选）在**节点属性**选项卡上，输入任务图中节点的名称。如果尚未选择父节点，请从 **Node parents (父节点)** 列表中选择一个节点，用作转换的输入源。

1. 在**转换**选项卡上，输入要转换的列的名称。

1. 在**转换**选项卡上，定义如何通过选择类型解析选定的列。

   如果该值是一个数字，可以选择相应的选项用秒（Unix/Python 时间戳）、毫秒或微秒表示。

   如果值是格式化字符串，请选择 "iso" 类型，该字符串需要符合 ISO 格式的变体之一，例如：“2022-11-02T14:40:59.915Z”。

   如果还不知道类型，或者不同的行使用不同的类型，则可以选择“自动检测”，系统会以较小的性能成本做出最佳猜测。

1. （可选）在**转换**选项卡上，您可以创建一个新列并通过输入新列的名称来保留原始列，而不是转换所选列。

# 将时间戳列转换为格式化字符串。
<a name="transforms-format-timestamp"></a>

根据模式将时间戳列格式化为字符串。您可以使用*格式化时间戳*以所需格式的字符串形式获取日期和时间。您可以使用 [Spark 日期语法](https://spark.apache.org/docs/latest/sql-ref-datetime-pattern.html)以及大多数 [Python 日期代码](https://docs.python.org/3/library/datetime.html#strftime-and-strptime-format-codes)来定义格式。

例如，如果您希望日期字符串格式类似“2023-01-01 00:00”，则可以使用 Spark 语法（如“yyyy-MM-dd HH:mm”），或等效的 Python 日期代码（如“%Y-%m-%d %H:%M”）来定义这样的格式。

**在任务图中添加*格式化时间戳*转换节点**

1. 打开资源面板，然后选择**格式化时间戳**将新转换添加到作业图。添加节点时选择的节点将是其父节点。

1. （可选）在**节点属性**选项卡上，输入任务图中节点的名称。如果尚未选择父节点，请从 **Node parents (父节点)** 列表中选择一个节点，用作转换的输入源。

1. 在**转换**选项卡上，输入要转换的列的名称。

1. 在**转换**选项卡上，输入要使用的**时间戳格式**模式，使用 [Spark 日期语法](https://spark.apache.org/docs/latest/sql-ref-datetime-pattern.html)或 [Python 日期代码](https://docs.python.org/3/library/datetime.html#strftime-and-strptime-format-codes)表示。

1. （可选）在**转换**选项卡上，您可以创建一个新列并通过输入新列的名称来保留原始列，而不是转换所选列。

# 创建条件路由器转换
<a name="transforms-conditional-router"></a>

 条件路由器转换允许您对传入数据应用多个条件。传入数据的每一行都通过一组筛选条件进行评估，然后处理到相应的组中。如果某行满足多个组筛选条件，则转换会将该行传递给多个组。如果某行不满足任何条件，则可以将其删除或路由到默认输出组。

 此转换类似于筛选器转换，但对想要在多个条件下测试相同输入数据的用户很有用。

**要添加条件路由器转换，请执行以下操作：**

1.  选择要执行条件路由器转换的节点。可以是源节点或其他转换。

1.  选择**操作**，然后使用搜索栏查找并选择“条件路由器”。添加**条件路由器**转换以及两个输出节点。一个输出节点为“默认组”，包含的记录不满足其他输出节点中定义的任何条件。无法编辑默认组。  
![\[屏幕截图显示了连接到源节点的条件路由器转换节点。显示输出节点是从条件路由器节点分支的。\]](http://docs.aws.amazon.com/zh_cn/glue/latest/dg/images/transform-conditional-router-node.png)

    您可以通过选择**添加组**来添加其他输出组。您可以为每个输出组命名并添加筛选条件和逻辑运算符。  
![\[屏幕截图显示了条件路由器转换选项卡，其中包含命名输出组、逻辑运算符和条件过滤器的选项。\]](http://docs.aws.amazon.com/zh_cn/glue/latest/dg/images/transform-conditional-router-tab.png)

1.  输入新名称以重命名输出组。AWS Glue Studio 会自动为您命名群组（例如，'output\$1group\$11'）。

1.  选择逻辑运算符（**AND**、**OR**），然后通过指定**键**、**运算**和**值**来添加**筛选条件**。逻辑运算符允许您实施多个筛选条件，并对指定的每个筛选条件执行逻辑运算符。

    指定键时，您可以从架构中的可用键进行选择。然后根据选择的键类型选择可用的操作。例如，如果键类型为“字符串”，则可供选择的操作是“匹配”。  
![\[屏幕截图显示了条件路由器转换选项卡，包括键、运算和值的筛选条件字段。\]](http://docs.aws.amazon.com/zh_cn/glue/latest/dg/images/transform-conditional-router-filter-condition.png)

1.  在**值**字段中输入值。选择**添加条件**以添加其他筛选条件。要移除筛选条件，请选择垃圾桶图标。

# 使用“串联列”转换来附加列
<a name="transforms-concatenate-columns"></a>

 串联转换允许使用带有可选间隔符的其他列的值来生成新的字符串列。例如，如果我们将串联的列“日期”定义为“年”、“月”和“日”（按此顺序）的串联，并以“-”作为间隔符，则会得到：


| day | month | year | date | 
| --- | --- | --- | --- | 
| 01 | 01 | 2020 | 2020-01-01 | 
| 02 | 01 | 2020 | 2020-01-02 | 
| 03 | 01 | 2020 | 2020-01-03 | 
| 04 | 01 | 2020 | 2020-01-04 | 

**要添加串联转换，请执行以下操作：**

1. 打开资源面板。然后选择“**串联列**”，将新的转换添加到作业图。添加节点时选择的节点将是其父节点。

1. （可选）在**节点属性**选项卡上，输入任务图中节点的名称。如果尚未选择父节点，请从 Node parents (父节点) 列表中选择一个节点，用作转换的输入源。

1. 在**转换**选项卡上，输入用于保存串联字符串的列的名称以及要串联的列。您检查下拉列表中各列的顺序将是使用的顺序。  
![\[屏幕截图显示了“串联”转换的“转换”选项卡。\]](http://docs.aws.amazon.com/zh_cn/glue/latest/dg/images/transforms-concatenate-transform-tab.png)

1. **间隔符 — 可选** — 输入要在串联的字段之间放置的字符串。默认无间隔符。

1. **空值 — 可选** — 输入列值为空时要使用的字符串。默认情况下，如果列的值为“NULL”或“NA”，则使用空字符串。

# 使用拆分字符串转换来分解字符串列
<a name="transforms-split-string"></a>

 拆分字符串转换允许您使用正则表达式将字符串分解为令牌数组，以定义拆分的完成方式。然后，您可以将该列保留为数组类型，或者在此之后应用**数组转列**转换，将数组值提取到顶级字段中，前提是每个令牌都有我们事先知道的含义。此外，如果令牌的顺序无关紧要（例如，一组类别），则可以使用**分解**转换为每个值生成单独的行。

 例如，您可以使用逗号作为模式拆分“类别”列，以添加一列“categories\$1arr”。


| product\$1id | categories | categories\$1arr | 
| --- | --- | --- | 
| 1 | 运动、冬季 | [运动、冬季] | 
| 2 | 花园、工具 | [花园、工具] | 
| 3 | 电子游戏 | [电子游戏] | 
| 4 | 游戏、棋盘游戏、社交 | [游戏、棋盘游戏、社交] | 

**要添加拆分字符串转换，请执行以下操作：**

1. 打开资源面板，然后选择“拆分字符串”将新转换添加到作业图。添加节点时选择的节点将是其父节点。

1. （可选）在节点属性选项卡上，输入任务图中节点的名称。如果尚未选择父节点，请从 Node parents (父节点) 列表中选择一个节点，用作转换的输入源。

1. 在**转换**选项卡上，选择要拆分的列，然后输入用于拆分字符串的模式。在大多数情况下，您可以只输入字符，除非它作为正则表达式具有特殊含义并且需要转义。需要转义的字符有：`\.[]{}()<>*+-=!?^$|` 在字符前面加一个反斜杠。例如，如果您想用点（'.'）分隔，则需要输入 `\.`。然而，逗号没有特殊含义，可以按原样指定：`,`。  
![\[屏幕截图显示了“拆分字符串”转换的“转换”选项卡。\]](http://docs.aws.amazon.com/zh_cn/glue/latest/dg/images/transforms-split-string-transform-tab.png)

1. （可选）如果要保留原始字符串列，则可以为新的数组列输入名称，这样既保留原始字符串列，又保留新的令牌化数组列。

# 使用“数组转列”转换将数组中的元素提取到顶级列中
<a name="transforms-array-to-columns"></a>

 “数组转列”转换允许将数组类型的列的部分或全部元素提取到新列中。如果数组有足够的值可供提取，则转换将尽可能多地填充新列，也可以选择提取指定位置的元素。

 例如，如果您有一个数组列“子网”，这是在 ip v4 子网上应用“拆分字符串”转换的结果，则可以将第一个和第四个位置提取到新列“first\$1octect”和“forth\$1octect”中。在本例中，转换的输出将是（请注意，最后两行的数组比预期的要短）：


| 子网 | first\$1octect | fourth\$1octect | 
| --- | --- | --- | 
| [54, 240, 197, 238] | 54 | 238 | 
| [192, 168, 0, 1] | 192 | 1 | 
| [192, 168] | 192 |  | 
| [] |  |  | 

**要添加“数组转列”转换，请执行以下操作：**

1. 打开资源面板，然后选择**数组转列**将新转换添加到作业图。添加节点时选择的节点将是其父节点。

1. （可选）在**节点属性**选项卡上，输入任务图中节点的名称。如果尚未选择父节点，请从 Node parents (父节点) 列表中选择一个节点，用作转换的输入源。

1. 在**转换**选项卡上，选择要提取的数组列，然后为提取的令牌输入新列的列表。  
![\[屏幕截图显示了“数组转列”转换的“转换”选项卡。\]](http://docs.aws.amazon.com/zh_cn/glue/latest/dg/images/transforms-array-to-columns-transform-tab.png)

1. （可选）如果您不想使用数组令牌来分配给列，则可以指定要采用的索引，这些索引将按指定的相同顺序分配给列的列表。例如，如果输出列是“column1, column2, column3”，索引 为“4, 1, 3”，则数组的第四个元素将转到第 1 列，第一个元素进入第 2 列，第三个元素进入第 3 列（如果数组短于索引号，则将设置为 NULL 值）。

# 使用“添加当前时间戳”转换
<a name="transforms-add-current-timestamp"></a>

 **添加当前时间戳**转换允许您用数据处理时间标记行。这对于审计目的或跟踪数据管道中的延迟非常有用。您可以将此新列添加为时间戳数据类型或格式化字符串。

**要添加“添加当前时间戳”转换，请执行以下操作：**

1. 打开资源面板，然后选择**添加当前时间戳**将新转换添加到作业图。添加节点时选择的节点将是其父节点。

1. （可选）在**节点属性**选项卡上，输入任务图中节点的名称。如果尚未选择父节点，请从 Node parents (父节点) 列表中选择一个节点，用作转换的输入源。  
![\[屏幕截图显示了添加当前时间戳转换的“转换”选项卡。\]](http://docs.aws.amazon.com/zh_cn/glue/latest/dg/images/transforms-add-current-timestamp-transform-tab.png)

1. （可选）在**转换**选项卡上，为新列输入自定义名称，如果您希望该列为格式化的日期字符串，则输入格式。

# 使用“将行转置为列”转换
<a name="transforms-pivot-rows-to-columns"></a>

 **将行转置为列**转换允许您通过旋转选定列上的唯一值来聚合数字列，这些列会变成新列（如果选择了多个列，则将这些值串联起来以命名新列）。这样，行就可以合并，同时拥有更多的列，每个唯一值都有部分聚合。例如，如果您有按月和国家/地区划分的销售额数据集（为了便于说明而排序）：


| 年 | 月 | country | 量 | 
| --- | --- | --- | --- | 
| 2020 | Jan | uk | 32 | 
| 2020 | Jan | de | 42 | 
| 2020 | Jan | us | 64 | 
| 2020 | Feb | uk | 67 | 
| 2020 | Feb | de | 4 | 
| 2020 | Feb | de | 7 | 
| 2020 | Feb | us | 6 | 
| 2020 | Feb | us | 12 | 
| 2020 | Jan | us | 90 | 

 如果您将 **amount** 和 **country** 列转置为聚合列，则会根据原始 **country** 列创建新的列。在下面的表中，将会创建新的 **de**、**uk** 和 **us** 列，而不是 **country** 列。


| 年 | 月 | de | uk | us | 
| --- | --- | --- | --- | --- | 
| 2020 | Jan | 42 | 32 | 64 | 
| 2020 | Jan | 11 | 67 | 18 | 
| 2021 | Jan |  |  | 90 | 

 相反，如果您想同时对月份和县进行转置，则会为这些列的值的每种组合获得一列：


| year | Jan\$1de | Jan\$1uk | Jan\$1us | Feb\$1de | Feb\$1uk | Feb\$1us | 
| --- | --- | --- | --- | --- | --- | --- | 
| 2020 | 42 | 32 | 64 | 11 | 67 | 18 | 
| 2021 |  |  | 90 |  |  |  | 

**要添加“将行转置为列”转换，请执行以下操作：**

1. 打开资源面板，然后选择**将行转置为列**将新转换添加到作业图。添加节点时选择的节点将是其父节点。

1. （可选）在**节点属性**选项卡上，输入任务图中节点的名称。如果尚未选择父节点，请从 Node parents (父节点) 列表中选择一个节点，用作转换的输入源。

1. 在**转换**选项卡上，选择要聚合以生成新列值的数值列、要应用的聚合函数以及要将其唯一值转换为新列的列。  
![\[屏幕截图显示了“将行转置为列”转换的“转换”选项卡。\]](http://docs.aws.amazon.com/zh_cn/glue/latest/dg/images/transforms-pivot-rows-to-columns-transform-tab.png)

# 使用“反转置列为行”转换
<a name="transforms-unpivot-columns-to-rows"></a>

 **反转置**转换将列转换为新列的值，为每个唯一值生成一行。它与转置相反，但请注意，它并不等效，因为它无法将聚合的具有相同值的行分隔开来，也无法将组合拆分为原始列（您可以稍后使用拆分转换来做到这一点）。例如，如果您具有以下表：


| 年 | 月 | de | uk | us | 
| --- | --- | --- | --- | --- | 
| 2020 | Jan | 42 | 32 | 64 | 
| 2020 | Feb | 11 | 67 | 18 | 
| 2021 | Jan |  |  | 90 | 

 您可以将“de”、“uk” 和“us”列反转置为值为“金额”的“国家/地区”列中，然后得到以下内容（出于说明起见，此处排序）：


| 年 | 月 | country | 量 | 
| --- | --- | --- | --- | 
| 2020 | Jan | uk | 32 | 
| 2020 | Jan | de | 42 | 
| 2020 | Jan | us | 64 | 
| 2020 | Feb | uk | 67 | 
| 2020 | Feb | de | 11 | 
| 2020 | Feb | us | 18 | 
| 2021 | Jan | us | 90 | 

 请注意，默认情况下不会生成具有空值的列（“de”和“2021 年 1 月的 uk”）。您可以启用该选项以获得：


| 年 | 月 | country | 量 | 
| --- | --- | --- | --- | 
| 2020 | Jan | uk | 32 | 
| 2020 | Jan | de | 42 | 
| 2020 | Jan | us | 64 | 
| 2020 | Feb | uk | 67 | 
| 2020 | Feb | de | 11 | 
| 2020 | Feb | us | 18 | 
| 2021 | Jan | us | 90 | 
| 2021 | Jan | de |  | 
| 2021 | Jan | uk |  | 

**要添加“反转置列为行”转换，请执行以下操作：**

1. 打开资源面板，然后选择**反转置列为行**将新转换添加到作业图。添加节点时选择的节点将是其父节点。

1. （可选）在**节点属性**选项卡上，输入任务图中节点的名称。如果尚未选择父节点，请从 Node parents (父节点) 列表中选择一个节点，用作转换的输入源。

1. 在**转换**选项卡上，输入要创建的新列，以保存选择反转置的列的名称和值。  
![\[屏幕截图显示了“反转置列为行”转换的“转换”选项卡。\]](http://docs.aws.amazon.com/zh_cn/glue/latest/dg/images/transforms-unpivot-columns-to-rows-transform-tab.png)

# 使用自动平衡处理转换来优化运行时
<a name="transforms-autobalance-processing"></a>

 **自动平衡处理**转换在工作线程之间重新分配数据，以提高性能。当数据不平衡或数据来自源时不允许对其进行足够的并行处理时，这很有用。在源代码为 GZIP 或 JDBC 的情况下，这种情况很常见。数据的再分发具有适度的性能成本，因此，如果数据已经很好地平衡，优化可能并不总是能弥补这种努力。在下面，转换使用 Apache Spark 重新分区在最适合集群容量的多个分区之间随机重新分配数据。对于高级用户，可以手动输入多个分区。此外，它还可用于通过根据指定列重新组织数据来优化分区表的写入。这会使输出文件更加合并。

****

1. 打开资源面板，然后选择**自动平衡处理**将新转换添加到作业图。添加节点时选择的节点将是其父节点。

1. （可选）在**节点属性**选项卡上，输入任务图中节点的名称。如果尚未选择父节点，请从 Node parents (父节点) 列表中选择一个节点，用作转换的输入源。

1. （可选）在**转换**选项卡上，可以输入多个分区。通常，建议您让系统决定该值，但是如果您需要控制该值，则可以调整乘数或输入特定值。如果要保存按列分区的数据，则可以选择与重新分区列相同的列。这样，它将最大限度地减少每个分区上的文件数量，并避免每个分区有多个文件，这将阻碍查询该数据的工具的性能。  
![\[屏幕截图显示了自动平衡处理转换的“转换”选项卡。\]](http://docs.aws.amazon.com/zh_cn/glue/latest/dg/images/transforms-autobalance-processing-transform-tab.png)

# 使用派生列转换合并其他列
<a name="transforms-derived-column"></a>

 **派生列**转换允许您根据数学公式或 SQL 表达式定义一个新列，您可以在其中使用数据中的其他列以及常量和文字。例如，要从 "success" 和 "count" 列中导出 "percentage" 列，可以输入 SQL 表达式："success \$1 100 / count \$1\$1 '%'"。

 示例结果：


| success | count | percentage | 
| --- | --- | --- | 
| 14 | 100 | 14% | 
| 6 | 20 | 3% | 
| 3 | 40 | 7.5% | 

**要添加派生列转换，请执行以下操作：**

1. 打开资源面板，然后选择**派生列**将新转换添加到作业图。添加节点时选择的节点将是其父节点。

1. （可选）在**节点属性**选项卡上，输入任务图中节点的名称。如果尚未选择父节点，请从 Node parents (父节点) 列表中选择一个节点，用作转换的输入源。

1. 在**转换**选项卡上，输入列名称及其内容表达式。  
![\[屏幕截图显示了“派生列”转换的“转换”选项卡。\]](http://docs.aws.amazon.com/zh_cn/glue/latest/dg/images/transforms-dervied-column-transform-tab.png)

# 使用查找转换从目录表中添加匹配数据
<a name="transforms-lookup"></a>

 当键与数据中定义的查找列匹配时，**查找**转换允许您从定义的目录表中添加列。这等效于使用作为条件匹配列在数据和查找表之间进行左外联接。

**要添加查找转换，请执行以下操作：**

1. 打开资源面板，然后选择**查找**将新转换添加到作业图。添加节点时选择的节点将是其父节点。

1. （可选）在**节点属性**选项卡上，输入任务图中节点的名称。如果尚未选择父节点，请从 Node parents (父节点) 列表中选择一个节点，用作转换的输入源。

1. 在**转换**选项卡上，输入用于执行查找的完全限定的目录表名称。例如，如果您的数据库是“mydb”，您的表是“mytable”，那么输入“mydb.mytable”。然后输入在查找表中查找匹配项的条件（如果查询键为符合式）。输入以逗号分隔的键列列表。如果一个或多个键列的名称不同，则需要定义匹配映射。

   例如，如果数据列是“user\$1id”和“region”，并且在用户表中，相应的列名为“id”和“region”，则在**要匹配的列**字段中输入：”user\$1id=id, region“。您可以执行 region=region，但不需要，因为它们是一样的。

1. 最后，输入要从查找表中匹配的行中提取的列，以将其合并到数据中。如果未找到匹配项，则这些列将设置为 NULL。
**注意**  
在**查找**转换之下，为了提高效率，它使用左联接。如果查找表具有复合键，请确保将要匹配的列设置为匹配所有键列，这样只能出现一个匹配项。否则，将匹配多个查找行，这将导致为每个匹配项添加额外的行。  
![\[屏幕截图显示了“查找”转换的“转换”选项卡。\]](http://docs.aws.amazon.com/zh_cn/glue/latest/dg/images/transforms-lookup-transform-tab.png)

# 使用“分解数组或映射到行”转换
<a name="transforms-explode-array"></a>

 **分解**转换允许您将嵌套结构中的值提取到更易于操作的单个行中。对于数组，转换将为数组的每个值生成一行，复制该行中其他列的值。对于映射，转换将为每个条目生成一行，键和值为列，再加上该行中的任何其他列。

 例如，如果我们有这个数据集，它有一个包含多个值的“类别”数组列。


| product\$1id | 类别 | 
| --- | --- | 
| 1 | [运动、冬季] | 
| 2 | [花园、工具] | 
| 3 | [电子游戏] | 
| 4 | [游戏、棋盘游戏、社交] | 
| 5 | [] | 

 如果您将“类别”列分解为具有相同名称的列，则将覆盖该列。您可以选择要包含 NULL 以获得以下内容（出于说明目的排序）：


| product\$1id | 类别 | 
| --- | --- | 
| 1 | 运动 | 
| 1 | 冬天 | 
| 2 | 花园 | 
| 2 | 工具 | 
| 3 | 电子游戏 | 
| 4 | 游戏 | 
| 4 | 棋盘游戏 | 
| 4 | 社交 | 
| 5 |  | 

**要添加“分解数组”或“映射成行”转换，请执行以下操作：**

1. 打开资源面板，然后选择**分解数组或映射到行**将新转换添加到作业图。添加节点时选择的节点将是其父节点。

1. （可选）在**节点属性**选项卡上，输入任务图中节点的名称。如果尚未选择父节点，请从 Node parents (父节点) 列表中选择一个节点，用作转换的输入源。

1. 在**转换**选项卡上，选择要分解的列（它必须是数组或地图类型）。然后，如果要分解地图，则为数组中的项目输入列的名称，或者为键和值输入列的名称。

1. （可选）在**转换**选项卡上，默认情况下，如果要分解的列为 NULL 或结构为空，则在分解的数据集中将省略该列。如果要保留该行（将新列设置为 NULL），请选中“包含 NULL”。  
![\[屏幕截图显示了“分解数组或映射到行”转换的“转换”选项卡。\]](http://docs.aws.amazon.com/zh_cn/glue/latest/dg/images/transforms-explode-array-transform-tab.png)

# 使用“记录匹配”转换调用现有的数据分类转换
<a name="transforms-record-matching"></a>

此转换调用现有的记录匹配机器学习数据分类转换。

转换根据标签对照训练过的模型评估当前数据。添加了“match\$1id”列，将每行分配给一组根据算法训练被视为等效的项目。有关更多信息，请参阅 [Record matching with Lake Formation FindMatches](https://docs.aws.amazon.com/glue/latest/dg/machine-learning.html)。

**注意**  
AWS Glue 使用的可视化作业版本必须与 AWS Glue 用于创建“记录匹配”转换的版本相匹配。

![\[屏幕截图显示转换的数据预览。\]](http://docs.aws.amazon.com/zh_cn/glue/latest/dg/images/recording-matching-transform-1.png)


**将“记录匹配”转换节点添加到作业图**

1. 打开资源面板，然后选择**记录匹配**将新转换添加到作业图。添加节点时选择的节点将是其父节点。

1. 在节点属性面板上，输入作业图中节点的名称。如果尚未选择父节点，请从 **Node parents (父节点)** 列表中选择一个节点，用作转换的输入源。

1. 在**转换**选项卡上，输入从**机器学习转换**页面获取的 ID：  
![\[屏幕截图显示了机器学习转换页面上的 ID。\]](http://docs.aws.amazon.com/zh_cn/glue/latest/dg/images/recording-matching-transform-2.png)

1. （可选）在**转换**选项卡上，可以选中添加置信度分数的选项。该模型将以额外计算为代价，将每个匹配的置信度分数作为附加列进行估计。

# 移除空行
<a name="transforms-remove-null-rows"></a>

此转换从数据集中移除所有列均为空的行。此外，您可以扩展此标准以包括空字段，从而保留至少有一列非空的行。

**将移除空行转换节点添加到作业图**

1. 打开资源面板，然后选择**移除空行**将新转换添加到作业图。添加节点时选择的节点将是其父节点。

1. 在节点属性面板上，输入作业图中节点的名称。如果尚未选择父节点，请从 **Node parents (父节点)** 列表中选择一个节点，用作转换的输入源。

1. （可选）在**转换**选项卡上，如果想要求行不为 null 而且不为空，请选中**扩展**选项，这样，就此转换而言，空字符串、数组或映射将被视为 null 字符串、数组或映射。

# 解析包含 JSON 数据的字符串列
<a name="transforms-parse-json-column"></a>

这种转换解析包含 JSON 数据的字符串列并将其转换为结构或数组列，具体取决于 JSON 是对象还是数组。或者，您可以同时保留已解析的列和原始列。

可以提供或推断 JSON 架构（对于 JSON 对象），并可选择采样。

**将解析 JSON 列转换节点添加到作业图**

1. 打开资源面板，然后选择**解析 JSON 列**将新转换添加到作业图。添加节点时选择的节点将是其父节点。

1. 在节点属性面板上，输入作业图中节点的名称。如果尚未选择父节点，请从 **Node parents (父节点)** 列表中选择一个节点，用作转换的输入源。

1. 在**转换**选项卡上，选择包含 JSON 字符串的列。

1. （可选）在**转换**选项卡上，使用 SQL 语法输入 JSON 数据所遵循的架构，例如：如果是对象，则为 "field1 STRING, field2 INT"；或者如果是数组，则为 "ARRAY<STRING>"。

   如果是数组，则需要架构；但对于对象，如果未指定架构，则将使用数据推断出架构。为了减少推断架构的影响（尤其是在大型数据集上），您可以通过输入**用于推断架构的样本比率**来避免读取整个数据两次。如果该值小于 1，则使用相应的随机样本比率来推断架构。如果数据可靠且对象在行间一致，则可以使用较小的比率（例如 0.1）来提高性能。

1. （可选）在**转换**选项卡上，如果要同时保留原始字符串列和已解析的列，则可以输入新的列名。

# 提取 JSON 路径
<a name="transforms-extract-json-path"></a>

此转换提取从 JSON 字符串列中提取新列。当您只需要几个数据元素并且不想将整个 JSON 内容导入表架构时，此转换非常有用。

**将提取 JSON 路径转换节点添加到作业图**

1. 打开资源面板，然后选择**提取 JSON 路径**将新转换添加到作业图。添加节点时选择的节点将是其父节点。

1. 在节点属性面板上，输入作业图中节点的名称。如果尚未选择父节点，请从 **Node parents (父节点)** 列表中选择一个节点，用作转换的输入源。

1. 在**转换**选项卡上，选择包含 JSON 字符串的列。输入以逗号分隔的多个 JSON 路径表达式，每个表达式都引用如何从 JSON 数组或对象中提取值。例如，如果 JSON 列包含一个属性为“prop\$11”和“prop2”的对象，则可以提取两个对象，指定它们的名称“prop\$11，prop\$12”。

   如果 JSON 字段包含特殊字符，例如，要从此 JSON `{"a. a": 1}` 中提取属性，则可以使用路径 `$['a. a']`。唯一的例外是逗号，因为它是为分隔路径而保留的。然后为每个路径输入相应的列名，用逗号分隔。

1. （可选）在**转换**选项卡上，您可以勾选提取后删除 JSON 列，当提取所需部分后不需要其余的 JSON 数据时，这是有意义的。

# 使用正则表达式提取字符串片段
<a name="transforms-regex-extractor"></a>

此转换使用正则表达式提取字符串片段并从中创建新列，如果使用正则表达式组则创建多列。

**将正则表达式提取器转换节点添加到作业图**

1. 打开资源面板，然后选择**正则表达式提取器**将新转换添加到作业图。添加节点时选择的节点将是其父节点。

1. 在节点属性面板上，输入作业图中节点的名称。如果尚未选择父节点，请从 **Node parents (父节点)** 列表中选择一个节点，用作转换的输入源。

1. 在**转换**选项卡上，输入正则表达式和需要应用正则表达式的列。然后输入用于存储匹配字符串的新列的名称。仅当源列为空时，新列才会为空；如果正则表达式不匹配，则该列将为空。

   如果正则表达式使用组，则会有一个用逗号分隔的相应列名，但是您可以通过将列名留空来跳过组。

   例如，如果您有一列“purchase\$1date”，其中包含同时使用长和短 ISO 日期格式的字符串，则需要提取年、月、日和小时（如果有）。请注意：小时组是可选的，否则在不可用的行中，所有提取的组都将是空字符串（因为正则表达式不匹配）。在这种情况下，我们不希望该组将时间设为可选，而是将内部时间设为可选；因此我们将名称留空并且不会被提取（该组将包含 T 字符）。  
![\[屏幕截图显示了为正则表达式提取器配置正则表达式。\]](http://docs.aws.amazon.com/zh_cn/glue/latest/dg/images/regex-extractor-1.png)

   最终呈现数据预览：  
![\[屏幕截图显示了为正则表达式提取器配置数据预览。\]](http://docs.aws.amazon.com/zh_cn/glue/latest/dg/images/regex-extractor-2.png)

# 创建自定义转换
<a name="transforms-custom"></a>

如果需要对数据执行更复杂的转换，或者希望将数据属性键添加到数据集，则可以为您的任务图添加 **Custom code (自定义代码)** 转换。自定义代码节点允许您输入执行转换的脚本。

使用自定义代码时，必须使用架构编辑器来指示通过自定义代码对输出所做的更改。编辑架构时，您可以执行以下操作：
+ 添加或删除数据属性键
+ 更改数据属性键的数据类型
+ 更改数据属性键的名称。
+ 重构嵌套属性键

您必须使用 *SelectFromCollection* 转换，从自定义转换节点的结果中选择单个 `DynamicFrame`，然后将输出发送到目标位置。

使用以下任务，将自定义转换节点添加到任务图。

## 将自定义代码转换节点添加到任务图
<a name="transforms-custom-addnode"></a>

**将自定义转换节点添加到任务图**

1. （可选）打开资源面板，然后选择**自定义转换**将自定义转换添加到作业图。

1. 在 **Node properties (节点属性)** 选项卡上，输入任务图中节点的名称。如果尚未选择父节点，或者您希望为自定义转换选择多个输入，请从 **Node parents (父节点)** 列表中选择一个节点，用作转换的输入源。

## 输入自定义转换节点的代码
<a name="transforms-custom-addcode"></a>

您可以将代码输入或复制到输入字段。任务使用此代码执行数据转换。您可以以 Python 或 Scala 提供代码片段。该代码应采用一个或多个 `DynamicFrames` 作为输入，并返回 `DynamicFrames`。

**输入自定义转换节点的脚本**

1. 在任务图中选择了自定义变换节点后，选择 **Transform (转换)** 选项卡。

1. 在标题 **Code block (代码数据块)** 下的文本输入字段中，粘贴或输入转换节点。您使用的代码必须与 **Job details (任务详细信息)** 选项卡上为任务指定的语言匹配。

   当引用代码中的输入节点时，AWS Glue Studio 会命名根据创建顺序返回的 `DynamicFrames` 任务图节点。在代码中使用以下命名方法之一：
   + 经典代码生成 – 使用功能名称引用任务图中的节点。
     + 数据源节点：`DataSource0`、`DataSource1`、`DataSource2` 等。
     + 转换节点：`Transform0`、`Transform1`、`Transform2` 等。
   + 新代码生成 – 使用节点的 **Node properties**（节点属性）选项卡上指定的名称，并附加“`_node1`”、“`_node2`”等。例如，`S3bucket_node1`、`ApplyMapping_node2`、`S3bucket_node2`、`MyCustomNodeName_node1`。

   有关新代码生成器的更多信息，请参阅 [脚本代码生成](job-editor-features.md#code-gen)。

以下示例显示了要在代码框中输入的代码的格式：

------
#### [ Python ]

下面的示例采用收到的第一个 `DynamicFrame`，将其转换为 `DataFrame` 以应用本地筛选方法（仅保留拥有超过 1000 票的记录），然后在返回前将其转换回 `DynamicFrame`。

```
def FilterHighVoteCounts (glueContext, dfc) -> DynamicFrameCollection:
    df = dfc.select(list(dfc.keys())[0]).toDF()
    df_filtered = df.filter(df["vote_count"] > 1000)
    dyf_filtered = DynamicFrame.fromDF(df_filtered, glueContext, "filter_votes")
    return(DynamicFrameCollection({"CustomTransform0": dyf_filtered}, glueContext))
```

------
#### [ Scala ]

下面的示例采用收到的第一个 `DynamicFrame`，将其转换为 `DataFrame` 以应用本地筛选方法（仅保留拥有超过 1000 票的记录），然后在返回前将其转换回 `DynamicFrame`。

```
object FilterHighVoteCounts {
  def execute(glueContext : GlueContext, input : Seq[DynamicFrame]) : Seq[DynamicFrame] = {
    val frame = input(0).toDF()
    val filtered = DynamicFrame(frame.filter(frame("vote_count") > 1000), glueContext)
    Seq(filtered)
  }
}
```

------

## 编辑自定义转换节点的架构
<a name="transforms-custom-editschema"></a>

使用自定义转换节点时，AWS Glue Studio 无法自动推断由转换创建的输出架构。您可以使用架构编辑器描述由自定义转换代码实现的架构更改。

自定义代码节点可以有任意数量的父节点，每个节点都提供 `DynamicFrame` 作为自定义代码的输入。自定义代码节点会返回 `DynamicFrames`。用作输入的每个 `DynamicFrame` 都具有关联架构。您必须添加架构，描述自定义代码节点返回的每个 `DynamicFrame`。

**注意**  
 当您在自定义转换上设置自己的架构时，AWS Glue Studio 不会沿用上一个节点中的架构。要更新架构，请选择“Custom transform node”（自定义转换节点），然后选择“Data preview”（数据预览）选项卡。生成预览后，选择“Use Preview Schema”（使用预览架构）。该架构随后将会替换为使用预览数据的架构。

**编辑自定义转换节点的架构**

1. 在任务图中选择自定义转换节点后，在节点详细信息面板中，选择 **Output schema (输出架构)** 选项卡。

1. 选择 **Edit (编辑)** 以更改架构。

   如果您有嵌套的数据属性键（如数组或对象），则可以选择 **Expand-Rows (展开行)** 图标（![\[\]](http://docs.aws.amazon.com/zh_cn/glue/latest/dg/images/expand-rows-icon.png)），展开子数据属性键的列表。选择此图标后，它将更改为 **Collapse-Rows (折叠行)** 图标（![\[\]](http://docs.aws.amazon.com/zh_cn/glue/latest/dg/images/collapse-rows-icon.png)），您可以选择折叠子属性键列表。

1. 使用页面右侧部分中的以下操作修改架构：
   + 要重命名属性键，请将光标放在 **Key (键)** 文本框，然后输入新名称。
   + 要更改属性键的数据类型，请使用列表为属性键选择新数据类型。
   + 要为架构添加新的顶级属性，请选择 **Cancel (取消)** 按钮左侧的 **Overflow (溢出)**（![\[\]](http://docs.aws.amazon.com/zh_cn/glue/latest/dg/images/edit-schema-actions-button.png)）图标，然后选择 **Add root key (添加根键)**。
   + 要将子属性键添加到架构，请选择与父键关联的 **Add-Key (添加键)** 图标 ![\[\]](http://docs.aws.amazon.com/zh_cn/glue/latest/dg/images/filter-add-icon.png)。输入子键的名称，然后选择数据类型。
   + 要从架构中删除属性键，请选择键名称最右侧的 **Remove (删除)** 图标（![\[\]](http://docs.aws.amazon.com/zh_cn/glue/latest/dg/images/delete-icon-black.png)）。

1. 如果您的自定义转换代码使用多个 `DynamicFrames`，您可以添加额外的输出架构。
   + 要添加新的空架构，请选择 **Overflow (溢出)**（![\[\]](http://docs.aws.amazon.com/zh_cn/glue/latest/dg/images/edit-schema-actions-button.png)）图标，然后选择 **Add output schema (添加输出架构)**。
   + 要将现有架构复制到新的输出架构，请确保要复制的架构在架构选择器中显示。选择 **Overflow (溢出)**（![\[\]](http://docs.aws.amazon.com/zh_cn/glue/latest/dg/images/edit-schema-actions-button.png)）图标，然后选择 **Duplicate (重复)**。

   要删除输出架构，请确保要复制的架构在架构选择器中显示。选择 **Overflow (溢出)**（![\[\]](http://docs.aws.amazon.com/zh_cn/glue/latest/dg/images/edit-schema-actions-button.png)）图标，然后选择 **Delete (删除)**。

1. 将新的根键添加到新架构或编辑重复的键。

1. 修改输出架构时，请选择 **Apply (应用)** 保存您的更改并退出架构编辑器。

   如果您不想保存更改，请选择 **Cancel (取消)** 按钮。

## 配置自定义转换输出
<a name="transforms-custom-output"></a>

自定义代码转换会返回 `DynamicFrames`，即使结果集中只有一个 `DynamicFrame`。

**处理自定义转换节点的输出**

1. 添加 *SelectFromCollection* 转换节点，该节点将自定义转换节点作为其父节点。更新此转换以指示要使用的数据集。请参阅[使用 SelectFromCollection 选择要保留的数据集](transforms-configure-select-collection.md)了解更多信息。

1. 如果要使用由自定义转换节点生成的其他 `DynamicFrames`，则将其他 *SelectFromCollection* 转换添加任务图。

   考虑以下情况：添加自定义转换节点以将航班数据集拆分为多个数据集，但在每个输出架构中复制某些标识属性键，如航班日期或航班号。为每个输出架构添加 *SelectFromCollection* 转换节点，以自定义转换节点为父节点。

1. （可选）然后，您可以使用每个 *SelectFromCollection* 转换节点作为任务中其他节点的输入，或作为数据目标节点的父节点。