AWS Glue DataBrewにレシピをインポートしてみた(AWS CLI編)

2021.07.07

データアナリティクス事業本部の鈴木です。

AWS Glue DataBrew(以降、DataBrew)のレシピを、ほかの人と共有したい場合に、どのようにすれば良いのか気になりました。前回はAWSマネジメントコンソールからの、レシピのエクスポートとインポートの手順をAWSマネジメントコンソール編として紹介しました。

AWS Glue DataBrewにレシピをインポートしてみた(AWSマネジメントコンソール編) | DevelopersIO

今回はAWS CLIで実施してみたいと思います。

記事の目的

DataBrewでは、データの前処理をレシピとして定義・保存することができます。レシピは複数の公開バージョンを持つことができ、DataBrewのサービス内でバージョン管理を行うことが可能です。

一方で、レシピファイルとしてDataBrew外へエクスポートもできるので、レシピファイルをGitHubなどで管理したり、そこからほかのメンバーや開発チームに共有したいことがあると思います。

初めてこのようなことがしたい場合に、レシピファイルのインポートの具体的な操作が分かるとイメージしやすいので、その方法を共有します。

先に結論

以下のような方法で、AWS CLIからレシピファイルをインポートすることができました。

  • update-recipeを、レシピファイルをインポートしたいレシピ名とJSON形式のレシピファイルを指定して実行する。
  • publish-recipeを、レシピファイルをインポートしたいレシピ名を指定して実行する。

やってみる

前提

レシピファイルをインポートしたいレシピを作成しておきます。

今回は、AWSマネジメントコンソール編で作成したときと同じ方法で、バージョン1.0を公開しておきました。

このレシピは、"有名なチェスゲームの動き"サンプルファイルから作成したデータセットに、以下のように3つの前処理を行います(以降、この画面をレシピ画面と呼びます)。

更新するレシピ

このレシピに対して、以下のレシピファイルをインポートしたいとしましょう。例えば、同じチームの人がもっと良いレシピを考えてくれたので、そのレシピをDataBrewの機能でエクスポートして、渡してくれたような場合です。

new_recipe.json

[
  {
    "Action": {
      "Operation": "REMOVE_VALUES",
      "Parameters": {
        "sourceColumn": "white_rating"
      }
    },
    "ConditionExpressions": [
      {
        "Condition": "LESS_THAN",
        "Value": "1800",
        "TargetColumn": "white_rating"
      }
    ]
  },
  {
    "Action": {
      "Operation": "REMOVE_VALUES",
      "Parameters": {
        "sourceColumn": "black_rating"
      }
    },
    "ConditionExpressions": [
      {
        "Condition": "LESS_THAN",
        "Value": "1800",
        "TargetColumn": "black_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\",\"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": "time ran out"
      }
    }
  }
]

このレシピファイルは、AWSマネジメントコンソール編で作成したレシピのバージョン2.0と同じです。このレシピでは、データセットに対して7ステップの前処理を行います。レシピ画面からJSON形式でエクスポートすると、このような形式でエクスポートできます。

では、レシピのインポートを行なっていきます。

レシピを更新する

まず、update-recipeで、インポートしたいレシピファイルを元にレシピを更新します。

update-recipe — AWS CLI 2.2.13 Command Reference

update-recipeは、--nameで指定した名前のレシピの最新バージョンを、--stepsで指定した内容で更新します。

コマンドは以下の様にしました。

aws databrew update-recipe --name 更新したいレシピの名前 --steps file://new_recipe.json --description 説明

--stepsは、せっかくローカルにレシピファイルがあるので、ファイルからロードしました。もちろん手で入力しても問題ありません。

実行しても、この時点では、まだ発行されていないので、レシピ画面からは違いが確認できません。レシピをプロジェクトに接続している場合は、DataBrewインタフェースから未公開の変更として確認できます。

レシピを発行する

続いて、publish-recipeでレシピを発行します。

publish-recipe — AWS CLI 2.2.13 Command Reference

コマンドは以下の様にしました。

aws databrew publish-recipe --name 更新したいレシピの名前

実行すると、以下のようにバージョン2.0のレシピが公開されました。

発行したレシピ

インポートしたかったレシピの内容が反映されていることが分かります。

まとめ

AWS CLIから、既存のレシピにレシピファイルをインポートする方法をご紹介しました。 レシピをJSON形式でエクスポートしておけば、update-recipeで直接読み込めるので、とても簡単にインポートができました。