本文属于机器翻译版本。若本译文内容与英语原文存在差异,则一律以英文原文为准。
创建和使用 AWS Glue DataBrew 食谱
在中 DataBrew,配方是一组数据转换步骤。您可以将这些步骤应用于数据样本,也可以将相同的方法应用于数据集。
开发配方的最简单方法是创建一个 DataBrew 项目,您可以在其中以交互方式处理数据样本——有关更多信息,请参阅。创建和使用 AWS Glue DataBrew 项目作为项目创建工作流程的一部分,将创建一个新的(空的)配方并将其附加到项目中。然后,您可以通过添加数据转换开始构建配方。
注意
一个 DataBrew 配方最多可包含 100 个数据转换。
在继续开发食谱时,您可以通过发布食谱来保存您所做的工作。 DataBrew 为您的食谱维护已发布版本的列表。您可以在配方作业中使用任何已发布的版本来运行配方(在配方作业中)来转换您的数据集。您也可以下载配方步骤的副本,以便可以在其他项目或其他数据集转换中重复使用该配方。
您也可以使用 AWS Command Line Interface (AWS CLI) 或其中一个 AWS SDK 以编程方式开发 DataBrew 配方。在 DataBrew API 中,转换被称为配方操作。
注意
在交互式 DataBrew 项目会话中,您应用的每次数据转换都会导致对 DataBrew API 的调用。这些 API 调用会自动发生,您无需知道 behind-the-scenes 细节。
即使你不是程序员,了解配方的结构以及如何 DataBrew 组织配方操作也会很有帮助。
发布配方的新版本
您可以在交互式 DataBrew 项目会话中发布配方的新版本。
发布的新配方版本
-
在配方窗格中,选择 “发布”。
-
输入此版本食谱的描述,然后选择 “发布”。
您可以通过从导航窗格中选择 PROJECTS 来查看所有已发布的食谱及其版本。
定义配方结构
首次使用 DataBrew 控制台创建项目时,需要定义与该项目关联的配方。如果您没有现有配方,控制台将为您创建配方。
在控制台中处理项目时,您可以使用转换工具栏对数据集中的示例数据应用操作。在您继续构建配方时,控制台会显示配方步骤以及这些步骤的顺序。您可以对配方进行迭代和完善,直到您对步骤感到满意为止。
在中入门 AWS Glue DataBrew,你构建了一个用于转换著名国际象棋游戏数据集的配方。您可以通过选择 “下载为 JSON” 或 “下载为 YAML” 来下载配方步骤的副本,如以下屏幕截图所示。
![Dropdown menu showing options to import recipe and download as YAML or JSON.](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
— 要筛选出所有玩家评分低于 1,800 的游戏,这是成为 A 级国际象棋选手所需的最低评分。这种动作有两次出现,一次是移除黑方不是 A 级玩家的玩家,另一次是移除白方没有达到这个等级的玩家。 -
GROUP_BY
— 汇总数据。在这种情况下,GROUP_BY 根据winner
(black
和white
)的值将行分成几组。然后进一步细分每个组,根据victory_status
(、mate
resign
outoftime
、和draw
) 的值将行分成子组。最后,计算每个子组的出现次数。然后,生成的摘要将替换原始数据样本。 -
REMOVE_VALUES
— 删除结尾为的游戏的结果draw
。 -
REPLACE_TEXT
— 修改的值victory_status
。此操作会出现三次,分别用于mate
、和。resign
oufoftime
在交互式 DataBrew 项目会话中,每个会话RecipeAction
对应于您应用于数据样本的数据转换。
DataBrew 提供 200 多个配方操作。有关更多信息,请参阅 配方步骤和功能参考。
使用条件
您可以使用条件来缩小配方操作的范围。条件用于筛选数据的转换,例如,根据特定的列值删除不需要的行。
让我们更仔细地看看中的配方操作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
值小于 1,800 的行都将从数据集中移除。
对于,配方中的后续改造也会起到同样的作用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
— 该列中没有值。