创建和使用 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 调用自动发生,您无需了解幕后细节。
即使您不是程序员,了解配方的结构以及 DataBrew 如何组织配方操作也会很有帮助。
发布新配方版本
您可以在交互式 DataBrew 项目会话中发布配方的新版本。
发布新配方版本
-
在配方窗格中,选择发布。
-
输入此版本配方的描述,然后选择发布。
您可以通过从导航窗格中选择项目来查看所有已发布的配方及其版本。
定义配方结构
首次使用 DataBrew 控制台创建项目时,需要定义与该项目关联的配方。如果您没有现有配方,则控制台将为您创建一个。
在控制台中处理项目时,您可以使用转换工具栏对数据集中的样本数据应用操作。在您继续构建配方时,控制台会显示配方步骤以及这些步骤的顺序。您可以迭代和完善配方,直到您对步骤感到满意为止。
在 AWS Glue DataBrew 入门 中,您已构建一个用于转换著名国际象棋比赛数据集的配方。您可以通过选择下载为 JSON 或下载为 YAML 来下载配方步骤副本,如以下屏幕截图所示。
下载的 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_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 值小于 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:列中没有值。