

# 在 AWS Glue Studio 中启动视觉 ETL 作业
<a name="edit-nodes-chapter"></a>

您可以使用 AWS Glue Studio 中的简单视觉界面，创建您的 ETL 任务。您使用 **Jobs (任务)** 页面创建新任务。您还可以使用脚本编辑器或笔记本直接处理 AWS Glue Studio ETL 任务脚本中的代码。

在 **Jobs (任务)** 页面上，您可以看到您使用 AWS Glue Studio 或 AWS Glue 创建的所有任务。您可以在此页面上查看、管理和运行您的任务。

 另请参阅[博客教程](https://aws.amazon.com/blogs/big-data/making-etl-easier-with-aws-glue-studio/)中的另一个示例，说明了如何使用 AWS Glue Studio 创建 ETL作业。

## 在 AWS Glue Studio 中启动作业
<a name="create-jobs-start"></a>

 AWS Glue 允许您通过可视化界面、交互式代码笔记本或脚本编辑器创建作业。您可以通过单击任一选项来启动作业，也可以根据示例作业创建新作业。

 示例作业使用您选择的工具创建作业。例如，示例作业允许您创建将 CSV 文件联接到目录表中的可视化 ETL 作业，使用 pandas 时在互式代码笔记本中使用 AWS Glue for Ray 或 AWS Glue for Spark 创建作业，或者使用 SparkSQL 在交互式代码笔记本中创建作业。

### 在 AWS Glue Studio 中从头开始创建作业
<a name="create-jobs-start-from-scratch"></a>

1. 登录 AWS 管理控制台，然后通过以下网址打开 AWS Glue Studio 控制台：[https://console.aws.amazon.com/gluestudio/](https://console.aws.amazon.com/gluestudio/)。

1.  在导航窗格中，选择 **ETL 作业**。

1.  在**创建作业**部分中，为您的作业选择一个配置选项。  
![\[\]](http://docs.aws.amazon.com/zh_cn/glue/latest/dg/images/sample-jobs.png)

    用于从头开始创建作业的选项：
   +  **Visual ETL** - 以数据流为重点的可视化界面中编写 
   +  **使用交互代码笔记本编写** - 基于 Jupyter Notebooks 的笔记本界面中以交互方式编写作业 

      选择此选项后，在创建笔记本创作会话之前，必须提供附加信息。有关如何指定此信息的详细信息，请参阅 [在 AWS Glue Studio 中开启笔记本](notebook-getting-started.md)。
   + **使用脚本编辑器编写代码** – 对于熟悉编程和编写 ETL 脚本的用户，请选择此选项，创建新的 Spark ETL 任务。选择引擎（Python shell、Ray、Spark（Python）或 Spark（Scala）。然后，选择**重新开始**或**上传脚本**，从本地文件上传现有脚本。如果您选择使用脚本编辑器，则无法使用可视化任务编辑器来设计或编辑任务。

     Spark 任务会在由 AWS Glue 托管的 Apache Spark 环境中执行。默认情况下，新脚本以 Python 编码。要编写新的 Scala 脚本，请参阅[在 AWS Glue Studio 中创建和编辑 Scala 脚本](edit-nodes-script.md#edit-job-scala-script)。

### 在 AWS Glue Studio 中利用示例作业创建作业
<a name="create-jobs-start-from-example-job"></a>

 您可以选择从示例作业创建作业。在**示例作业**部分，选择一个示例作业，然后选择**创建示例作业**。使用其中一个选项创建示例作业提供了一个可供您使用的快速模板。

1. 登录 AWS 管理控制台，然后通过以下网址打开 AWS Glue Studio 控制台：[https://console.aws.amazon.com/gluestudio/](https://console.aws.amazon.com/gluestudio/)。

1.  在导航窗格中，选择 **ETL 作业**。

1.  选择一个选项，从示例作业创建作业：
   +  **用于联接多个源的 Visual ETL 作业** - 读取三个 CSV 文件，合并数据，更改数据类型，然后将数据写入 Amazon S3 并对其进行编目以供日后查询。
   +  **使用 Pandas 的 Spark 笔记本** - 使用广受欢迎的 Pandas 框架与 Spark 相结合，探索和可视化数据。
   +  **使用 SQL 的 Spark 笔记本** - 使用 SQL 快速开始使用 Apache Spark。通过 AWS Glue Data Catalog 访问数据，并使用熟悉的命令对其进行转换。

1. 选择**创建示例作业**。

# 任务编辑器功能
<a name="job-editor-features"></a>

任务编辑器提供以下功能，用于创建和编辑任务。
+ 任务的可视图，每个任务任务都有一个节点：用于读取数据的数据源节点；用于修改数据的转换节点；用于写入数据的数据目标节点。

  您可以查看和配置任务图中每个节点的属性。您还可以查看任务图中每个节点的架构和示例数据。这些功能可帮助您验证任务是否正在以正确的方式修改和转换数据，而无需运行任务。
+ Script viewing and editing (脚本查看和编辑) 选项卡，您可以在其中修改为任务生成的代码。
+ Job details (任务详细信息) 选项卡，您可以在其中配置各种设置，自定义 AWS Glue ETL 任务的运行环境。
+ Runs (运行) 选项卡，您可以在其中查看任务的当前运行和上一次运行，查看任务运行的状态，以及访问任务运行的日志。
+ “数据质量”选项卡，您可以在其中将数据质量规则应用于您的作业。
+ Schedules (计划) 选项卡，您可以在其中配置任务的开始时间，或设置定期任务运行。
+ “版本控制”选项卡，您可以在其中配置 Git 服务以用于您的作业。

## 在可视任务编辑器中使用架构预览
<a name="schema-previews"></a>

创建或编辑任务时，您可以使用 **Output schema (输出架构)** 选项卡查看数据的架构。

在查看架构之前，任务编辑器需要数据源的访问权限。您可以在编辑器的 Job details (任务详细信息) 选项卡上或者节点的 **Output schema (输出架构)** 选项卡上指定 IAM 角色。如果 IAM 角色具有数据源的所有必要访问权限，您可以在节点的 **Output schema (输出架构)** 选项卡上查看架构。

## 在可视任务编辑器中使用数据预览
<a name="data-previews"></a>



[![AWS Videos](http://img.youtube.com/vi/https://www.youtube.com/embed/EqmljEWlp0c/0.jpg)](http://www.youtube.com/watch?v=https://www.youtube.com/embed/EqmljEWlp0c)




数据预览有助于您使用数据样本来创建和测试任务，而无需重复运行作业。借助数据预览，您可以：
+ 测试 IAM 角色以确保您有权访问您的数据来源或数据目标。
+ 检查转换功能是否在以预期的方式修改数据。例如，如果您使用筛选条件转换，则可以确保筛选条件正在选择合适的数据子集。
+ 检查数据。如果数据集包含具有多种类型值的列，则数据预览会显示这些列的元组列表。每个元组都包含数据类型及其值。

**注意**  
 如果使用数据预览会话和自定义 SQL 或自定义代码节点，则数据预览会话将按原样对整个数据集执行 SQL 或代码块。

 创建或编辑作业时，您可以使用作业画布下方的**数据预览**选项卡查看数据示例。如果作业中已经配置了该角色或账户中已设置了默认的 IAM 角色，则将自动启动新的数据预览会话。如果之前未配置过任何角色，则可以选择该角色以启动会话。

**注意**  
 您为数据预览会话选择的角色也将用于该作业。



 您可以单击信息图标来查看会话的状态和进度，以及会话的详细信息。

 会话准备就绪后，AWS Glue Studio 将加载所选节点的数据。您可以在加载过程中查看**完成百分比**。

![\[屏幕截图显示了已经启动的节点的“数据预览”选项卡。\]](http://docs.aws.amazon.com/zh_cn/glue/latest/dg/images/data-preview-progress.png)


 在编写可视化作业过程中，当您在**输出 Schema** 选项卡中切换**从会话推断 Schema** 时，AWS Glue Studio 将自动更新所选节点的 Schema。

![\[屏幕截图显示了已经启动的节点的“数据预览”选项卡。\]](http://docs.aws.amazon.com/zh_cn/glue/latest/dg/images/data-preview-output-schema.png)


 配置数据预览首选项：

选择设置图标（齿轮符号）以配置数据预览的首选项。这些设置适用于任务图中的所有节点。您可以：
+ 选择此选项以将文本换行。此选项将默认启用
+ 更改行数（默认为 200） 
+ 选择一个 IAM 角色或根据需要创建一个 IAM 角色
+ 选择此选项以在编写作业时自动启动新会话。这将在编写作业时预置新的交互式会话。**此设置适用于账户级别。**设置完成后，在编辑任何作业时，它将适用于账户中的所有用户。
+ 选择自动推断 Schema。系统将自动推断所选节点的输出 Schema
+ 选择此选项以自动导入 AWS Glue 库。此功能非常实用，因为可以在添加需要重新启动会话的新转换时防止数据预览重新启动新会话

 其他功能包括：
+ 选择 **Previewing x of y fields (预览 y 个字段中的 x 个字段)** 按钮，选择要预览的列（字段）。您使用默认设置预览数据时，任务编辑器会显示数据集的前 5 列。您可以更改此选项以显示全部或不显示（不推荐）。
+ 水平和垂直滚动浏览数据预览窗口。
+ 使用最大化按钮展开“数据预览”选项卡展以叠加任务图，以便更好地查看数据和数据结构。同样，使用最小化按钮最小化“数据预览”选项卡。您也可以抓住手柄窗格并向上拖动以展开**数据预览**选项卡。  
![\[屏幕截图显示了突出显示最小化和最大化按钮的数据预览窗格，以及可用于垂直扩展数据预览窗格的手柄窗格。\]](http://docs.aws.amazon.com/zh_cn/glue/latest/dg/images/data-preview-maximize-handle.png)
+ 使用**结束会话**停止数据预览。停止会话后，您可以选择新的 IAM 角色，并设置其他设置（例如开启或关闭设置）以自动启动新会话、推断架构或导入 AWS Glue 库，然后重新启动会话。

## 使用数据预览时的限制
<a name="data-preview-limits"></a>

使用数据预览时，您可能会遇到以下限制。
+ 您首次选择 Data preview (数据预览) 选项卡时，您必须选择 IAM 角色。此角色必须有权访问创建数据预览所需的数据和其他资源。
+ 提供 IAM 角色后，需要一段时间才能查看数据。对于数据少于 1GB 的数据集，可能最多需要一分钟。如果您拥有较大的数据集，则应使用分区来缩短加载时间。直接从 Amazon S3 加载数据可以实现更出色的性能。
+ 如果您拥有非常大的数据集，并且查询用于数据预览的数据需要 15 分钟以上，则请求将超时。数据预览有 30 分钟的空闲超时。要缓解此情况，请减小数据集大小以使用数据预览。
+ 默认情况下，您可以查看“数据预览”选项卡中的前 50 列。如果列没有数据值，您将收到一条消息，指明没有要显示的数据。您可以增加采样的行数，也可以选择不同的列来查看数据值。
+ 数据预览当前不支持流式处理数据源或使用自定义连接器的数据源。
+ 一个节点上的错误会影响整个任务。如果任何一个节点在数据预览中出现错误，则该错误将在所有节点上显示，直到您更正。
+ 如果更改任务的数据源，您可能需要更新该数据源的子节点以匹配新架构。例如，如果您有用于修改列的 ApplyMapping 节点，并且该列不存在于替换数据源中，您需要更新 ApplyMapture 转换节点。
+ 如果您查看 SQL 查询转换节点的 Data preview (数据预览) 选项卡，并且 SQL 查询使用不正确的字段名称，则 Data preview (数据预览) 选项卡将显示错误。

## 脚本代码生成
<a name="code-gen"></a>

使用可视化编辑器创建任务时，将自动为您生成 ETL 代码。AWS Glue Studio 会创建功能完整的任务脚本，并将其保存在 Amazon S3 位置。

AWS Glue Studio 生成的代码有两种形式：原始版本，即经典版本，以及更新的精简版本。预设情况下，会使用新的代码生成器创建任务脚本。选择 **Generate classic script**（生成经典脚本）切换按钮，就可以使用 **Script**（脚本）选项卡上的经典代码生成器生成任务脚本。

生成的新版本代码中的一些差异包括：
+ 大型的注释数据块将不再添加到脚本中
+ 代码中的输出结构将使用您在可视化编辑器中指定的节点名称。在类脚本中，输出结构将简单地命名为 `DataSource0`、`DataSource1`、`Transform0`、`Transform1`、`DataSink0`、`DataSink1` 等。
+ 长命令将拆分为多行，以免滚动页面才能查看整条命令。

AWS Glue Studio 中的新功能需要新版本的代码生成，并且不适用于经典代码脚本。尝试运行这些任务时，系统会提示您更新。

# 使用 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* 转换节点作为任务中其他节点的输入，或作为数据目标节点的父节点。

# 使用自定义视觉转换来转换数据
<a name="custom-visual-transform"></a>

 可通过自定义视觉转换创建转换并使其可用于 AWS Glue Studio 作业。自定义视觉转换可以让可能不熟悉编码的 ETL 开发人员能够使用 AWS Glue Studio 界面搜索和使用不断增长的转换库。

 您可以创建自定义视觉转换，然后将其上传到 Amazon S3，以便可通过 AWS Glue Studio 中的可视化编辑器使用来处理这些作业。

**Topics**
+ [开始使用自定义视觉转换](custom-visual-transform-getting-started.md)
+ [步骤 1：创建 JSON 配置文件](custom-visual-transform-json-config-file.md)
+ [步骤 2：实施转换逻辑](custom-visual-transform-implementation.md)
+ [步骤 3：对 AWS Glue Studio 中的自定义视觉转换进行验证和故障排除](custom-visual-transform-validation.md)
+ [步骤 4：根据需要更新自定义视觉转换](custom-visual-transform-updating-transforms.md)
+ [步骤 5。在 AWS Glue Studio 中使用自定义视觉转换](custom-visual-transform-create-gs.md)
+ [用法示例](custom-visual-transform-example-json.md)
+ [自定义可视化脚本的示例](custom-visual-transform-example-scripts.md)
+ [视频](#custom-visual-transform-video)

# 开始使用自定义视觉转换
<a name="custom-visual-transform-getting-started"></a>

 要创建自定义视觉转换，请执行以下步骤。
+  步骤 1：创建 JSON 配置文件 
+  步骤 2：实施转换逻辑 
+  步骤 3：验证自定义视觉转换 
+  步骤 4：根据需要更新自定义视觉转换 
+  步骤 5。在 AWS Glue Studio 中使用自定义视觉转换 

 首先设置 Amazon S3 存储桶，然后继续执行 **Step 1（步骤 1）。Create a JSON config file**（创建 JSON 配置文件）。

## 先决条件
<a name="custom-visual-transform-prerequisites"></a>

 客户提供的转换保存在客户 AWS 账户中。该账户是这些转换的所有者，因此拥有查看（搜索和使用）、编辑或删除这些转换的所有权限。

 要在 AWS Glue Studio 中使用自定义转换，您需要在该 AWS 账户中创建两个文件并将其上传到 Amazon S3 资产存储桶：
+  **Python 文件** — 包含转换函数 
+  **JSON 文件** — 描述了转换。这也称作定义转换所需的配置文件。

 要将文件配对在一起，请对两者使用相同的名称。例如：
+  myTransform.json 
+  myTransform.py 

 或者，您可以通过提供包含该图标的 **SVG 文件**来为自定义视觉转换指定一个自定义图标。要将文件配对在一起，请对图标使用相同的名称：
+  myTransform.svg 

 AWS Glue Studio 将使用它们各自的文件名自动匹配它们。对于任何现有模块，文件名不能相同。

## 转换文件名的建议命名惯例
<a name="custom-visual-transform-recommended-transform-file-name"></a>

 AWS Glue Studio 会将您的文件作为模块（例如，`import myTransform`）导入作业脚本。因此，您的文件名必须遵循为 python 变量名（标识符）设置的相同命名规则。具体而言，它们必须以字母或下划线开头，且完全由字母、数字和/或下划线组成。

**注意**  
 确保您的转换文件名与现有的已加载 python 模块（例如，`sys, array, copy` 等）不冲突，以避免意外的运行时问题。

## 设置 Amazon S3 存储桶
<a name="custom-visual-transform-setting-up-s3"></a>

 您创建的转换存储在 Amazon S3 中，归您的 AWS 账户所有。您只需将文件（json 和 py）上传到当前存储所有作业脚本的 Amazon S3 资产文件夹（例如，`s3://aws-glue-assets-<accountid>-<region>/transforms`），即可创建新的自定义视觉转换。如果使用自定义图标，也请将其上传。默认情况下，AWS Glue Studio 将读取同一 S3 存储桶中的 /transforms 文件夹中的所有 .json 文件。

# 步骤 1：创建 JSON 配置文件
<a name="custom-visual-transform-json-config-file"></a>

 需要一个 JSON 配置文件来定义和描述您的自定义视觉转换。配置文件的架构如下所示。

## JSON 文件结构
<a name="custom-visual-transform-json-file-structure"></a>

 **字段** 
+  `name: string` —（必需）用于标识转换的转换系统名称。遵循为 python 变量名（标识符）设置的相同命名规则。具体而言，它们必须以字母或下划线开头，且完全由字母、数字和/或下划线组成。
+  `displayName: string` —（可选）显示在 AWS Glue Studio 可视化作业编辑器中的转换名称。如果未指定 `displayName`，则将 `name` 用作 AWS Glue Studio 中的转换名称。
+  `description: string` —（可选）转换描述显示在 AWS Glue Studio 中且可搜索。
+  `functionName: string` —（必需）Python 函数名称用于标识要在 Python 脚本中调用的函数。
+  `path: string` —（可选）Python 源文件的完整 Amazon S3 路径。如果未指定，则 AWS Glue 会通过文件名匹配将 .json 和.py 文件配对在一起。例如，JSON 文件的名称 `myTransform.json` 将与位于同一 Amazon S3 位置的 Python 文件 `myTransform.py` 配对。
+  `parameters: Array of TransformParameter object` —（可选）在 AWS Glue Studio 可视化编辑器中配置参数时要显示的参数列表。

<a name="transformparameter-fields"></a> **TransformParameter 字段** 
+  `name: string` —（必需）要在作业脚本中作为命名参数传递给 python 函数的参数名称。遵循为 python 变量名（标识符）设置的相同命名规则。具体而言，它们必须以字母或下划线开头，且完全由字母、数字和/或下划线组成。
+  `displayName: string` —（可选）显示在 AWS Glue Studio 可视化作业编辑器中的转换名称。如果未指定 `displayName`，则将 `name` 用作 AWS Glue Studio 中的转换名称。
+  `type: string` —（必需）接受常见 Python 数据类型的参数类型。有效值：'str' \$1 'int' \$1 'float' \$1 'list' \$1 'bool'。
+  `isOptional: boolean` —（可选）确定该参数是否为可选参数。默认情况下，所有参数都是必需的。
+  `description: string` —（可选）AWS Glue Studio 中会显示描述，以帮助用户配置转换参数。
+  `validationType: string` —（可选）定义验证此参数的方式。目前，仅支持正则表达式。默认情况下，验证类型设置为 `RegularExpression`。
+  `validationRule: string` —（可选）用于在 `validationType` 设置为 `RegularExpression` 时在提交前验证表单输入的正则表达式。正则表达式语法必须符合 [RegExp Ecmascript 规范](https://tc39.es/ecma262/multipage/text-processing.html#sec-regexp-regular-expression-objects)。
+  `validationMessage: string` —（可选）验证失败时显示的消息。
+  `listOptions: An array of TransformParameterListOption object` 或 `string` 或字符串值“column”—（可选）显示在“选择”或“多选”UI 控件中的选项。接受以逗号分隔的值列表或类型为 `TransformParameterListOption` 的强类型 JSON 对象。它还可以通过指定字符串值“column”来动态填充父节点架构中的列列表。
+  `listType: string` —（可选）定义类型 = 'list' 时的选项类型。有效值：'str' \$1 'int' \$1 'float' \$1 'list' \$1 'bool'。接受常见 Python 数据类型的参数类型。

 **转换参数列表选项字段** 
+  `value: string | int | float | bool` —（必需）选项值。
+  `label: string` —（可选）显示在选择下拉列表中的选项标签。

## AWS Glue Studio 中的转换参数
<a name="custom-visual-transform-parameters"></a>

 默认情况下，除非在 .json 文件中标记为 `isOptional`，否则参数为必填。在 AWS Glue Studio 中，参数显示在 **Transform**（转换）选项卡中。该示例显示了用户定义的参数，例如电子邮件地址、电话号码、您的年龄、您的性别和您的原籍国。

![\[屏幕截图显示了一个选定的自定义视觉转换以及一个“Transform”（转换）选项卡，其中包含用户定义的参数。\]](http://docs.aws.amazon.com/zh_cn/glue/latest/dg/images/dynamic-transform-parameters.png)


 通过在 json 文件中使用正则表达式指定 `validationRule` 参数并在 `validationMessage` 中指定验证消息，在 AWS Glue Studio 中强制执行某些验证。

```
      "validationRule": "^\\(?(\\d{3})\\)?[- ]?(\\d{3})[- ]?(\\d{4})$",
      "validationMessage": "Please enter a valid US number"
```

**注意**  
 由于验证是在浏览器中进行的，因此您的正则表达式语法必须符合 [RegExp Ecmascript 规范](https://tc39.es/ecma262/multipage/text-processing.html#sec-regexp-regular-expression-objects)。这些正则表达式不支持 Python 语法。

 添加验证可以防止用户保存用户输入不正确的作业。AWS Glue Studio 将显示此示例中所示的验证消息：

![\[屏幕截图显示了一个自定义视觉转换参数以及一个验证错误消息：Please enter a valid email address（请输入一个有效的电子邮件地址）。\]](http://docs.aws.amazon.com/zh_cn/glue/latest/dg/images/dynamic-transform-validation-message.png)


 参数会根据参数配置显示在 AWS Glue Studio 中。
+  当 `type` 为以下任一项时：`str`、`int` 或 `float`，将显示一个文本输入字段。例如，屏幕截图显示了“Email Address”和“Your age”参数的输入字段。  
![\[屏幕截图显示了一个自定义视觉转换参数以及文本输入字段。\]](http://docs.aws.amazon.com/zh_cn/glue/latest/dg/images/dynamic-transform-email-address.png)  
![\[屏幕截图显示了一个自定义视觉转换参数以及文本输入字段。\]](http://docs.aws.amazon.com/zh_cn/glue/latest/dg/images/dynamic-transform-your-age.png)
+  当 `type` 为 `bool` 时，将显示一个复选框。  
![\[屏幕截图显示了一个自定义视觉转换参数以及文本输入字段。\]](http://docs.aws.amazon.com/zh_cn/glue/latest/dg/images/dynamic-transform-bool.png)
+  当 `type` 为 `str` 且提供了 `listOptions` 时，将显示一个单选列表。  
![\[屏幕截图显示了一个自定义视觉转换参数以及一个单选下拉列表。\]](http://docs.aws.amazon.com/zh_cn/glue/latest/dg/images/dynamic-transform-single-list.png)
+  当 `type` 为 `list` 且提供了 `listOptions` 和 `listType` 时，将显示一个多选列表。  
![\[屏幕截图显示了带有下拉列表的自定义视觉转换参数。\]](http://docs.aws.amazon.com/zh_cn/glue/latest/dg/images/dynamic-transform-list-options.png)

### 将列选择器显示为参数
<a name="custom-visual-transform-parameters-column-selector"></a>

 如果配置要求用户从架构中选择一列，则可以显示列选择器，这样用户就无需键入列名。通过将 `listOptions` 字段设置为“column”，AWS Glue Studio 可以根据父节点输出架构动态显示列选择器。AWS Glue Studio 可以显示单列或多列选择器。

 以下示例使用架构：

![\[屏幕截图显示了一个示例输出架构。\]](http://docs.aws.amazon.com/zh_cn/glue/latest/dg/images/custom-visual-transform-example-schema.png)


**要将自定义视觉转换参数定义为显示单列，请执行以下操作：**

1.  在您的 JSON 文件中，将 `parameters` 对象的 `listOptions` 值设置为“column”。这允许用户从 AWS Glue Studio 中的选择列表中选择一列。  
![\[屏幕截图显示了一个示例 JSON 文件，其中 listOptions 参数设置为“column”，生成的用户界面显示在 AWS Glue Studio 中。\]](http://docs.aws.amazon.com/zh_cn/glue/latest/dg/images/custom-visual-transform-example-listoptions-column.png)

1.  您也可以将参数定义为以下值，从而允许选择多列：
   +  `listOptions: "column"` 
   +  `type: "list"`   
![\[屏幕截图显示了一个示例 JSON 文件，其中 listOptions 参数设置为“column”，类型设置为“list”，生成的用户界面显示在 AWS Glue Studio 中。\]](http://docs.aws.amazon.com/zh_cn/glue/latest/dg/images/custom-visual-transform-example-listoptions-column-type-list.png)

# 步骤 2：实施转换逻辑
<a name="custom-visual-transform-implementation"></a>

**注意**  
 自定义视觉转换仅支持 Python 脚本。不支持 Scala。

 要添加实现 .json 配置文件定义的函数的代码，建议将 Python 文件放在与 .json 文件相同的位置，名称相同但扩展名为“.py”。AWS Glue Studio 自动将 .json 和 .py 文件配对，因此您无需在配置文件中指定 Python 文件的路径。

 在 Python 文件中，添加已声明的函数，配置命名参数，并将其注册到 `DynamicFrame` 中使用。以下是 Python 文件的示例：

```
from awsglue import DynamicFrame

# self refers to the DynamicFrame to transform, 
# the parameter names must match the ones defined in the config
# if it's optional, need to provide a default value
def myTransform(self, email, phone, age=None, gender="", 
                      country="", promotion=False):
   resulting_dynf = # do some transformation on self 
   return resulting_dynf
   
DynamicFrame.myTransform = myTransform
```

 建议使用 AWS Glue 笔记本作为开发和测试 python 代码的最快方法。请参阅[开始在 AWS Glue Studio 中使用笔记本](https://docs.aws.amazon.com/glue/latest/ug/notebook-getting-started.html)。

 为了说明如何实现转换逻辑，以下示例中的自定义视觉转换是一种转换，用于过滤传入数据，仅保留与美国特定州相关的数据。.json 文件包含作为 `custom_filter_state` 的 `functionName` 的参数和两个参数（类型为 “str”的“state”和“colName”）。

 示例配置 .json 文件是：

```
{
"name": "custom_filter_state",
"displayName": "Filter State",
"description": "A simple example to filter the data to keep only the state indicated.",
"functionName": "custom_filter_state",
"parameters": [
   {
    "name": "colName",
    "displayName": "Column name",
    "type": "str",
    "description": "Name of the column in the data that holds the state postal code"
   },
   {
    "name": "state",
    "displayName": "State postal code",
    "type": "str",
    "description": "The postal code of the state whole rows to keep"
   }   
  ]
}
```

**在 Python 中实现配套脚本**

1.  启动 AWS Glue 笔记本并运行为启动会话提供的初始单元。运行初始单元会创建所需的基本组件。

1.  创建一个执行示例中描述的过滤的函数并将其注册到 `DynamicFrame`。复制下面的代码并粘贴到 AWS Glue 笔记本的单元中。

   ```
   from awsglue import DynamicFrame
   
   def custom_filter_state(self, colName, state):
       return self.filter(lambda row: row[colName] == state)
   
   DynamicFrame.custom_filter_state = custom_filter_state
   ```

1.  创建或加载示例数据，以测试同一个单元或新单元中的代码。如果您在新单元中添加示例数据，请不要忘记运行该单元。例如：

   ```
   # A few of rows of sample data to test
   data_sample = [
       {"state": "CA", "count": 4},
       {"state": "NY", "count": 2},
       {"state": "WA", "count": 3}    
   ]
   df1 = glueContext.sparkSession.sparkContext.parallelize(data_sample).toDF()
   dynf1 = DynamicFrame.fromDF(df1, glueContext, None)
   ```

1.  测试使用不同的参数验证“custom\$1filter\$1state”：  
![\[屏幕截图显示了 AWS Glue 笔记本中的一个单元，其参数传递给 dynamicFrame.show 函数。\]](http://docs.aws.amazon.com/zh_cn/glue/latest/dg/images/dynamic-transform-notebook-test-python.png)

1.  运行多个测试后，使用 .py 扩展名保存代码，并使用镜像 .json 文件名的名称命名 .py 文件。.py 和 .json 文件应位于同一个转换文件夹中。

    复制以下代码并将其粘贴到文件中，并使用 .py 文件扩展名对其进行重命名。

   ```
   from awsglue import DynamicFrame
   
   def custom_filter_state(self, colName, state):
       return self.filter(lambda row: row[colName] == state)
   
   DynamicFrame.custom_filter_state = custom_filter_state
   ```

1.  在 AWS Glue Studio 中，打开可视化作业，然后从可用 **Transforms**（转换）列表中选择该转换，将其添加到该作业中。

    要在 Python 脚本代码中重用此转换，请在作业中的“引用文件路径”下将 Amazon S3 路径添加到 .py 文件，然后在脚本中，将 python 文件的名称（不带扩展名）添加到文件顶部，将其导入。例如：`import` <文件名（不带扩展名）> 

# 步骤 3：对 AWS Glue Studio 中的自定义视觉转换进行验证和故障排除
<a name="custom-visual-transform-validation"></a>

 AWS Glue Studio 在将自定义视觉转换加载到 AWS Glue Studio 之前验证 JSON 配置文件。验证包括：
+  是否存在必填字段 
+  JSON 格式验证 
+  参数不正确或无效 
+  .py 和.json 文件同时存在于同一 Amazon S3 路径中 
+  匹配 .py 和.json 的文件名 

 如果验证成功，则转换将在可视化编辑器的可用 **Actions**（操作）列表中列出。如果提供了自定义图标，则该图标应在**操作**旁边可见。

 如果验证失败，则 AWS Glue Studio 不加载自定义视觉转换。

# 步骤 4：根据需要更新自定义视觉转换
<a name="custom-visual-transform-updating-transforms"></a>

 创建并使用后，只要转换遵循相应的 json 定义，就可以更新转换脚本：
+  分配给 DynamicFrame 时使用的名称与 json `functionName` 非常匹配。
+  函数参数必须在 json 文件中定义，如 [步骤 1：创建 JSON 配置文件](custom-visual-transform-json-config-file.md) 中所述。
+  Python 文件的 Amazon S3 路径无法更改，因为任务直接依赖于该路径。

**注意**  
 如果需要进行任何更新，请确保脚本和 .json 文件持续更新，并且使用新的转换再次正确保存所有可视作业。如果更新后未保存可视作业，则不会应用和验证更新。如果 Python 脚本文件被重命名或未放在 .json 文件旁边，则需要在 .json 文件中指定完整路径。

**自定义图标**

如果您确定**操作**的默认图标无法直观地将其区分为工作流程的一部分，则可以提供自定义图标，如 [开始使用自定义视觉转换](custom-visual-transform-getting-started.md) 中所述。您可以通过更新 Amazon S3 中托管的相应 SVG 来更新图标。

为了获得最佳效果，请按照 Cloudscape Design System 的指导方针，将图像设计为以 32x32px 的分辨率查看。有关 Cloudscape 准则的更多信息，请参阅 [Cloudscape 文档](https://cloudscape.design/foundation/visual-foundation/iconography/#custom-icons)

# 步骤 5。在 AWS Glue Studio 中使用自定义视觉转换
<a name="custom-visual-transform-create-gs"></a>

 要在 AWS Glue Studio 中使用自定义视觉变换，请上传配置和源文件，然后从 **Action**（操作）菜单中选择转换。任何需要值或输入的参数都可以在 **Transform**（转换）选项卡中找到。

1.  将这两个文件（Python 源文件和 JSON 配置文件）上传到存储作业脚本的 Amazon S3 资产文件夹。默认情况下，AWS Glue 将读取同一 Amazon S3 存储桶中的 **/transforms** 文件夹中的所有 JSON 文件。

1.  从 **Action**（操作）菜单中，选择自定义视觉转换。它使用您在 .json 配置文件中指定的转换 `displayName` 或名称命名。

1.  输入在配置文件中配置的任何参数的值。  
![\[屏幕截图显示了一个自定义视觉转换，其中包含用户要在 Transform（转换）选项卡中完成的参数。\]](http://docs.aws.amazon.com/zh_cn/glue/latest/dg/images/dynamic-transform-parameters.png)

# 用法示例
<a name="custom-visual-transform-example-json"></a>

 下面是 .json 配置文件中所有可能参数的示例。

```
{
  "name": "MyTransform",
  "displayName": "My Transform",
  "description": "This transform description will be displayed in UI",
  "functionName": "myTransform",
  "parameters": [
      {
      "name": "email",
      "displayName": "Email Address",
      "type": "str",
      "description": "Enter your work email address below",
      "validationType": "RegularExpression",
      "validationRule": "^\\w+([\\.-]?\\w+)*@\\w+([\\.-]?\\w+)*(\\.\\w{2,3})+$",
      "validationMessage": "Please enter a valid email address"
    },
    {
      "name": "phone",
      "displayName": "Phone Number",
      "type": "str",
      "description": "Enter your mobile phone number below",
      "validationRule": "^\\(?(\\d{3})\\)?[- ]?(\\d{3})[- ]?(\\d{4})$",
      "validationMessage": "Please enter a valid US number"
    },
    {
      "name": "age",
      "displayName": "Your age",
      "type": "int",
      "isOptional": true
    },
    {
      "name": "gender",
      "displayName": "Your gender",
      "type": "str",
      "listOptions": [
            {"label": "Male", "value": "male"},
            {"label": "Female", "value": "female"},
            {"label": "Other", "value": "other"}
        ],
      "isOptional": true
    },
    {
      "name": "country",
      "displayName": "Your origin country ?",
      "type": "list",
      "listOptions": "Afghanistan,Albania,Algeria,American Samoa,Andorra,Angola,Anguilla,Antarctica,Antigua and Barbuda,Argentina,Armenia,Aruba,Australia,Austria,Azerbaijan,Bahamas,Bahrain,Bangladesh,Barbados,Belarus,Belgium,Belize,Benin,Bermuda,Bhutan,Bolivia,Bosnia and Herzegovina,Botswana,Bouvet Island,Brazil,British Indian Ocean Territory,Brunei Darussalam,Bulgaria,Burkina Faso,Burundi,Cambodia,Cameroon,Canada,Cape Verde,Cayman Islands,Central African Republic,Chad,Chile,China,Christmas Island,Cocos (Keeling Islands),Colombia,Comoros,Congo,Cook Islands,Costa Rica,Cote D'Ivoire (Ivory Coast),Croatia (Hrvatska,Cuba,Cyprus,Czech Republic,Denmark,Djibouti,Dominica,Dominican Republic,East Timor,Ecuador,Egypt,El Salvador,Equatorial Guinea,Eritrea,Estonia,Ethiopia,Falkland Islands (Malvinas),Faroe Islands,Fiji,Finland,France,France,Metropolitan,French Guiana,French Polynesia,French Southern Territories,Gabon,Gambia,Georgia,Germany,Ghana,Gibraltar,Greece,Greenland,Grenada,Guadeloupe,Guam,Guatemala,Guinea,Guinea-Bissau,Guyana,Haiti,Heard and McDonald Islands,Honduras,Hong Kong,Hungary,Iceland,India,Indonesia,Iran,Iraq,Ireland,Israel,Italy,Jamaica,Japan,Jordan,Kazakhstan,Kenya,Kiribati,Korea (North),Korea (South),Kuwait,Kyrgyzstan,Laos,Latvia,Lebanon,Lesotho,Liberia,Libya,Liechtenstein,Lithuania,Luxembourg,Macau,Macedonia,Madagascar,Malawi,Malaysia,Maldives,Mali,Malta,Marshall Islands,Martinique,Mauritania,Mauritius,Mayotte,Mexico,Micronesia,Moldova,Monaco,Mongolia,Montserrat,Morocco,Mozambique,Myanmar,Namibia,Nauru,Nepal,Netherlands,Netherlands Antilles,New Caledonia,New Zealand,Nicaragua,Niger,Nigeria,Niue,Norfolk Island,Northern Mariana Islands,Norway,Oman,Pakistan,Palau,Panama,Papua New Guinea,Paraguay,Peru,Philippines,Pitcairn,Poland,Portugal,Puerto Rico,Qatar,Reunion,Romania,Russian Federation,Rwanda,Saint Kitts and Nevis,Saint Lucia,Saint Vincent and The Grenadines,Samoa,San Marino,Sao Tome and Principe,Saudi Arabia,Senegal,Seychelles,Sierra Leone,Singapore,Slovak Republic,Slovenia,Solomon Islands,Somalia,South Africa,S. Georgia and S. Sandwich Isls.,Spain,Sri Lanka,St. Helena,St. Pierre and Miquelon,Sudan,Suriname,Svalbard and Jan Mayen Islands,Swaziland,Sweden,Switzerland,Syria,Tajikistan,Tanzania,Thailand,Togo,Tokelau,Tonga,Trinidad and Tobago,Tunisia,Turkey,Turkmenistan,Turks and Caicos Islands,Tuvalu,Uganda,Ukraine,United Arab Emirates,United Kingdom (Britain / UK),United States of America (USA),US Minor Outlying Islands,Uruguay,Uzbekistan,Vanuatu,Vatican City State (Holy See),Venezuela,Viet Nam,Virgin Islands (British),Virgin Islands (US),Wallis and Futuna Islands,Western Sahara,Yemen,Yugoslavia,Zaire,Zambia,Zimbabwe",
      "description": "What country were you born in?",
      "listType": "str",
      "isOptional": true
    },
    {
      "name": "promotion",
      "displayName": "Do you want to receive promotional newsletter from us?",
      "type": "bool",
      "isOptional": true
    }
  ]
}
```

# 自定义可视化脚本的示例
<a name="custom-visual-transform-example-scripts"></a>

 以下示例执行等效转换。但是，第二个示例（SparkSQL）是最干净、最高效的，其次是 Pandas UDF，最后是第一个示例中的低级映射。以下示例是将两列相加的简单转换的完整示例：

```
from awsglue import DynamicFrame
 
# You can have other auxiliary variables, functions or classes on this file, it won't affect the runtime
def record_sum(rec, col1, col2, resultCol):
    rec[resultCol] = rec[col1] + rec[col2]
    return rec
 
 
# The number and name of arguments must match the definition on json config file
# (expect self which is the current DynamicFrame to transform
# If an argument is optional, you need to define a default value here
#  (resultCol in this example is an optional argument)
def custom_add_columns(self, col1, col2, resultCol="result"):
    # The mapping will alter the columns order, which could be important
    fields = [field.name for field in self.schema()]
    if resultCol not in fields:
        # If it's a new column put it at the end
        fields.append(resultCol)
    return self.map(lambda record: record_sum(record, col1, col2, resultCol)).select_fields(paths=fields)
 
 
# The name we assign on DynamicFrame must match the configured "functionName"
DynamicFrame.custom_add_columns = custom_add_columns
```

 以下示例是利用 SparkSQL API 的等效转换。

```
from awsglue import DynamicFrame
 
# The number and name of arguments must match the definition on json config file
# (expect self which is the current DynamicFrame to transform
# If an argument is optional, you need to define a default value here
#  (resultCol in this example is an optional argument)
def custom_add_columns(self, col1, col2, resultCol="result"):
    df = self.toDF()
    return DynamicFrame.fromDF(
        df.withColumn(resultCol, df[col1] + df[col2]) # This is the conversion logic
        , self.glue_ctx, self.name) 
 
 
# The name we assign on DynamicFrame must match the configured "functionName"
DynamicFrame.custom_add_columns = custom_add_columns
```

 以下示例使用相同的转换，但使用的是 pandas UDF，这比使用普通 UDF 更有效。有关编写 pandas UDF 的更多信息，请参阅：[Apache Spark SQL 文档](https://spark.apache.org/docs/3.1.1/api/python/reference/api/pyspark.sql.functions.pandas_udf.html)。

```
from awsglue import DynamicFrame
import pandas as pd
from pyspark.sql.functions import pandas_udf
 
# The number and name of arguments must match the definition on json config file
# (expect self which is the current DynamicFrame to transform
# If an argument is optional, you need to define a default value here
#  (resultCol in this example is an optional argument)
def custom_add_columns(self, col1, col2, resultCol="result"):
    @pandas_udf("integer")  # We need to declare the type of the result column
    def add_columns(value1: pd.Series, value2: pd.Series) → pd.Series:
        return value1 + value2
 
    df = self.toDF()
    return DynamicFrame.fromDF(
        df.withColumn(resultCol, add_columns(col1, col2)) # This is the conversion logic
        , self.glue_ctx, self.name) 
 
# The name we assign on DynamicFrame must match the configured "functionName"
DynamicFrame.custom_add_columns = custom_add_columns
```

## 视频
<a name="custom-visual-transform-video"></a>

以下视频介绍了可视化自定义转换，并演示了如何使用它们。

[![AWS Videos](http://img.youtube.com/vi/https://www.youtube.com/embed/xFpAhANcVcg/0.jpg)](http://www.youtube.com/watch?v=https://www.youtube.com/embed/xFpAhANcVcg)


# 将数据湖框架与 AWS Glue Studio 配合使用
<a name="gs-data-lake-formats"></a>

## 概述
<a name="gs-data-lake-formats-overview"></a>

 开源数据湖框架简化了对存储在 Amazon S3 上的数据湖中的文件的增量数据处理。AWS Glue 3.0 及更高版本支持以下开源数据湖存储框架：
+  Apache Hudi 
+  Linux Foundation Delta Lake 
+  Apache Iceberg 

 截至 AWS Glue 4.0，AWS Glue 为这些框架提供原生支持，因此您可以以交易一致的方式读取和写入存储在 Amazon S3 中的数据。无需安装单独的连接器或完成额外的配置步骤即可在 AWS Glue 作业中使用这些框架。

 通过 Spark 脚本编辑器任务，数据湖框架可用作 AWS Glue Studio 中的来源或目标。有关使用 Apache Hudi、Apache Iceberg 和 Delta Lake 的更多信息，请参阅：[在 AWS Glue ETL 任务中使用数据湖框架](https://docs.aws.amazon.com/glue/latest/dg/aws-glue-programming-etl-datalake-native-frameworks.html)。

## 从 AWS Glue 流式处理源创建开放表格式
<a name="gs-data-lake-formats-streaming"></a>

AWS Glue 流式处理 ETL 作业会持续消耗来自流式处理源的数据，清理和转换动态数据，并在几秒钟内使其可用于分析。

AWS 提供的多种服务都可以满足您的需求。AWS Database Migration Service 等数据库复制服务可以将数据从您的源系统复制到 Amazon S3，后者常用于托管数据湖的存储层。尽管在支持在线源应用程序的关系数据库管理系统（RDBMS）上应用更新非常简单直接，但很难在数据湖上执行这种 CDC 流程。开源数据管理框架可简化增量数据处理和数据管道的开发，能够很好地解决这一问题。

有关更多信息，请参阅：
+ [使用 AWS Glue 流式处理功能创建基于 Apache HUDI 的近实时事务处理数据湖](https://aws.amazon.com/blogs/big-data/create-an-apache-hudi-based-near-real-time-transactional-data-lake-using-aws-dms-amazon-kinesis-aws-glue-streaming-etl-and-data-visualization-using-amazon-quicksight/)
+ [构建与 GDPR 一致的实时 Apache Iceberg 数据湖](https://aws.amazon.com/blogs/big-data/build-a-real-time-gdpr-aligned-apache-iceberg-data-lake/)

# 在 AWS Glue Studio 中使用 Hudi 框架
<a name="gs-data-lake-formats-hudi"></a>

 创建或编辑作业时，AWS Glue Studio 会根据您使用的 AWS Glue 版本自动为您添加相应的 Hudi 库。有关更多信息，请参阅[在 AWS Glue 中使用 Hudi 框架](https://docs.aws.amazon.com/glue/latest/dg/aws-glue-programming-etl-format-hudi.html)。

## 在 Data Catalog 数据来源中使用 Apache Hudi 框架
<a name="gs-data-lake-formats-hudi-source-catalog"></a>

**要为作业添加 Hudi 数据来源格式，请执行以下操作：**

1.  从“来源”菜单中选择“AWS Glue Studio Data Catalog”。

1.  在**数据来源属性**选项卡中，选择数据库和表。

1.  AWS Glue Studio 将格式类型显示为 Apache Hudi 和 Amazon S3 URL。  
![\[屏幕截图显示了 Data Catalog 来源节点的数据来源属性选项卡。\]](http://docs.aws.amazon.com/zh_cn/glue/latest/dg/images/data_lake_formats_data_catalog_hudi.png)

## 在 Amazon S3 数据来源中使用 Hudi 框架
<a name="gs-data-lake-formats-hudi-source-s3.title"></a>

1.  从“来源”菜单中选择 Amazon S3。

1.  如果您选择 Data Catalog 表作为 Amazon S3 来源类型，请选择数据库和表。

1.  AWS Glue Studio 显示格式为 Apache Hudi 和 Amazon S3 URL。

1.  如果您选择 Amazon S3 位置作为 **Amazon S3 来源类型**，请通过单击**浏览 Amazon S3** 选择 Amazon S3 URL。

1.  在**数据格式**中，选择“Apache Hudi”。
**注意**  
 如果 AWS Glue Studio 无法从您选择的 Amazon S3 文件夹或文件推断出架构，请选择**其他选项**来选择新的文件夹或文件。  
 在**其他选项**中，从**架构推断**下的以下选项中进行选择：  
 让 AWS Glue Studio 自动选择示例文件：AWS Glue Studio 将在 Amazon S3 位置选择一个示例文件，以便推断出架构。在**自动取样文件**字段中，您可以查看自动选择的文件。
 从 Amazon S3 中选择示例文件：单击**浏览 Amazon S3**，选择要使用的 Amazon S3 文件。

1.  单击**推断架构**。然后可以通过单击**输出架构**选项卡来查看输出架构。

1.  选择**其他选项**以输入键值对。  
![\[屏幕截图显示了 Amazon S3 数据来源节点的数据来源属性选项卡中的其他选项部分。\]](http://docs.aws.amazon.com/zh_cn/glue/latest/dg/images/data_lake_formats_additional_options.png)

## 在数据目标中使用 Apache Hudi 框架
<a name="gs-data-lake-formats-hudi-target"></a>

### 在 Data Catalog 数据目标中使用 Apache Hudi 框架
<a name="gs-data-lake-formats-hudi-target-catalog"></a>

1.  从**目标**菜单中选择“AWS Glue Studio Data Catalog”。

1.  在**数据来源属性**选项卡中，选择数据库和表。

1.  AWS Glue Studio 将格式类型显示为 Apache Hudi 和 Amazon S3 URL。

#### 在 Amazon S3 数据目标中使用 Apache Hudi 框架
<a name="gs-data-lake-formats-hudi-target-s3"></a>

 输入值或从可用选项中进行选择以配置 Apache Hudi 格式。有关 Apache Hudi 的更多信息，请参阅 [Apache Hudi 文档](https://hudi.apache.org/docs/overview)。

![\[屏幕截图显示了 Amazon S3 数据来源节点的数据来源属性选项卡中的其他选项部分。\]](http://docs.aws.amazon.com/zh_cn/glue/latest/dg/images/hudi_s3_target_properties.png)

+  **Hudi 表名**：Hudi 表的名字。
+  **Hudi 存储类型**：从两个选项中选择：
  +  **写入时复制**：可优化读取性能的推荐选项。这是默认 Hudi 存储类型。每次更新都会在写入时创建文件的新版本。
  +  **读取时合并**：可将写入延迟降至最低的推荐选项。更新记录到基于行的增量文件中，并根据需要进行压缩以创建新版本的列式文件。
+  **Hudi 写入操作**：从以下选项中进行选择：
  +  **更新插入**：默认操作，操作时首先通过查找索引将输入记录标记为插入或更新。在您更新现有数据时推荐选择。
  +  **插入**：插入记录，但不检查现有记录，并可能导致重复。
  +  **批量插入**：插入记录，建议用于大量数据。
+  **Hudi 记录键字段**：使用搜索栏搜索并选择主记录键。Hudi 中的记录由主键标识，主键由记录键和记录所属的分区路径组成。
+  **Hudi 预合并字段**：实际写入之前在预合并中使用的字段。如果两个记录具有相同的键值，AWS Glue Studio 会为预合并字段选择值最大的记录。设置增量值（例如 updated\$1at）所属的字段。
+  **压缩类型**：选择一种压缩类型选项：未压缩、GZIP、LZO 或 Snappy。
+  **Amazon S3 目标位置**：通过单击**浏览 S3** 来选择 Amazon S3 目标位置。
+  **Data Catalog 更新选项**：从以下选项中进行选择：
  +  Do not update the Data Catalog (请勿更新数据目录)：（默认）如果您不希望任务更新数据目录（即使架构更改或添加了新分区），请选择此选项。
  +  在 Data Catalog 中创建表并在后续运行时更新架构并添加新分区：如果选择此选项，作业将在第一次作业运行时在 Data Catalog 中创建表。在后续任务运行时，如果架构发生更改或添加了新分区，任务将更新数据目录表。

     您还必须从数据目录中选择数据库并输入表名。
  +  Create a table in the Data Catalog and on subsequent runs, keep existing schema and add new partitions (在数据目录中创建表，并在后续运行时保持现有架构并添加新分区)：如果选择此选项，任务将在第一次任务运行时创建数据目录中的表。在后续任务运行时，任务只更新数据目录表以添加新分区。

     您还必须从数据目录中选择数据库并输入表名。
+  Partition keys (分区键)：选择要在输出中用作分区键的列。要添加更多分区键，请选择 Add a partition key (添加分区键)。
+  **其他选项**：根据需要输入键值对。

## 通过 AWS Glue Studio 生成代码
<a name="gs-data-lake-formats-hudi-generating-code"></a>

 保存作业时，如果检测到 Hudi 来源或目标，则会将以下作业参数添加到作业中：
+  `--datalake-formats`：在可视化作业中检测到的数据湖格式的不同列表（可以直接选择“格式”，或间接选择由数据湖支持的目录表)。
+  `--conf `：根据 `--datalake-formats` 的值生成。例如，如果 `--datalake-formats` 的值为 'hudi'，则 AWS Glue 为此参数生成的值为 `spark.serializer=org.apache.spark.serializer.KryoSerializer —conf spark.sql.hive.convertMetastoreParquet=false`。

## 覆盖 AWS Glue 提供的库
<a name="gs-data-lake-formats-hudi-overriding-libraries"></a>

 要使用 AWS Glue 不支持的 Hudi 版本，可以指定自己的 Hudi 库 JAR 文件。要使用自己的 JAR 文件，请执行以下操作：
+  使用 `--extra-jars` 作业参数。例如 `'--extra-jars': 's3pathtojarfile.jar'`。有关更多信息，请参阅 [AWS Glue 作业参数](https://docs.aws.amazon.com/glue/latest/dg/aws-glue-programming-etl-glue-arguments.html)。
+  请勿包含 `hudi` 作为 `--datalake-formats` 作业参数的值。输入空白字符串作为值可确保 AWS Glue 不会自动为您提供任何数据湖库。有关更多信息，请参阅[在 AWS Glue 中使用 Hudi 框架](https://docs.aws.amazon.com/glue/latest/dg/aws-glue-programming-etl-format-hudi.html)。

# 在 AWS Glue Studio 中使用 Delta Lake 框架
<a name="gs-data-lake-formats-delta"></a>

## 在数据来源中使用 Delta Lake 框架
<a name="gs-data-lake-formats-delta-source"></a>

### 在 Amazon S3 数据来源中使用 Delta Lake 框架
<a name="gs-data-lake-formats-delta-lake-s3-data-source"></a>

1.  从“来源”菜单中选择 Amazon S3。

1.  如果您选择 Data Catalog 表作为 Amazon S3 来源类型，请选择数据库和表。

1.  AWS Glue Studio 显示格式为 Delta Lake 和 Amazon S3 URL。

1.  选择**其他选项**以输入键值对。例如，键值对可能为：**键**：timestampAsOf 和**值**：2023-02-24 14:16:18。  
![\[屏幕截图显示了 Amazon S3 数据来源节点的数据来源属性选项卡中的其他选项部分。\]](http://docs.aws.amazon.com/zh_cn/glue/latest/dg/images/data_lake_formats_additional_options.png)

1.  如果您选择 Amazon S3 位置作为 **Amazon S3 来源类型**，请通过单击**浏览 Amazon S3** 选择 Amazon S3 URL。

1.  在**数据格式**中，选择 Delta Lake。
**注意**  
 如果 AWS Glue Studio 无法从您选择的 Amazon S3 文件夹或文件推断出架构，请选择**其他选项**来选择新的文件夹或文件。  
 在**其他选项**中，从**架构推断**下的以下选项中进行选择：  
 让 AWS Glue Studio 自动选择示例文件：AWS Glue Studio 将在 Amazon S3 位置选择一个示例文件，以便推断出架构。在**自动取样文件**字段中，您可以查看自动选择的文件。
 从 Amazon S3 中选择示例文件：单击**浏览 Amazon S3**，选择要使用的 Amazon S3 文件。

1.  单击**推断架构**。然后可以通过单击**输出架构**选项卡来查看输出架构。

### 在 Data Catalog 数据来源中使用 Delta Lake 框架
<a name="gs-data-lake-formats-delta-catalog"></a>

1.  从**来源**菜单中选择“AWS Glue Studio Data Catalog”。

1.  在**数据来源属性**选项卡中，选择数据库和表。

1.  AWS Glue Studio 将格式类型显示为 Delta Lake 和 Amazon S3 URL。
**注意**  
 如果尚未将 Delta Lake 来源注册为 AWS Glue 数据目录表，则有两种选择：  
 为 Delta Lake 数据创建 AWS Glue 爬网程序。有关更多信息，请参阅[如何为 Delta Lake 数据存储指定配置选项](https://docs.aws.amazon.com/glue/latest/dg/crawler-configuration.html#crawler-delta-lake)。
 使用 Amazon S3 数据来源选择 Delta Lake 数据来源。请参阅[在 Amazon S3 数据来源中使用 Delta Lake 框架](#gs-data-lake-formats-delta-lake-s3-data-source)。

## 在数据目标中使用 Delta Lake 格式
<a name="gs-data-lake-formats-delta-target"></a>

### 在 Data Catalog 数据目标中使用 Delta Lake 格式
<a name="gs-data-lake-formats-delta-target-catalog"></a>

1.  从**目标**菜单中选择“AWS Glue Studio Data Catalog”。

1.  在**数据来源属性**选项卡中，选择数据库和表。

1.  AWS Glue Studio 将格式类型显示为 Delta Lake 和 Amazon S3 URL。

### 在 Amazon S3 数据来源中使用 Delta Lake 格式
<a name="gs-data-lake-formats-delta-target-s3"></a>

 输入值或从可用选项中进行选择以配置 Delta Lake 格式。
+  **压缩类型**：选择一种压缩类型选项：未压缩或 Snappy。
+  **Amazon S3 目标位置**：通过单击**浏览 S3** 来选择 Amazon S3 目标位置。
+  **Data Catalog 更新选项**：在 Glue Studio 可视化编辑器中，此格式不支持更新 Data Catalog。
  +  Do not update the Data Catalog (请勿更新数据目录)：（默认）如果您不希望任务更新数据目录（即使架构更改或添加了新分区），请选择此选项。
  +  要在 AWS Glue 作业执行后更新 Data Catalog，请运行或计划 AWS Glue 爬网程序。有关更多信息，请参阅[如何为 Delta Lake 数据存储指定配置选项](https://docs.aws.amazon.com/glue/latest/dg/crawler-configuration.html#crawler-delta-lake)。
+  **分区键**：选择要在输出中用作分区键的列。要添加更多分区键，请选择 **Add a partition key (添加分区键)**。
+  可选择**其他选项**以输入键值对。例如，键值对可能为：**键**：timestampAsOf 和**值**：2023-02-24 14:16:18。

# 在 AWS Glue Studio 中使用 Apache Iceberg 框架
<a name="gs-data-lake-formats-iceberg"></a>

## 在数据目标中使用 Apache Iceberg 框架
<a name="gs-data-lake-formats-iceberg-target"></a>

### 在 Data Catalog 数据目标中使用 Apache Iceberg 框架
<a name="gs-data-lake-formats-iceberg-target-catalog"></a>

1.  从**目标**菜单中选择“AWS Glue Studio Data Catalog”。

1.  在**数据来源属性**选项卡中，选择数据库和表。

1.  AWS Glue Studio 将格式类型显示为 Apache Iceberg 和 Amazon S3 URL。

### 在 Amazon S3 数据目标中使用 Apache Iceberg 框架
<a name="gs-data-lake-formats-iceberg-s3-data-targets"></a>

 输入值或从可用选项中进行选择以配置 Apache Iceberg 格式。
+  **格式** — 从下拉菜单中选择 **Apache Iceberg**。
+  **Amazon S3 目标位置** — 通过单击**浏览 S3** 来选择 Amazon S3 目标位置。
+  **Data Catalog 更新选项** — **在 Data Catalog 中创建表，并在后续运行时选择保留现有架构并添加新分区**才能继续。使用 AWS Glue 编写新的 Iceberg 表需要将 Data Catalog 配置为 Iceberg 表的目录。要更新已在 Data Catalog 中注册的现有 Iceberg 表，请选择 Data Catalog 作为目标。
  +  **数据库** — 从 Data Catalog 中选择数据库。
  +  **表名称** — 输入表名的值。Apache Iceberg 表名必须全部为小写。如果需要，请使用下划线，因为不允许使用空格。例如“data\$1lake\$1format\$1tables”。

![\[屏幕截图显示在 Amazon S3 数据目标中使用 Apache Iceberg 框架时的数据目标属性。\]](http://docs.aws.amazon.com/zh_cn/glue/latest/dg/images/apache-iceberg-data-target-properties.png)


## 在 Amazon S3 数据来源中使用 Apache Iceberg 框架
<a name="gs-data-lake-formats-iceberg-source"></a>

### 在 Data Catalog 数据来源中使用 Apache Iceberg 框架
<a name="gs-data-lake-formats-iceberg-source-data-catalog"></a>

1.  从**来源**菜单中选择“AWS Glue Studio Data Catalog”。

1.  在**数据来源属性**选项卡中，选择数据库和表。

1.  AWS Glue Studio 将格式类型显示为 Apache Iceberg 和 Amazon S3 URL。

![\[屏幕截图显示了在 Data Catalog 数据来源中使用 Apache Iceberg 框架时的数据目标属性。\]](http://docs.aws.amazon.com/zh_cn/glue/latest/dg/images/apache-iceberg-data-source-properties.png)


### 在 Amazon S3 数据来源中使用 Apache Iceberg 框架
<a name="gs-data-lake-formats-iceberg-source-s3"></a>

 Apache Iceberg 不能作为 AWS Glue Studio 中 Amazon S3 源节点的数据选项提供。

# 使用 Visual ETL 作业连接到数据来源
<a name="connecting-to-data-chapter"></a>

 创建新作业时，您可以在 AWS Glue 中编辑 Visual ETL 作业时使用连接以连接到数据。为此，您可以添加使用连接器读入数据的源节点，以及指定写出数据的位置的目标节点。

**Topics**
+ [修改数据来源节点的属性](edit-jobs-source.md)
+ [使用数据源的数据目录表](edit-jobs-source-catalog-tables.md)
+ [将连接器用作数据源](edit-jobs-source-connectors.md)
+ [将 Amazon S3 中的文件用作数据源](edit-jobs-source-s3-files.md)
+ [使用流式处理数据源](edit-jobs-source-streaming.md)
+ [参考信息](edit-jobs-source-references.md)

# 修改数据来源节点的属性
<a name="edit-jobs-source"></a>

要指定数据源属性，首先在任务图中选择一个数据源节点。然后，在节点详细信息面板的右侧，配置节点属性。

**修改数据源节点的属性**

1. 转到新任务或已保存任务的可视编辑器。

1. 在任务图中选择一个数据源节点。

1. 在节点详细信息面板中选择 **Node properties (节点属性)** 选项卡，然后输入以下信息：
   + **Name (名称)**：（可选）输入要与任务图中节点关联的名称。此名称在此任务的所有节点中应唯一。
   + **Node type (节点类型)**：节点类型可确定由节点执行的操作。在 **Node type (节点类型)** 的选项列表中，从标题 **Data source (数据源)** 下列出的值中选择一个。

1. 配置 **Data source properties (数据源属性)** 信息。有关详细信息，请参阅以下章节：
   + [使用数据源的数据目录表](edit-jobs-source-catalog-tables.md)
   + [将连接器用作数据源](edit-jobs-source-connectors.md)
   + [将 Amazon S3 中的文件用作数据源](edit-jobs-source-s3-files.md)
   + [使用流式处理数据源](edit-jobs-source-streaming.md)

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

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

# 使用数据源的数据目录表
<a name="edit-jobs-source-catalog-tables"></a>

对于 Amazon S3 和连接器之外的所有数据源，表必须位于您所选择源类型的 AWS Glue Data Catalog 中。AWS Glue 不会创建数据目录表。

**基于数据目录表配置数据源节点**

1. 转到新任务或已保存任务的可视编辑器。

1. 在任务图中选择一个数据源节点。

1. 选择 **Data source properties (数据源属性)** 选项卡，然后输入以下信息：
   + **S3 source type (S3 源类型)**：（仅适用于 Amazon S3 数据源）选择选项 **Select a Catalog table (选择目录表)** 以使用现有 AWS Glue Data Catalog 表。
   + **Database (数据库)**：在数据目录中选择包含要用于此任务的源表的数据库。您可以使用搜索字段按名称搜索数据库。
   + **Table (表)**：从列表中选择与源数据关联的表。此表必须已位于 AWS Glue Data Catalog 中。您可以使用搜索字段按名称搜索表。
   + **Partition predicate (分区谓词)**：（仅适用于 Amazon S3 数据源）输入基于仅包含分区列的 Spark SQL 的布尔表达式。例如：`"(year=='2020' and month=='04')"`
   + **Temporary directory (临时目录)**：（仅适用于 Amazon Redshift 数据源）输入 Amazon S3 中工作目录位置的路径，在其中您的 ETL 任务可以写入临时中间结果。
   + **Role associated with the cluster (与集群关联的角色)**：（仅适用于 Amazon Redshift 数据源）为要使用的 ETL 任务输入角色，该角色包含 Amazon Redshift 集群权限。有关更多信息，请参阅 [数据源和数据目标权限](getting-started-min-privs-job.md#getting-started-min-privs-data)。

# 将连接器用作数据源
<a name="edit-jobs-source-connectors"></a>

如果您为 **Node type (节点类型)** 选择连接器，请按照 [使用自定义连接器编写任务](job-authoring-custom-connectors.md) 中的说明操作，完成数据源属性的配置。

# 将 Amazon S3 中的文件用作数据源
<a name="edit-jobs-source-s3-files"></a>

如果您选择 Amazon S3 作为数据源，则可以选择以下任一项：
+ 数据目录数据库和表。
+ Amazon S3 中的存储桶、文件夹或文件。

如果您将 Amazon S3 存储桶用作数据源，AWS Glue 会从文件中的指定位置检测数据的架构，或者使用您指定的文件作为样本文件。当您使用 **Infer schema (推断架构)** 按钮时，会检测架构。如果您更改 Amazon S3 位置或样本文件，则必须选择 **Infer schema (推断架构)**，使用新信息执行架构检测。

**配置直接从 Amazon S3 中的文件读取数据的数据源节点**

1. 转到新任务或已保存任务的可视编辑器。

1. 在任务图中为 Amazon S3 源选择数据源节点。

1. 选择 **Data source properties (数据源属性)** 选项卡，然后输入以下信息：
   + **S3 source type (S3 源类型)**：（仅适用于 Amazon S3 数据源）选择选项 **S3 location (S3 位置)**。
   + **S3 URL**：输入 Amazon S3 存储桶、文件夹或包含任务数据的文件的路径。您可以选择 **Browse S3 (浏览 S3)**，从您的账户的可用位置中选择路径。
   + **Recursive (递归)**：如果需要 AWS Glue 从 S3 位置在子文件夹中的文件读取数据，请选择该选项。

     如果子文件夹包含分区数据，AWS Glue 不会将文件夹名称中指定的分区信息添加到数据目录。例如，您可考虑 Amazon S3 中的以下文件夹。

     ```
     S3://sales/year=2019/month=Jan/day=1
     S3://sales/year=2019/month=Jan/day=2
     ```

     如果选择 **Recursive (递归)**，将 `sales` 文件夹选为 S3 位置，择 AWS Glue 会读取所有子文件夹中的数据，但不会为年份、月份或日创建分区。
   + **Data format (数据格式)**：选择数据的存储格式。您可以选择 JSON、CSV 或 Parquet。您选择的值会告知 AWS Glue 任务如何从源文件读取数据。
**注意**  
如果您未选择正确的数据格式，AWS Glue 可能会正确推断模式，但任务将无法正确解析源文件中的数据。

     您可以输入其他配置选项，具体取决于您选择的格式。
     + **JSON**（JavaScript 对象表示法）
       + **JsonPath**：输入指向用于定义表架构的对象的 JSON 路径。JSON 路径表达式始终引用 JSON 结构，类似于 XPath 表达式与 XML 文档的结合使用方式。JSON 路径中的“根成员对象”始终称为 `$`，即使它是一个对象或数组。JSON 路径可以用点表示法或括号表示法编写。

         有关 JSON 路径的更多信息，请参阅 GitHub 网站上的 [JsonPath](https://github.com/json-path/JsonPath)。
       + **Records in source files can span multiple lines (源文件中的记录可以跨越多行)**：如果单个记录可以跨越 CSV 文件中的多行，请选择此选项。
     + **CSV**（逗号分隔值）
       + **Delimiter (分隔符)**：输入字符以表示行中每个列条目的分隔项，例如 `;` 或者 `,`。
       + **Escape character (转义字符)**：输入用作转义字符的字符。此字符表示紧接转义字符的字符应该按字面意思处理，不应将其解释为分隔符。
       + **Quote character (引号字符)**：输入用于将单独的字符串分组为单个值的字符。例如，如果您的 CSV 文件包含 `"This is a single value"` 之类的值，您将选择 **Double quote (") (双引号（"）)**。
       + **Records in source files can span multiple lines (源文件中的记录可以跨越多行)**：如果单个记录可以跨越 CSV 文件中的多行，请选择此选项。
       + **First line of source file contains column headers (源文件的第一行包含列标题)**：如果 CSV 文件中的第一行包含列标题而不是数据，请选择此选项。
     + **Parquet**（Apache Parquet 列式存储）

       对于以 Parquet 格式存储的数据，不需要配置其他设置。
     + **Apache Hudi**

       对于以 Apache Hudi 格式存储的数据，不需要配置其他设置。
     + **Delta Lake**

       对于以 Delta Lake 格式存储的数据，不需要配置其他设置。
     + **Excel**

       对于以 Excel 格式存储的数据，不需要配置其他设置。
   + **Partition predicate (分区谓词)**：要对从数据源读取的数据进行分区，请输入基于 Spark SQL 的布尔表达式，仅包含分区列。例如：`"(year=='2020' and month=='04')"`
   + **Advanced options (高级选项)**：如果需要 AWS Glue 根据特定文件检测数据的架构，请展开此部分。
     + **Schema inference (架构推理)**：如果您希望特定的文件，而不是让 AWS Glue 选择文件，则选择选项**从 S3 中选择样本文件**。架构推断不适用于 Excel 数据源。
     + **Auto-sampled file (自动取样文件)**：输入 Amazon S3 中用于推断架构的文件的路径。

     如果要编辑数据源节点并更改选定的样本文件，请选择 **Reload schema (重新加载架构)**，使用新的样本文件检测架构。

1. 选择 **Infer schema (推断架构)** 按钮，从 Amazon S3 的源文件中检测架构。如果您更改 Amazon S3 位置或样本文件，则必须再次选择 **Infer schema (推断架构)**，使用新信息推断架构。

# 使用流式处理数据源
<a name="edit-jobs-source-streaming"></a>

您可以创建连续运行并使用来自流式处理源的数据的流式处理提取、转换和负载（ETL）任务，例如 Amazon Kinesis Data Streams、Apache Kafka 和 Amazon Managed Streaming for Apache Kafka（Amazon MSK）。

**配置流式处理数据源的属性**

1. 转到新任务或已保存任务的可视化图形编辑器。

1. 在图形中为 Kafka 或 Kinesis Data Streams 选择数据源节点。

1. 选择 **Data source properties (数据源属性)** 选项卡，然后输入以下信息：

------
#### [ Kinesis ]
   + **Kinesis source type**（Kinesis 源类型）：选择选项 **Stream details**（流式传输详细信息）可使用直接访问串流源，或选择 **Data Catalog table**（数据目录表）使用存储在其中的信息。

     如果选择 **Stream details**（流式传输详细信息），请指定以下附加信息。
     + **数据流的位置**：选择流式传输与当前用户关联，还是其他用户关联。
     + **Region**（区域）：选择存在流式传输的 AWS 区域。此信息用于构建用于访问数据流的 ARN。
     + **Stream ARN**（流式传输 ARN）：输入 Kinesis 数据流的 Amazon Resource Name (ARN)。如果流式传输位于当前账户内，则可以从下拉列表中选择流式传输名称。您可以使用搜索字段按名称或 ARN 搜索数据流。
     + **Data format**（数据格式）：从列表中选择数据流使用的格式。

       AWS Glue 会自动从流式处理数据中检测架构。

     如果选择 **Data Catalog table**（数据目录表），请指定以下附加信息。
     + **Database (数据库)**：（可选）在 AWS Glue 数据目录中选择数据库，该数据库包含与流式处理数据源关联的表。您可以使用搜索字段按名称搜索数据库。
     + **Table (表)**：（可选）从列表中选择与源数据关联的表。此表必须已存在于 AWS Glue 数据目录中。您可以使用搜索字段按名称搜索表。
     + **Detect schema (检测架构)**：选择该选项，允许 AWS Glue 从流式处理数据检测架构，而不是使用数据目录表中的架构信息。如果选择 **Stream details**（流式传输详细信息）选项，则会自动启用此选项。
   + **Starting position**（起始位置）：预设情况下，ETL 任务会使用 **Earliest**（最早）选项，这意味着从流式传输中最早的可用记录开启读取数据。您也可以选择 **Latest**（最新），表示 ETL 任务应该从流式传输中最新的记录之后开启读取。
   + **Window size (窗口大小)**：默认情况下，在 100 秒的时段内处理 ETL 任务和写出数据。这可以实现数据的高效处理，并允许对晚于预计时间到达的数据执行聚合。您可以修改此窗口大小以提高及时性或聚合精度。

     AWS Glue 流式处理任务使用检查点而非任务书签来跟踪已读取的数据。
   + **Connection options**（连接选项）：展开此部分以添加键值对，指定其他连接选项。有关您可在此处指定的选项的信息，请参阅*AWS Glue 开发人员指南*中的 ["connectionType": "kinesis"](https://docs.aws.amazon.com/glue/latest/dg/aws-glue-programming-etl-connect.html#aws-glue-programming-etl-connect-kinesis)。

------
#### [ Kafka ]
   + **Apache Kafka source**（Apache Kafka 源）：选择选项 **Stream details**（流式传输详细信息）可使用直接访问流式处理源，或选择 **Data Catalog table**（数据目录表）使用存储在其中的信息。

     如果选择 **Data Catalog table**（数据目录表），请指定以下附加信息。
     + **Database (数据库)**：（可选）在 AWS Glue 数据目录中选择数据库，该数据库包含与流式处理数据源关联的表。您可以使用搜索字段按名称搜索数据库。
     + **Table (表)**：（可选）从列表中选择与源数据关联的表。此表必须已存在于 AWS Glue 数据目录中。您可以使用搜索字段按名称搜索表。
     + **Detect schema (检测架构)**：选择该选项，允许 AWS Glue 从流式处理数据检测架构，而不是将架构信息存储于数据目录表。如果选择 **Stream details**（流式传输详细信息）选项，则会自动启用此选项。

     如果选择 **Stream details**（流式传输详细信息），请指定以下附加信息。
     + **Connection name**（连接名称）：选择包含 Kafka 数据流的访问和身份验证信息的 AWS Glue 连接。您必须使用与 Kafka 流式处理数据源的连接。如果连接不存在，可以使用 AWS Glue 控制台为 Kafka 数据流创建连接。
     + **Topic name**（主题名称）：输入要从中读取的主题的名称。
     + **Data format**（数据格式）：选择从 Kafka 事件流读取数据时使用的格式。
   + **Starting position**（起始位置）：预设情况下，ETL 任务会使用 **Earliest**（最早）选项，这意味着从流式传输中最早的可用记录开启读取数据。您也可以选择 **Latest**（最新），表示 ETL 任务应该从流式传输中最新的记录之后开启读取。
   + **Window size (窗口大小)**：默认情况下，在 100 秒的时段内处理 ETL 任务和写出数据。这可以实现数据的高效处理，并允许对晚于预计时间到达的数据执行聚合。您可以修改此窗口大小以提高及时性或聚合精度。

     AWS Glue 流式处理任务使用检查点而非任务书签来跟踪已读取的数据。
   + **Connection options**（连接选项）：展开此部分以添加键值对，指定其他连接选项。有关您可在此处指定的选项的信息，请参阅*AWS Glue 开发人员指南*中的 ["connectionType": "kafka"](https://docs.aws.amazon.com/glue/latest/dg/aws-glue-programming-etl-connect.html#aws-glue-programming-etl-connect-kafka)。

------

**注意**  
流式处理数据源当前不支持数据预览。

# 参考信息
<a name="edit-jobs-source-references"></a>

 **最佳实践** 
+  [使用 AWS Glue 构建 ETL 服务管道以增量方式将数据从 Amazon S3 加载到 Amazon Redshift](https://docs.aws.amazon.com/prescriptive-guidance/latest/patterns/build-an-etl-service-pipeline-to-load-data-incrementally-from-amazon-s3-to-amazon-redshift-using-aws-glue.html) 

 **ETL 编程** 
+  [AWS Glue 中的 ETL 的连接类型和选项](https://docs.aws.amazon.com/glue/latest/dg/aws-glue-connections.html) 
+  [JDBC connectionType 值](https://docs.aws.amazon.com/glue/latest/dg/aws-glue-programming-etl-connect.html#aws-glue-programming-etl-connect-jdbc) 
+  [用于从 Amazon Redshift 移入移出数据的高级选项](https://docs.aws.amazon.com/glue/latest/dg/aws-glue-programming-etl-redshift.html) 

# 配置数据目标节点
<a name="data-target-nodes"></a>

数据目标是任务写入转换后数据的位置。

## 数据目标选项概览
<a name="edit-jobs-target-overview"></a>

您的数据目标（也称为*数据接收器*）可以是：
+ **S3** – 任务将数据写入您选择的 Amazon S3 位置的文件中，并以您指定的格式写入。

  如果您为数据目标配置分区列，则任务会根据分区键将数据集写入 Amazon S3 的目录。
+ **AWS Glue Data Catalog** – 任务使用与数据目录中的表关联的信息将输出数据写入目标位置。

  您可以手动创建表，也可以使用爬网程序创建表。您还可以使用 AWS CloudFormation 模板在数据目录中创建表。
+ 连接器 – 连接器是一段代码，便于您在数据存储和 AWS Glue 之间通信。任务使用连接器和关联的连接将输出数据写入目标位置。您可以订阅 AWS Marketplace 中提供的连接器，或者您还可以创建自己的自定义连接器。有关更多信息，请参阅 [将连接器添加到 AWS Glue Studio](creating-custom-connectors.md#creating-connectors)

您可以选择在任务写入 Amazon S3 数据目标时更新数据目录。当架构或分区发生更改时，不需要爬网程序更新数据目录，此选项可以更轻松地使表保持最新状态。此选项可选择性地将新表添加到数据目录、更新表分区以及直接从任务更新表的方案，简化将数据用于分析的过程。

## 编辑数据目标节点
<a name="edit-jobs-target"></a>

数据目标是任务写入转换后数据的位置。

**在任务图中添加或配置数据目标节点**

1. （可选）如果需要添加目标节点，请在可视化编辑器顶部工具栏中选择 **Target (目标)**，然后选择 **S3** 或者 **Glue Data Catalog**。
   + 如果选择 **S3**，则任务将数据集写入您指定的 Amazon S3 位置中的一个或多个文件。
   + 如果选择 **AWS Glue Data Catalog**，则任务将写入从数据目录中选择的表所描述的位置。

1. 在任务图中选择一个数据目标节点。选择节点时，节点详细信息面板将在页面右侧显示。

1. 选择 **Node properties (节点属性)** 选项卡，然后输入以下信息：
   + **Name (名称)**：输入要与任务图中节点关联的名称。
   + **Node type (节点类型)**：应该已选择一个值，但您可以根据需要对其进行更改。
   + **Node parents (父节点)**：父节点是任务图中提供要写入目标位置的输出数据的节点。对于预填充的任务图，目标节点应该已经选择父节点。如果没有显示父节点，则从列表中选择父节点。

     目标节点具有单个父节点。

1. 配置 **Data target properties (数据目标属性)** 信息。有关详细信息，请参阅以下章节：
   + [将 Amazon S3 用于数据目标](#edit-job-target-S3)
   + [使用数据目标的数据目录表](#edit-job-target-catalog)
   + [将连接器用作数据目标](#edit-job-target-connector)

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

### 将 Amazon S3 用于数据目标
<a name="edit-job-target-S3"></a>

对于 Amazon S3 和连接器之外的所有数据源，表必须位于您所选择源类型的 AWS Glue Data Catalog 中。AWS Glue Studio 不会创建数据目录表。

**配置写入 Amazon S3 的数据目标节点**

1. 转到新任务或已保存任务的可视编辑器。

1. 在任务图中选择一个数据源节点。

1. 选择 **Data source properties (数据源属性)** 选项卡，然后输入以下信息：
   + **Format (格式)**：从列表中选择格式。数据结果的可用格式类型包括：
     + **JSON**：JavaScript 对象表示法。
     + **CSV**：逗号分隔的值。
     + **Avro**：Apache Avro JSON 二进制。
     + **Parquet**：此为自定义 Parquet 编写器类型，已针对 `DynamicFrames` 数据格式进行优化。它不需要数据预先计算的架构，而是动态计算和修改架构。
     + **ORC**：Apache 优化的行列式（ORC）格式。
     + **Apache Hudi**：此为开源数据湖存储框架，简化增量数据处理和数据管道开发。
     + **Apache Iceberg**：此为高性能的表格式，其工作原理与 SQL 表类似。
     + **Delta Lake**：此为开源数据湖存储框架，可帮助执行 ACID 交易、扩展元数据处理以及统一流式和批处理数据处理。
     + **XML**：此为可扩展标记语言（XML）。
     + **Tableau Hyper**：此为 Tableau 的内存中数据引擎技术。

     要了解有关这些格式选项的更多信息，请参阅《AWS Glue 开发人员指南》**中的 [AWS Glue 中 ETL 输入和输出的格式选项](https://docs.aws.amazon.com/glue/latest/dg/aws-glue-programming-etl-format.html)。
   + **压缩类型**：可以选择使用 `CSV`、`JSON` 或 `Parquet` 文件类型来压缩数据。默认值为无压缩，或 **None (无)**。    
[\[See the AWS documentation website for more details\]](http://docs.aws.amazon.com/zh_cn/glue/latest/dg/data-target-nodes.html)
   + **S3 Target Location (S3 目标位置)**：Amazon S3 存储桶和数据输出的位置。您可以选择 **Browse S3 (浏览 S3)** 按钮，查看您有权访问的 Amazon S3 存储桶，然后选择一个作为目标目的地。
   + **数据目录更新选项**
     + **Do not update the Data Catalog (请勿更新数据目录)**：（默认）如果您不希望任务更新数据目录（即使架构更改或添加了新分区），请选择此选项。
     + **Create a table in the Data Catalog and on subsequent runs, update the schema and add new partitions (在数据目录中创建表并在后续运行时，更新架构并添加新分区)**：如果选择此选项，任务将在第一次任务运行时创建数据目录中的表。在后续任务运行时，如果架构发生更改或添加了新分区，任务将更新数据目录表。

       您还必须从数据目录中选择数据库并输入表名。
     + **Create a table in the Data Catalog and on subsequent runs, keep existing schema and add new partitions (在数据目录中创建表，并在后续运行时保持现有架构并添加新分区)**：如果选择此选项，任务将在第一次任务运行时创建数据目录中的表。在后续任务运行时，任务只更新数据目录表以添加新分区。

       您还必须从数据目录中选择数据库并输入表名。
   + **文件分区**：选择要保存输出的分区类型。
     + **自动生成文件（推荐）**：这是生成文件数量的默认值。
     + **多文件输出**：指定所需的文件输出数量。为获得最佳性能，请使用默认的自动生成文件数量。
   + **Partition keys (分区键)**：选择要在输出中用作分区键的列。要添加更多分区键，请选择 **Add a partition key (添加分区键)**。

   如果 Tableau Hyper 用作目标格式，则不支持文件分区。

### 使用数据目标的数据目录表
<a name="edit-job-target-catalog"></a>

对于 Amazon S3 和连接器之外的所有数据源，表必须位于您所选择目标类型的 AWS Glue Data Catalog 中。AWS Glue Studio 不会创建数据目录表。

**为使用数据目录表的目标配置数据属性**

1. 转到新任务或已保存任务的可视编辑器。

1. 在任务图中选择一个数据目标节点。

1. 选择 **Data target properties (数据目标属性)** 选项卡，然后输入以下信息：
   + **Database (数据库)**：从列表中选择包含用作目标的表的数据库。此数据库必须已存在于数据目录中。
   + **Table (表)**：从列表中选择定义输出数据架构的表。此表必须已存在于数据目录中。

     数据目录中的表包含列的名称、数据类型定义、分区信息以及有关目标数据集的其他元数据。您的任务写入数据目录中此表描述的位置。

     有关在数据目录中创建表的更多信息，请参阅 *AWS Glue 开发人员指南*中的[在数据目录中定义表](https://docs.aws.amazon.com/glue/latest/dg/tables-described.html)。
   + **数据目录更新选项**
     + **Do not change table definition (请勿更改表定义)**：（默认）如果不希望任务更新数据目录（即使架构更改或添加了新分区），请选择此选项。
     + **Update schema and add new partitions (更新架构并添加新分区)**：如果选择此选项，任务将更新数据目录表（如果架构更改或添加新分区）。
     + **Keep existing schema and add new partitions (保留现有架构并添加新分区)**：如果选择此选项，任务将仅为了添加新分区而更新数据目录表。
     + **Partition keys (分区键)**：选择要在输出中用作分区键的列。要添加更多分区键，请选择 **Add a partition key (添加分区键)**。

### 将连接器用作数据目标
<a name="edit-job-target-connector"></a>

如果您为 **Node type (节点类型)** 选择连接器，请按照 [使用自定义连接器编写任务](job-authoring-custom-connectors.md) 中的说明操作，完成数据目标属性的配置。

# 编辑或上载任务脚本
<a name="edit-nodes-script"></a>

使用 AWS Glue Studio 可视化编辑器编辑任务脚本或上载您自己的脚本。

仅当任务使用 AWS Glue Studio 创建时，您才能使用可视化编辑器编辑任务节点。如果任务是使用 AWS Glue 控制台、通过 API 命令或命令行界面（CLI）创建，您可以使用 AWS Glue Studio 中的脚本编辑器编辑任务脚本、参数和计划。您还可以将任务转换为仅脚本模式，编辑 AWS Glue Studio 中所创建任务的脚本。

**编辑任务脚本或上载您自己的脚本**

1. 如果创建新任务，请在 **Jobs (任务)** 页面上，选择 **Spark script editor (Spark 脚本编辑器)** 选项创建 Spark 任务，或选择 **Python Shell script editor (Python Shell 脚本编辑器)** 创建 Python Shell 任务。您可以编写新脚本，也可以上载现有脚本。如果选择 **Spark script editor (Spark 脚本编辑器)**，您可以编写或上载 Scala 脚本或 Python 脚本。如果选择 **Python Shell script editor (Python Shell 脚本编辑器)**，则只能编写或上载 Python 脚本。

   选择用于创建新任务的选项后，在显示的 **Options (选项)** 部分，您可以使用启动程序脚本（**使用 boilerplate 代码创建新脚本**）启动，也可以上载本地文件以用作任务脚本。

   如果选择 **Spark script editor (Spark 脚本编辑器)**，您可以上载 Python 或 Scala 脚本文件。Scala 脚本必须具有文件扩展名 `.scala`。您必须将 Python 脚本识别为 Python 类型的文件。如果选择 **Python Shell script editor (Python Shell 脚本编辑器)**，则只能上载 Python 脚本文件。

   完成选择后，选择 **Create (创建)** 创建任务并打开可视化编辑器。

1. 转到新任务或已保存任务的可视任务编辑器，然后选择 **Script (脚本)** 选项卡。

1. 如果未使用脚本编辑器选项创建新任务，并且从未编辑过现有任务的脚本，则 **Script (脚本)** 选项卡显示标题 **Script (Locked) (脚本（已锁定）)**。这意味着脚本编辑器处于只读模式。选择 **Edit script (编辑脚本)** 解锁脚本以进行编辑。

   要使脚本可编辑，AWS Glue Studio 将您的任务从可视化任务转换为仅脚本任务。如果解锁脚本进行编辑，则在保存此任务后，无法再使用可视化编辑器。

   在确认窗口中，选择 **Confirm (确认)** 以继续浏览，或选择 **Cancel (取消)** 以保持任务可用于可视化编辑。

   如果选择 **Confirm (确认)**，**Visual (可视化)** 选项卡不再显示在编辑器中。您可以使用 AWS Glue Studio 可使用脚本编辑器修改脚本、修改任务详细信息或调度，或查看任务运行。
**注意**  
在保存任务之前，转换为仅脚本任务不是永久性操作。如果您刷新控制台网页，或者在保存之前关闭任务并在可视编辑器中重新打开它，则仍然可以在可视编辑器中编辑各个节点。

1. 根据需要编辑脚本。

   编辑完脚本后，选择 **Save (保存)** 保存任务并将任务从可视化对象永久转换为仅脚本。

1. （可选）您可以在 **Script (脚本)** 选项卡上选择 **Download (下载)** 按钮，从 AWS Glue Studio 控制台下载脚本。选择此按钮后，将打开一个新的浏览器窗口，其中显示脚本在 Amazon S3 中的位置。任务的 **Job details (任务详细信息)** 选项卡中的 **Script filename** 和 **Script path** 参数确定脚本文件在 Amazon S3 中的名称和位置。  
![\[\]](http://docs.aws.amazon.com/zh_cn/glue/latest/dg/images/job-details-script-location-params-screenshot.png)

   保存任务时，AWS Glue 将任务脚本保存在这些字段指定的位置。如果您在 Amazon S3 中修改此位置的脚本文件，AWS Glue Studio 将在您下次编辑任务时加载修改后的脚本。

## 在 AWS Glue Studio 中创建和编辑 Scala 脚本
<a name="edit-job-scala-script"></a>

当您选择用于创建任务的脚本编辑器时，默认情况下，任务编程语言设置为 `Python 3`。如果您选择编写新脚本而不是上载脚本，AWS Glue Studio 会开启一个新的脚本，以 Python 编写样板文本。如果要改为编写 Scala 脚本，则必须首先将脚本编辑器配置为使用 Scala。

**注意**  
如果选择 Scala 作为任务的编程语言，并使用可视化编辑器设计任务，则生成的任务脚本将使用 Scala 编写，因此无需进一步操作。

**要在 AWS Glue Studio 中编写新的 Scala 脚本**

1. 创建新任务，方法是选择 **Spark script editor (Spark 脚本编辑器)** 选项。

1. 在 **Options (选项)** 下面，选择 **Create a new script with boilerplate code (使用样板代码创建新脚本)**。

1. 选择 **Job details (任务详细信息)** 选项卡，将 **Language (语言)** 设置为 `Scala`（而不是 `Python 3`）。
**注意**  
当您选择 **Spark script editor (Spark 脚本编辑器)** 选项创建任务，**Type (类型)** 属性将自动设置为 `Spark`。

1. 选择 **Script (脚本)** 选项卡。

1. 删除 Python 样板文本。您可以用以下 Scala 样板文本替换。

   ```
   import com.amazonaws.services.glue.{DynamicRecord, GlueContext}
   import org.apache.spark.SparkContext
   import com.amazonaws.services.glue.util.JsonOptions
   import com.amazonaws.services.glue.util.GlueArgParser
   import com.amazonaws.services.glue.util.Job
   
   object MyScript {
     def main(args: Array[String]): Unit = {
       val sc: SparkContext = new SparkContext()
       val glueContext: GlueContext = new GlueContext(sc)
   
       }
   }
   ```

1. 在编辑器中编写您的 Scala 任务脚本。您可以根据需要添加其他 `import` 语句。

## 在 AWS Glue Studio 中创建和编辑 Python Shell 任务
<a name="edit-job-python-shell"></a>

选择 Python shell 脚本编辑器来创建任务时，可以上载现有 Python 脚本或编写新脚本。如果选择编写新脚本，样板代码将添加到新的 Python 任务脚本中。

**创建新的 Python Shell 任务**  
请参阅[在 AWS Glue Studio 中启动作业](edit-nodes-chapter.md#create-jobs-start)中的说明。

Python Shell 任务支持的任务属性与 Spark 任务支持的任务属性不同。下面的列表描述了 **Job details (任务详细信息)** 选项卡上对 Python Shell 任务的可用任务参数所做的更改。
+ 任务的 **Type (类型)** 属性将自动设置为 `Python Shell`，而且无法更改。
+ 有面向任务的 **Python version (Python 版本)** 属性，而不是 **Language (语言)**。目前，Python Shell 任务在 AWS Glue Studio 中使用 Python 3.6。
+ **Glue version (Glue 版本)** 属性不可用，因为它不适用于 Python Shell 任务。
+ 显示 **Data processing units (数据处理单元)** 属性，而不是 **Worker type (工件类型)** 和 **Number of workers (工件数)**。此任务属性确定 Python Shell 在运行任务时使用的数据处理单元（DPU）数量。
+ **Job bookmark (任务书签)** 属性不可用，因为 Python Shell 任务不支持该属性。
+ 在 **Advanced properties (高级属性)** 下面，以下属性不适用于 Python Shell 任务。
  + **作业指标**
  + **连续日志记录**
  + **Spark UI** 和 **Spark UI 日志路径**
  + 标题 **Libraries (库)** 下面的 **Dependent jars path (从属 jars 路径)**

# 更改任务图中节点的父节点
<a name="edit-job-change-parents"></a>

您可以更改节点的父节点，以便在任务图中移动节点或更改节点的数据源。

**更改父节点**

1. 选择任务图中要修改的节点。

1. 在节点详细信息面板中，在标题 **Node parents (父节点)** 下的 **Node properties (节点属性)** 选项卡上删除节点的当前父节点。

1. 从列表中选择新的父节点。

1. 根据需要修改节点的其他属性以匹配新选定的父节点。

如果您错误修改了节点，您可以使用 **Undo (撤消)** 按钮以反转操作。

# 从任务图中删除节点
<a name="edit-job-delete-node"></a>

 使用 Visual ETL 作业时，您可以从画布中移除节点，而不必重新添加或重构连接到已移除节点的任何节点。

 在下面的示例中，您可以选择 **ETL 作业 > Visual ETL**，然后在**示例作业**中选择 **要加入多个源的 Visual ETL 作业**。选择**创建示例作业**以创建作业，然后按照以下步骤操作。

![\[屏幕截图显示了示例作业面板，其中选择了要加入多个源的 Visual ETL 作业示例作业。\]](http://docs.aws.amazon.com/zh_cn/glue/latest/dg/images/visual-etl-example-jobs-create.png)


**从画布中移除节点**

1.  在 AWS Glue 控制台中，从导航菜单中选择 **Visual ETL**，然后选择一个现有的作业。作业画布显示如下所示的示例作业。  
![\[屏幕截图显示了从示例作业生成的作业图。\]](http://docs.aws.amazon.com/zh_cn/glue/latest/dg/images/visual-job-example-job-nodes.png)

1.  选择要删除的节点。画布将放大到该节点。在画布右侧的工具栏中，选择**垃圾桶**图标。这将移除该节点，任何连接到该节点的节点都将移动，以取代其在工作流中的位置。在此示例中，第一个 **Join** 节点已从画布中删除。

    如果删除工作流中的节点，则 AWS Glue 会重新排列这些节点，确保其组织方式不会导致工作流无效。您可能仍需要更正节点的配置。

    在示例中，**Subscribers** 节点下的 **Join** 节点已被移除。因此，**Plans** 源节点已移至顶层，并且仍与子节点 **Join** 相连。**Join** 节点现在需要额外的配置，因为 **Join** 需要两个带有选定表的父级源节点。画布右侧的**转换**选项卡在**加入条件**下显示缺少的要求。  
![\[屏幕截图显示了作业图，其中父节点是两个源节点：Plan assignment 和 Subscribers。这两个节点连接到 Join 节点。Plans 源节点和 Join 节点连接到 Change Schema 节点。Catalog 节点已连接到 Change schema 节点。\]](http://docs.aws.amazon.com/zh_cn/glue/latest/dg/images/visual-job-delete-node-join-plans.png)

1.  删除第二个 **Join** 节点和 **Select Fields** 节点。删除节点后，工作流将如下所示。  
![\[屏幕截图显示了一个作业图，其中 Join 节点和 Select Fields 节点已被移除，与之连接的 Change Schema 节点已向上移动以取代其在作业流中的位置。\]](http://docs.aws.amazon.com/zh_cn/glue/latest/dg/images/visual-job-three-data-sources-rearranged.png)

1.  要修改节点连接，请单击节点的手柄并将连接拖动到新节点。这样，您将可以删除节点并重新排列逻辑流中的节点。在此示例中，通过单击 Plans 节点上的手柄并将连接拖动到 Join 节点来建立新的连接，如红色箭头所示。  
![\[屏幕截图显示了一个作业图，其中手柄用红色圆圈包围，红色箭头连接 Plans 节点和 Join 节点，以演示通过单击和拖动将节点连接在一起的操作。\]](http://docs.aws.amazon.com/zh_cn/glue/latest/dg/images/visual-job-plans-node-handle-selected.png)

1.  如果您需要撤消任何操作，请选择画布右侧工具栏中**垃圾桶**图标正下方的**撤销**图标。

# 将源和目标参数添加到 AWS Glue 数据目录节点
<a name="edit-job-add-job-parameters"></a>

 AWS Glue Studio 允许您对视觉作业进行参数化。由于生产和开发环境中的目录表名称可能不同，因此您可以为将在作业运行时运行的数据库和表定义和选择运行时参数。

 使用 AWS Glue 数据目录节点时，作业参数允许您参数化源和目标，并将这些参数保存在作业中。当您将源和目标指定为参数时，就实现了作业的可重用性，尤其是在多个环境中使用同一个作业时。通过节省管理源和目标的时间和精力，此功能有助于跨部署环境提升代码。此外，您指定的自定义参数将覆盖 AWS Glue 作业特定运行的任何默认参数。

 **添加源和目标参数** 

 无论您使用 AWS Glue 数据目录节点作为源或目标，都可以在 **Job details**（作业详情）选项卡的 **Advanced properties**（高级属性）部分中定义运行时参数。

1.  选择 AWS Glue 数据目录节点作为源节点或目标节点。

1.  选择 **Job details**（任务详细信息）选项卡。

1.  选择 **Advanced properties**（高级属性）。

1.  在 Job parameters（作业参数）部分中，输入键值。例如，`--db.source` 将是数据库源的参数。您可以为键输入任何名称，只要键名称后面带有“破折号”即可。  
![\[屏幕截图显示了 Job details（作业详情）选项卡中的作业参数部分。您可以为数据库和表定义要在运行时使用的参数。\]](http://docs.aws.amazon.com/zh_cn/glue/latest/dg/images/Data_Catalog_node_job_details_job_parameters.png)

1.  输入值。例如，`databasename` 将是正在参数化的数据库的值。

1.  如果您要添加更多参数，请选择 **Add new parameter**（添加新参数）。最多允许 50 个参数。一旦定义了键值对，就可以在 AWS Glue 数据目录节点中使用该参数。

 **选择运行时参数** 

**注意**  
 无论 AWS Glue 数据目录节点是源节点还是目标节点，为数据库和表选择运行时参数的过程均相同。

1.  选择 AWS Glue 数据目录节点作为源节点或目标节点。

1.  在 **Data source properties - Data Catalog**（数据源属性 - 数据目录）选项卡中的 **Database**（数据库）下方，选择 **Use runtime parameters**（使用运行时参数）。  
![\[屏幕截图显示了运行时参数下拉菜单。您可以为数据库和表选择要在运行时使用的任何已定义参数。\]](http://docs.aws.amazon.com/zh_cn/glue/latest/dg/images/Data_Catalog_node_select_runtime_parameters.png)

1.  从下拉菜单中选择参数。例如，如果选择为源数据库定义的参数，该数据库将在您选择 **Apply**（应用）时自动填充到数据库下拉菜单中。

1.  在 Table（表）部分中，选择已定义为源表的参数。在选择 **Apply**（应用）时，该表将自动填充为要使用的表。

1.  保存并运行作业时，AWS Glue Studio 将在作业运行期间引用选定的参数。

# 在 AWS Glue 中使用 Git 版本控制系统
<a name="edit-job-add-source-control-integration"></a>

**注意**  
 AWS Glue Studio 中目前不支持笔记本电脑进行版本控制。但是，支持 AWS Glue 作业脚本和可视化 ETL 作业的版本控制。

 如果您有远程存储库，并且想要使用存储库管理 AWS Glue 作业，则可以使用 AWS Glue Studio 或 AWS CLI，将更改同步到您的存储库和 AWS Glue 中的作业。以这种方式同步更改时，就是在将作业从 AWS Glue Studio 推送到存储库，或者从存储库中提取到 AWS Glue Studio。

 通过在 AWS Glue Studio 中集成 Git，您可以：
+  与 AWS CodeCommit、GitHub、GitLab 和 Bitbucket 等 Git 版本控制系统集成 
+  编辑 AWS Glue Studio 中的 AWS Glue 作业（无论是使用可视化作业还是脚本作业）并将它们同步到存储库 
+  参数化作业中的源和目标 
+  从存储库中提取作业并在 AWS Glue Studio 中进行编辑 
+  使用 AWS Glue Studio 中的多分支工作流从分支提取和/或推送到分支，以此测试作业 
+  从存储库下载文件并将任务上传到 AWS Glue Studio 以创建跨账户作业 
+  使用选择的自动化工具（例如 Jenkins、AWS CodeDeploy 等） 

这段视频演示了如何将 AWS Glue 与 Git 集成并构建持续的协作代码管道。

[![AWS Videos](http://img.youtube.com/vi/https://www.youtube.com/embed/XRlZq2kvE4U/0.jpg)](http://www.youtube.com/watch?v=https://www.youtube.com/embed/XRlZq2kvE4U)


## IAM 权限
<a name="git-integration-permissions"></a>

 确保作业具有下列 IAM 权限之一。有关如何设置 IAM 权限的更多信息，请参阅[为 AWS Glue Studio 设置 IAM 权限](https://docs.aws.amazon.com/glue/latest/ug/setting-up.html?icmpid=docs_glue_studio_helppanel#getting-started-iam-permissions)。
+ `AWSGlueServiceRole`
+ `AWSGlueConsoleFullAccess`

 Git 集成至少需要以下操作：
+  `glue:UpdateJobFromSourceControl` — 能够使用版本控制系统中存在的作业更新 AWS Glue 
+  `glue:UpdateSourceControlFromJob` — 能够使用存储在 AWS Glue 中的作业更新版本控制系统 
+  `s3:GetObject` — 能够在推送到版本控制系统的同时检索作业脚本 
+  `s3:PutObject` — 能够在从源代码控制系统提取作业时更新脚本 

## 先决条件
<a name="edit-job-push-source-repository-prerequisites"></a>

 要将作业推送到源代码控制存储库，您需要：
+  您的管理员已经创建的存储库 
+  存储库中的一个分支 
+  个人访问令牌（对于 Bitbucket，这是存储库访问令牌） 
+  存储库所有者的用户名 
+  在存储库中设置权限以允许 AWS Glue Studio 读取和写入存储库 
  +  **GitLab** – 将令牌范围设置为 api、read\$1repository 和 write\$1repository 
  +  **Bitbucket** – 将权限设置为：
    + **工作区成员资格** – 读取、写入
    + **项目** – 写入，管理员读取
    + **存储库** – 读取、写入、管理、删除

**注意**  
 使用 AWS CodeCommit 时，不需要个人访问令牌和存储库所有者。请参阅 [Git 和 AWS CodeCommit 入门](https://docs.aws.amazon.com/codecommit/latest/userguide/getting-started.html)。

 **在 AWS Glue Studio 中使用源代码控制存储库中的作业** 

 要从源代码控制存储库提取不在 AWS Glue Studio 中的作业，然后在 AWS Glue Studio 中使用该作业，先决条件将取决于作业的类型。

 **对于可视化作业：**
+  您需要与作业名称相匹配的文件夹和作业定义 JSON 文件 

   例如，请参阅下面的作业定义。存储库中的分支应包含路径 `my-visual-job/my-visual-job.json`，其中文件夹和 JSON 文件与作业名称匹配 

  ```
  {
    "name" : "my-visual-job",
    "description" : "",
    "role" : "arn:aws:iam::aws_account_id:role/Rolename",
    "command" : {
      "name" : "glueetl",
      "scriptLocation" : "s3://foldername/scripts/my-visual-job.py",
      "pythonVersion" : "3"
    },
    "codeGenConfigurationNodes" : "{\"node-nodeID\":{\"S3CsvSource\":{\"AdditionalOptions\":{\"EnableSamplePath\":false,\"SamplePath\":\"s3://notebook-test-input/netflix_titles.csv\"},\"Escaper\":\"\",\"Exclusions\":[],\"Name\":\"Amazon S3\",\"OptimizePerformance\":false,\"OutputSchemas\":[{\"Columns\":[{\"Name\":\"show_id\",\"Type\":\"string\"},{\"Name\":\"type\",\"Type\":\"string\"},{\"Name\":\"title\",\"Type\":\"choice\"},{\"Name\":\"director\",\"Type\":\"string\"},{\"Name\":\"cast\",\"Type\":\"string\"},{\"Name\":\"country\",\"Type\":\"string\"},{\"Name\":\"date_added\",\"Type\":\"string\"},{\"Name\":\"release_year\",\"Type\":\"bigint\"},{\"Name\":\"rating\",\"Type\":\"string\"},{\"Name\":\"duration\",\"Type\":\"string\"},{\"Name\":\"listed_in\",\"Type\":\"string\"},{\"Name\":\"description\",\"Type\":\"string\"}]}],\"Paths\":[\"s3://dalamgir-notebook-test-input/netflix_titles.csv\"],\"QuoteChar\":\"quote\",\"Recurse\":true,\"Separator\":\"comma\",\"WithHeader\":true}}}"
  }
  ```

 **对于脚本作业：**
+  您需要文件夹、作业定义的 JSON 文件和脚本 
+  该文件夹和 JSON 文件应与作业名称相匹配。脚本名称需要匹配作业定义中 `scriptLocation` 以及文件扩展名 

   例如，在下面的作业定义中，存储库中的分支应包含路径 `my-script-job/my-script-job.json` 和 `my-script-job/my-script-job.py`。脚本名称应与包括脚本的扩展名的 `scriptLocation` 中的名称相匹配 

  ```
  {
    "name" : "my-script-job",
    "description" : "",
    "role" : "arn:aws:iam::aws_account_id:role/Rolename",
    "command" : {
      "name" : "glueetl",
      "scriptLocation" : "s3://foldername/scripts/my-script-job.py",
      "pythonVersion" : "3"
    }
  }
  ```

## 限制
<a name="edit-job-repository-limitations"></a>
+  AWS Glue 目前不支持从 [GitLab-Groups](https://docs.gitlab.com/ee/user/group) 推送/拉取。

## 将版本控制存储库连接到 AWS Glue
<a name="edit-job-connecting-repositories"></a>

 您可以输入版本控制存储库的详细信息并在 AWS Glue Studio 作业编辑器的 **Version Control**（版本控制）选项卡中管理它们。要与 Git 存储库集成，您必须在每次登录 AWS Glue Studio 时连接到存储库。

 要连接 Git 版本控制系统，请执行以下操作：

1.  在 AWS Glue Studio 中，开始新作业，然后选择 **Version Control**（版本控制）选项卡。  
![\[屏幕截图显示了选中 Version Control（版本控制）选项卡的作业。\]](http://docs.aws.amazon.com/zh_cn/glue/latest/dg/images/editing-nodes-version-control-tab.png)

1.  在**版本控制系统**中，通过单击下拉菜单从可用选项中选择 Git 服务。
   +  AWS CodeCommit 
   +  GitHub 
   + GitLab
   + Bitbucket

1.  根据您选择的 Git 版本控制系统，需要填写的字段有所不同。

   

    **对于 AWS CodeCommit**：

    通过为作业选择存储库和分支来完成存储库配置：
   +  **存储库** — 如果您在 AWS CodeCommit 中设置了存储库，则从下拉菜单中选择存储库。您的存储库将自动填充到列表中 
   +  **分支** — 从下拉菜单中选择分支 
   +  **文件夹** — *可选* - 输入保存作业的文件夹的名称。如果留空，则会自动创建文件夹。文件夹名称默认为作业名称 

   

    **对于 GitHub**：

    填写以下字段以完成 GitHub 配置：
   +  **个人访问令牌** — 这是 GitHub 存储库提供的令牌。有关个人访问令牌的更多信息，请参阅 [GitHub 文档](https://docs.github.com/en/authentication/keeping-your-account-and-data-secure/creating-a-personal-access-token) 
   +  **存储库所有者** — 这是 GitHub 存储库的所有者。

    从 GitHub 中选择储存库和分支以完成存储库配置。
   +  **存储库** — 如果您已在 GitHub 中设置存储库，请从下拉菜单中选择存储库。您的存储库将自动填充到列表中 
   +  **分支** — 从下拉菜单中选择分支 
   +  **文件夹** — *可选* - 输入保存作业的文件夹的名称。如果留空，则会自动创建文件夹。文件夹名称默认为作业名称 

   

    **对于 GitLab**：
**注意**  
 AWS Glue 目前不支持从 [GitLab-Groups](https://docs.gitlab.com/ee/user/group) 推送/拉取。
   +  **个人访问令牌** – 这是 GitHub 存储库提供的令牌。有关个人访问令牌的更多信息，请参阅 [GitLab 个人访问令牌](https://docs.gitlab.com/ee/user/profile/personal_access_tokens.html) 
   +  **存储库所有者** – 这是 GitHub 存储库的所有者。

    从 GitHub 中选择储存库和分支以完成存储库配置。
   +  **存储库** – 如果您已在 GitHub 中设置存储库，请从下拉菜单中选择存储库。您的存储库将自动填充到列表中 
   +  **分支** — 从下拉菜单中选择分支 
   +  **文件夹** — *可选* - 输入保存作业的文件夹的名称。如果留空，则会自动创建文件夹。文件夹名称默认为作业名称 

    **对于 Bitbucket**：
   +  **应用程序密码** – Bitbucket 使用应用程序密码而不是存储库访问令牌。有关应用程序密码的更多信息，请参阅[应用程序密码](https://support.atlassian.com/bitbucket-cloud/docs/app-passwords/)。
   +  **存储库所有者** – 这是 Bitbucket 存储库的所有者。在 Bitbucket 中，所有者是存储库的创建者。

    从 Bitbucket 中选择工作区、储存库、分支和文件夹以完成存储库配置。
   +  **工作区** – 如果您已在 Bitbucket 中设置工作区，请从下拉菜单中选择工作区。您的工作区会自动填充 
   +  **存储库** – 如果您在 Bitbucket 中设置了存储库，则从下拉菜单中选择存储库。您的存储库会自动填充 
   +  **分支** – 从下拉菜单中选择分支。您的分支会自动填充 
   +  **文件夹** — *可选* - 输入保存作业的文件夹的名称。如果留空，则会使用作业名称自动创建文件夹。

1.  在 AWS Glue Studio 作业的顶部，选择 **Save**（保存） 

## 推送 AWS Glue 作业到源存储库
<a name="edit-job-push-source-repository"></a>

 输入版本控制系统的详细信息后，可以在 AWS Glue Studio 中编辑作业并将作业推送到您的源存储库。如果您不熟悉 Git 概念，如推送和提取，请参阅 [Git 和 AWS CodeCommit 入门](https://docs.aws.amazon.com/codecommit/latest/userguide/getting-started.html)上的此教程。

 要将作业推送到存储库，您需要输入版本控制系统的详细信息并保存作业。

1.  在 AWS Glue Studio 作业中，选择 **Actions**（操作）。这将打开其他菜单选项。  
![\[屏幕截图显示了已打开 Actions（操作）菜单的作业。Push to repository（推送到存储库）选项可见。\]](http://docs.aws.amazon.com/zh_cn/glue/latest/dg/images/editing-nodes-actions-push-to-repository.png)

1.  选择 **Push to repository**（推送到存储库）。

    此操作将保存作业。推送到存储库时，AWS Glue Studio 推送上次保存的更改。如果存储库中的作业被您或其他用户修改，并且与 AWS Glue Studio 中的作业不同步，则在您从 AWS Glue Studio 推送作业时，存储库中的作业会被保存在 AWS Glue Studio 中的作业覆盖。

1.  选择 **Confirm**（确认）以完成操作。这会在存储库中创建新的提交。如果您使用 AWS CodeCommit，一条确认消息将显示指向 AWS CodeCommit 上最新提交的链接。

## 从源存储库提取 AWS Glue 作业
<a name="edit-job-pull-source-repository"></a>

 将 Git 存储库的详细信息输入到 **Version control**（版本控制）选项卡之后，您也可以从存储库中提取作业并在 AWS Glue Studio 中进行编辑。

1.  在 AWS Glue Studio 作业中，选择 **Actions**（操作）。这将打开其他菜单选项。  
![\[屏幕截图显示了已打开 Actions（操作）菜单的作业。Push to repository（推送到存储库）选项可见。\]](http://docs.aws.amazon.com/zh_cn/glue/latest/dg/images/editing-nodes-actions-push-to-repository.png)

1.  选择 **Pull from repository**（从存储库中提取）。

1.  选择**确认**。这会从存储库中获取最新的提交，并在 AWS Glue Studio 中更新您的作业。

1.  在 AWS Glue Studio 中编辑您的作业。如果您进行了更改，则可以通过选择 **Actions**（操作）下拉菜单中的 **Push to repository**（推送到存储库）来将作业同步到存储库。