

本文属于机器翻译版本。若本译文内容与英语原文存在差异，则一律以英文原文为准。

# 创建和使用 AWS Glue DataBrew 配方
<a name="recipes"></a>

在 DataBrew 中，*配方*是一组数据转换步骤。您可以将这些步骤应用于数据样本，也可以将相同的配方应用于数据集。

开发配方的最简单方法是创建 DataBrew 项目，您可以在其中以交互方式处理数据样本——有关更多信息，请参阅[创建和使用 AWS Glue DataBrew 项目](projects.md)。作为项目创建工作流的一部分，将创建一个新（空）的配方并将其附加到项目。然后，您可以通过添加数据转换开始构建配方。

**注意**  
一个 DataBrew 配方最多可以包含 100 个数据转换。

在继续开发配方时，您可以通过*发布*配方保存您所做的工作。DataBrew 会为您的配方保留一份已发布的版本列表。您可以在配方作业中使用任何已发布的版本来运行配方（在配方作业中），以此转换您的数据集。您也可以下载配方步骤副本，以便可以在其他项目或其他数据集转换中重复使用该配方。

您还可以使用 AWS Command Line Interface（AWS CLI）或 AWS SDK 之一，以编程方式开发 DataBrew 配方。在 DataBrew API 中，转换被称为*配方操作*。

**注意**  
在交互式 DataBrew 项目会话中，您应用的每次数据转换都会导致调用 DataBrew API。这些 API 调用自动发生，您无需了解幕后细节。

即使您不是程序员，了解配方的结构以及 DataBrew 如何组织配方操作也会很有帮助。

