AWS Glue DataBrewにYAML形式のレシピファイルをインポートしてみた

2021.07.13

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

AWS Glue DataBrew(以降、DataBrew)のレシピをDataBrew外でほかの人と共有したい場合に、どのようにすれば良いのか気になったということで、これまで2つ記事をご紹介してきました。

ところで、これまではJSON形式のレシピファイルをインポートする方法を紹介しましたが、YAML形式のレシピファイルをインポートする方法を紹介します。レシピはYAML形式でもエクスポート可能なためです。

過去の記事はこちらです。

解決したい状況

なんらかの理由で、YAML形式のレシピファイルをインポートしたい場合です。

例えば、DataBrewで前処理を作成していたときに、同じチームの人がすごく上手なレシピを考えてくれました。「レシピはエクスポートして送っといたよ〜」と言うので、見てみたらYAML形式でエクスポートされていて、しかもその人はしばらく忙しくて時間がないらしい。これは自分でJSON形式に書き直すしかないかな?といった場合です。

先に結論

  • update-recipeで、レシピファイルを組み込んだYAMLファイル--cli-input-yamlオプションで読み込み、レシピを更新する。
  • --cli-input-yamlオプションで読み込むレシピファイルを組み込んだYAMLファイル--generate-cli-skeletonオプションで生成したスケルトンを修正すれば良い。
  • 上記オプションを使うため、AWS CLI v2で実施する必要がある。

検証の準備

サンプルのレシピを作る

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

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

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

更新するレシピ

インポートするYAML形式のレシピファイルを作る

インポートするYAML形式のYAMLファイルを準備します。今回は、事前に別のレシピからエクスポートした、以下のレシピファイルを使います(内容が少し長いですが、中身を理解する必要はないので気にしないでください)。

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

sample_yaml_recipe_file.yml

- 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 CLI バージョン2のインストール

紹介する操作では、AWS CLI バージョン2の機能を利用します。バージョン2は記事執筆時点でAWS CLIの最新のメジャーバージョンです。もし、検証したい環境がインストールしても問題ない環境で、かつインストール未実施であれば、以下のドキュメントにしたがってインストールしてください。

AWS CLI バージョン 2 のインストール、更新、およびアンインストール - AWS コマンドラインインターフェイス

やってみる

YAML形式のスケルトンを生成する

まず、CLIの--generate-cli-skeletonオプションを使って、aws databrew update-recipeに渡すためのYAML形式のスケルトンを生成します。

--generate-cli-skeletonオプションにyaml-inputを指定すると、YAML形式でスケルトンを生成してくれます。

aws databrew update-recipe --generate-cli-skeleton yaml-input

実行すると以下が表示されるので、コピペでファイルに貼り付けるか、リダイレクトするかして、入力用のYAMLファイルを作ります。

Description: ''  # A description of the recipe.
Name: '' # [REQUIRED] The name of the recipe to be updated.
Steps: # One or more steps to be performed by the recipe.
- Action:  # [REQUIRED] The particular action to be performed in the recipe step.
    Operation: ''  # [REQUIRED] The name of a valid DataBrew transformation to be performed on the data.
    Parameters: # Contextual parameters for the transformation.
      KeyName: ''
  ConditionExpressions: # One or more conditions that must be met for the recipe step to succeed.
  - Condition: ''  # [REQUIRED] A specific condition to apply to a recipe action.
    Value: '' # A value that the condition must evaluate to for the condition to succeed.
    TargetColumn: '' # [REQUIRED] A column to apply this condition to.

ここでは、sample_recipe.ymlという名前で保存しておきます。

スケルトンから入力ファイルを作成する

続いて、スケルトンから入力ファイルを作成します。Descriptionの値を設定したい説明に、Nameの値を更新したいレシピの名前にします。また、Stepsの値をレシピファイルの中身で置き換えます。

sample_recipe.yml

Description: 'Second version'
Name: '更新したいレシピ名'
Steps: # One or more steps to be performed by the recipe.
- Action:
    Operation: REMOVE_VALUES
    Parameters:
      sourceColumn: white_rating
  ConditionExpressions:
    - Condition: LESS_THAN
      Value: '1800'
      TargetColumn: white_rating

(略)

- Action:
    Operation: REPLACE_TEXT
    Parameters:
      pattern: outoftime
      sourceColumn: victory_status
      value: time ran out

レシピを更新する

update-recipeでレシピを更新します。--cli-input-yamlには、先ほど作成したsample_recipe.ymlの内容をファイルからロードします。

aws databrew update-recipe --cli-input-yaml file://sample_recipe.yml

レシピを公開する

最後に、publish-recipeでレシピを公開します。

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

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

公開したレシピ

まとめ

スケルトンにしたがって作成したYAMLファイルを--cli-input-yamlで読み込むことにより、YAML形式で出力したレシピファイルをレシピにインポートすることができました。

参考

[Tips] AWS CLI v2 の YAML Skeleton はコメント付きでちょっと親切! | DevelopersIO