**Topics**
+ [

## 发布新配方版本
](#recipes.publishing)
+ [

## 定义配方结构
](#recipes.structure)

## 发布新配方版本
<a name="recipes.publishing"></a>

您可以在交互式 DataBrew 项目会话中发布配方的新版本。

**发布新配方版本**

1. 在配方窗格中，选择**发布**。

1. 输入此版本配方的描述，然后选择**发布**。

您可以通过从导航窗格中选择**项目**来查看所有已发布的配方及其版本。

## 定义配方结构
<a name="recipes.structure"></a>

首次使用 DataBrew 控制台创建项目时，需要定义与该项目关联的配方。如果您没有现有配方，则控制台将为您创建一个。

在控制台中处理项目时，您可以使用转换工具栏对数据集中的样本数据应用操作。在您继续构建配方时，控制台会显示配方步骤以及这些步骤的顺序。您可以迭代和完善配方，直到您对步骤感到满意为止。

在 [AWS Glue DataBrew 入门](getting-started.md) 中，您已构建一个用于转换著名国际象棋比赛数据集的配方。您可以通过选择**下载为 JSON** 或**下载为 YAML** 来下载配方步骤副本，如以下屏幕截图所示。

![\[Dropdown menu showing options to import recipe and download as YAML or JSON.\]](http://docs.aws.amazon.com/zh_cn/databrew/latest/dg/images/project-view-download-json.png)


下载的 JSON 文件包含与您添加到配方中的转换相对应的配方操作。

一个新配方不包含任何步骤。您可以将新配方表示为空 JSON 列表，如下所示。

```
[ ]
```

以下是这样一个文件的示例，针对的是 `chess-project-recipe`。JSON 列表包含描述配方步骤的多个对象。JSON 列表中的每个对象都用大括号（`{ }`）括起来。JSON 行用逗号分隔。

```
[
    {
        "Action": {
            "Operation": "REMOVE_VALUES",
            "Parameters": {
                "sourceColumn": "black_rating"
            }
        },
        "ConditionExpressions": [
            {
                "Condition": "LESS_THAN",
                "Value": "1800",
                "TargetColumn": "black_rating"
            }
        ]
    },
    {
        "Action": {
            "Operation": "REMOVE_VALUES",
            "Parameters": {
                "sourceColumn": "white_rating"
            }
        },
        "ConditionExpressions": [
            {
                "Condition": "LESS_THAN",
                "Value": "1800",
                "TargetColumn": "white_rating"
            }
        ]
    },
    {
        "Action": {
            "Operation": "GROUP_BY",
            "Parameters": {
                "groupByAggFunctionOptions": "[{\"sourceColumnName\":\"winner\",\"targetColumnName\":\"winner_count\",\"targetColumnDataType\":\"int\",\"functionName\":\"COUNT\"}]",
                "sourceColumns": "[\"winner\",\"victory_status\"]",
                "useNewDataFrame": "true"
            }
        }
    },
    {
        "Action": {
            "Operation": "REMOVE_VALUES",
            "Parameters": {
                "sourceColumn": "winner"
            }
        },
        "ConditionExpressions": [
            {
                "Condition": "IS",
                "Value": "[\"draw\"]",
                "TargetColumn": "winner"
            }
        ]
    },
    {
        "Action": {
            "Operation": "REPLACE_TEXT",
            "Parameters": {
                "pattern": "mate",
                "sourceColumn": "victory_status",
                "value": "checkmate"
            }
        }
    },
    {
        "Action": {
            "Operation": "REPLACE_TEXT",
            "Parameters": {
                "pattern": "resign",
                "sourceColumn": "victory_status",
                "value": "other player resigned"
            }
        }
    },
    {
        "Action": {
            "Operation": "REPLACE_TEXT",
            "Parameters": {
                "pattern": "outoftime",
                "sourceColumn": "victory_status",
                "value": "ran out of time"
            }
        }
    }
]
```

如果我们仅为新操作添加新行，则更容易看到，每个操作都是单独的一行，如下所示。

```
[
 { "Action": { "Operation": "REMOVE_VALUES", "Parameters": { "sourceColumn": "black_rating" } }, "ConditionExpressions": [ { "Condition": "LESS_THAN", "Value": "1800", "TargetColumn": "black_rating" } ] },
 { "Action": { "Operation": "REMOVE_VALUES", "Parameters": { "sourceColumn": "white_rating" } }, "ConditionExpressions": [ { "Condition": "LESS_THAN", "Value": "1800", "TargetColumn": "white_rating" } ] },
 { "Action": { "Operation": "GROUP_BY", "Parameters": { "groupByAggFunctionOptions": "[{\"sourceColumnName\":\"winner\",\"targetColumnName\":\"winner_count\",\"targetColumnDataType\":\"int\",\"functionName\":\"COUNT\"}]", "sourceColumns": "[\"winner\",\"victory_status\"]", "useNewDataFrame": "true" } } },
 { "Action": { "Operation": "REMOVE_VALUES", "Parameters": { "sourceColumn": "winner" } }, "ConditionExpressions": [ { "Condition": "IS", "Value": "[\"draw\"]", "TargetColumn": "winner" } ] },
 { "Action": { "Operation": "REPLACE_TEXT", "Parameters": { "pattern": "mate", "sourceColumn": "victory_status", "value": "checkmate" } } },
 { "Action": { "Operation": "REPLACE_TEXT", "Parameters": { "pattern": "resign", "sourceColumn": "victory_status", "value": "other player resigned" } } },
 { "Action": { "Operation": "REPLACE_TEXT", "Parameters": { "pattern": "outoftime", "sourceColumn": "victory_status", "value": "ran out of time" } } }
]
```

这些操作按顺序执行，与文件中的顺序相同：
+ `REMOVE_VALUES`：用于筛选出棋手评分低于 1800 的所有比赛，即成为 A 级国际象棋棋手所需的最低评分。此操作出现两次，一次用于删除黑方不是 A 级的棋手，另一次用于删除白方没有达到这个水平的棋手。
+ `GROUP_BY`：用于汇总数据。在此例中，GROUP\$1BY 根据 `winner` 的值（`black` 和 `white`）将行分成组。然后，进一步细分每个组，根据 `victory_status` 的值（`mate`、`resign`、`outoftime` 和 `draw`）将行分成子组。最后，对每个子组的出现次数进行计数。然后，生成的摘要将替换原始数据样本。
+ `REMOVE_VALUES`：用于删除结局为 `draw` 的比赛的结果。
+ `REPLACE_TEXT`：用于修改 `victory_status` 的值。此操作出现三次，`mate`、`resign` 和 `oufoftime` 各一次。

在交互式 DataBrew 项目会话中，每个 `RecipeAction` 都对应于您应用于数据样本的数据转换。

DataBrew 提供了 200 多个配方操作。有关更多信息，请参阅 [配方步骤和函数参考](recipe-actions-reference.md)。

### 使用条件
<a name="recipe-actions.conditions"></a>

您可以使用*条件*来缩小配方操作的范围。条件用于筛选数据的转换，例如，根据特定列值删除不需要的行。

现在让我们更详细地看看 `chess-project-recipe` 中的配方操作。

```
  {
    "Action": {
      "Operation": "REMOVE_VALUES",
      "Parameters": {
        "sourceColumn": "black_rating"
      }
    },
    "ConditionExpressions": [
      {
        "Condition": "LESS_THAN",
        "Value": "1800",
        "TargetColumn": "black_rating"
      }
    ]
  }
```

此转换会读取 `black_rating` 列中的值。`ConditionExpressions` 列表确定筛选标准：任何 `black_rating` 值小于 1800 的行都将从数据集中删除。

配方中的后续转换对 `white_rating` 执行相同的操作。这样，数据将限制到每位棋手（黑方或白方）都评为 A 级或以上的比赛。

以下是应用于一列字符数据的另一个条件示例。

```
  {
    "Action": {
      "Operation": "REMOVE_VALUES",
      "Parameters": {
        "sourceColumn": "winner"
      }
    },
    "ConditionExpressions": [
      {
        "Condition": "IS",
        "Value": "[\"draw\"]",
        "TargetColumn": "winner"
      }
    ]
  }
```

此转换读取 `winner` 列中的值，从而查找值 `draw` 并删除这些行。这样，数据将限制到那些有明确赢家的比赛。

DataBrew 支持以下条件：
+ `IS`：列中的值与条件中提供的值相同。
+ `IS_NOT`：列中的值与条件中提供的值不同。
+ `IS_BETWEEN`：列中的值介于 `GREATER_THAN_EQUAL` 和 `LESS_THAN_EQUAL` 参数之间。
+ `CONTAINS`：列中的字符串值包含条件中提供的值。
+ `NOT_CONTAINS`：列中的值不包含条件中提供的字符串。
+ `STARTS_WITH`：列中的值以条件中提供的字符串开头。
+ `NOT_STARTS_WITH`：列中的值不以条件中提供的字符串开头。
+ `ENDS_WITH`：列中的值以条件中提供的字符串结尾。
+ `NOT_ENDS_WITH`：列中的值不以条件中提供的字符串结尾。
+ `LESS_THAN`：列中的值小于条件中提供的值。
+ `LESS_THAN_EQUAL`：列中的值小于或等于条件中提供的值。
+ `GREATER_THAN`：列中的值大于条件中提供的值。
+ `GREATER_THAN_EQUAL`：列中的值大于或等于条件中提供的值。
+ `IS_INVALID`：列中值的数据类型不正确。
+ `IS_MISSING`：列中没有值。