

# カスタム変換を作成する
<a name="transforms-custom"></a>

データに対してより複雑な変換を実行する必要がある場合、またはデータプロパティキーをデータセットに追加する場合は、ジョブ図に**カスタムコード**変換を追加します。カスタムコードノードを使用すると、変換を実行するスクリプトを入力できます。

カスタムコードを使用する場合は、スキーマエディタを使用して、カスタムコードを通して出力に加えらえる変更を指定する必要があります。スキーマの編集時に、次のアクションを実行できます。
+ データプロパティキーの追加または削除
+ データプロパティキーのデータ型の変更
+ データプロパティキーの名前の変更
+ ネストされたプロパティキーの再構築

出力をターゲットの場所に送信するには、*SelectFromCollection* 変換を使用して、カスタム変換ノードの結果から単一の `DynamicFrame` を選択する必要があります。

次のタスクを実行して、カスタム変換ノードをジョブ図に追加できます。

## カスタムコード変換ノードをジョブ図に追加する
<a name="transforms-custom-addnode"></a>

**カスタム変換ノードをジョブ図に追加するには**

1. (オプション) リソースパネルを開いて、**[Custom transform]** を選択し、ジョブ図にカスタム変換を追加します。

1. [**Node properties**] (ノードのプロパティ) タブで、ジョブ図のノードの名前を入力します。ノードの親がまだ選択されていない場合、またはカスタム変換に複数の入力が必要な場合は、[**Node parents**] (ノードの親) リストから、変換の入力ソースとして使用するノードを選択します。

## カスタム変換ノードのコードを入力する
<a name="transforms-custom-addcode"></a>

入力フィールドにコードを入力またはコピーできます。ジョブでは、データ変換の実行にこのコードを使用します。Python または Scala のいずれかでコードのスニペットを指定できます。コードは、入力として 1 つ以上の `DynamicFrames` を取り、`DynamicFrames` のコレクションを返す必要があります。

**カスタム変換ノードのスクリプトを入力するには**

1. ジョブ図でカスタム変換ノードを選択した状態で、[**Transform**] (変換) タブを選択します。

1. 見出し [**Code block**] (コードブロック) の下のテキスト入力フィールドで、変換用のコードを貼り付けるか、入力します。使用するコードは、[**Job details**] (ジョブの詳細) タブのジョブで指定されている言語と一致する必要があります。

   コード内の入力ノードを参照する場合、AWS Glue Studio は、作成された順序に基づきジョブの図表ノードによって連続的に返される `DynamicFrames` に名前を付けます。コード内で次のいずれかのネーミングメソッドを使用します。
   + Classic code generation — 関数名を使用して、ジョブダイアグラム内のノードを参照します。
     + データソースノード: `DataSource0`、`DataSource1`、`DataSource2` などです。
     + 変換ノード: `Transform0`、`Transform1`、`Transform2` などです。
   + New code generation — '`_node1`','`_node2`'などが添付されたノードの[**Node properties**]タブ上で指定された名前を使用します。例えば、`S3bucket_node1`、`ApplyMapping_node2`、`S3bucket_node2`、`MyCustomNodeName_node1`

   各エラーコード generator のさらなる詳細については、「[スクリプトコードの生成](job-editor-features.md#code-gen)」を参照してください。

次の例は、コードボックスに入力するコードの形式を示しています。

------
#### [ Python ]

次の例では、まず `DynamicFrame` を受信し、それを `DataFrame` に変換してネイティブフィルターメソッド (1000 票を超えるレコードのみを保持)を適用しています。その後、返す前に `DynamicFrame` に再び変換しています。

```
def FilterHighVoteCounts (glueContext, dfc) -> DynamicFrameCollection:
    df = dfc.select(list(dfc.keys())[0]).toDF()
    df_filtered = df.filter(df["vote_count"] > 1000)
    dyf_filtered = DynamicFrame.fromDF(df_filtered, glueContext, "filter_votes")
    return(DynamicFrameCollection({"CustomTransform0": dyf_filtered}, glueContext))
```

------
#### [ Scala ]

次の例では、まず `DynamicFrame` を受信し、それを `DataFrame` に変換してネイティブフィルターメソッド (1000 票を超えるレコードのみを保持)を適用しています。その後、返す前に `DynamicFrame` に再び変換しています。

```
object FilterHighVoteCounts {
  def execute(glueContext : GlueContext, input : Seq[DynamicFrame]) : Seq[DynamicFrame] = {
    val frame = input(0).toDF()
    val filtered = DynamicFrame(frame.filter(frame("vote_count") > 1000), glueContext)
    Seq(filtered)
  }
}
```

------

## カスタム変換ノードでスキーマを編集する
<a name="transforms-custom-editschema"></a>

カスタム transform ノードを使用する場合、AWS Glue Studio は、transform によって作成された出力スキーマを自動で推測することはできません。スキーマエディタを使用して、カスタム変換コードによって実装されるスキーマの変更を記述できます。

カスタムコードノードでは、カスタムコードの入力として `DynamicFrame` を提供する任意の数の親ノードを持つことができます。カスタムコードノードでは、`DynamicFrames` のコレクションが返されます。入力として使用される各 `DynamicFrame` には、スキーマが関連付けられています。カスタムコードノードによって返される各 `DynamicFrame` を記述するスキーマを追加する必要があります。

**注記**  
 カスタム変換で独自のスキーマを設定した場合、AWS Glue Studio は、前のノードからのスキーマ継承を行いません。スキーマを更新するには、カスタム変換のノードを選択した上で、[Data preview] (データプレビュー) タブを開きます。プレビューが生成されたら、[Use Preview Schema] (プレビュースキーマを使用) をクリックします。その後、このスキーマがプレビューデータを使用するスキーマに置き換えられます。

**カスタム変換ノードの入力スキーマを編集するには**

1. ジョブ図でカスタム変換ノードを選択した状態で、ノードの詳細パネルの [**Output schema**] (出力スキーマ) タブを選択します。

1. [**Edit**] (編集) を選択して、スキーマを変更します。

   配列やオブジェクトなどのネストされたデータのプロパティキーがある場合、各スキーマパネルの右上部にある [**Expand-Rows**] (行の展開) アイコン (![A double-ended arrow pointing upwards and downwards between two parallel lines](http://docs.aws.amazon.com/ja_jp/glue/latest/dg/images/expand-rows-icon.png)) を選択して、子データのプロパティキーのリストを展開します。このアイコンは、選択すると [**Collapse-Rows**] (列の折りたたみ) アイコン (![Two arrows, one pointing up to a line and one pointing down to the same line](http://docs.aws.amazon.com/ja_jp/glue/latest/dg/images/collapse-rows-icon.png)) に変わり、子のプロパティキーのリストを折りたたむことができます。

1. ページ右側のセクションにある次のアクションを使用して、スキーマを変更します。
   + プロパティキーの名前を変更するには、プロパティキーの [**Key**] (キー) テキストボックスにカーソルを置き、新しい名前を入力します。
   + プロパティキーのデータ型を変更するには、リストを使用して、プロパティキーの新しいデータ型を選択します。
   + トップレベルの新しいプロパティキーをスキーマに追加するには、[**Cancel**] (キャンセル) ボタンの左側にある [**Overflow**] (オーバーフロー) (![An ellipsis (...)](http://docs.aws.amazon.com/ja_jp/glue/latest/dg/images/edit-schema-actions-button.png)) アイコンをクリックして、[**Add root key**] (ルートキーの追加) を選択します。
   + スキーマに子のプロパティキーを追加するには、親キーに関連付けられている [**Add-Key**] (キーの追加) (![A rectangle with a plus sign in the bottom left corner](http://docs.aws.amazon.com/ja_jp/glue/latest/dg/images/filter-add-icon.png)) アイコンをクリックします。子のキーの名前を入力し、データ型を選択します。
   + スキーマからプロパティキーを削除するには、キー名の右端にある [**Remove**] (削除) アイコン (![An outline of a trash can](http://docs.aws.amazon.com/ja_jp/glue/latest/dg/images/delete-icon-black.png)) をクリックします。

1. カスタム変換コードで `DynamicFrames` を複数使用していない場合、他の出力スキーマを追加できます。
   + 新しい空のスキーマを追加するには、[**Overflow**] (オーバーフロー) (![An ellipsis (...)](http://docs.aws.amazon.com/ja_jp/glue/latest/dg/images/edit-schema-actions-button.png)) アイコンをクリックし、[**Add output schema**] (出力スキーマの追加) を選択します。
   + 既存のスキーマを新しい出力スキーマにコピーするには、コピーするスキーマがスキーマセレクタに表示されていることを確認します。[**Overflow**] (オーバーフロー) (![An ellipsis (...)](http://docs.aws.amazon.com/ja_jp/glue/latest/dg/images/edit-schema-actions-button.png)) アイコンをクリックして、[**Duplicate**] (複製) を選択します。

   出力スキーマを削除する場合は、コピーするスキーマがスキーマセレクタに表示されていることを確認します。[**Overflow**] (オーバーフロー) (![An ellipsis (...)](http://docs.aws.amazon.com/ja_jp/glue/latest/dg/images/edit-schema-actions-button.png)) アイコンをクリックして、[**Delete**] (削除)を選択します。

1. 新しいスキーマに新しいルートキーを追加するか、複製したキーを編集します。

1. 出力スキーマを変更する場合は、[**Apply**] (適用) ボタンをクリックして変更を保存し、スキーマエディタを終了します。

   変更を保存しない場合は、[**Cancel**] (キャンセル) ボタンをクリックします。

## カスタム変換の出力を設定する
<a name="transforms-custom-output"></a>

カスタムコード変換では、1 つの結果セットに `DynamicFrame` が 1 つだけであっても、`DynamicFrames` のコレクションが返されます。

**カスタム変換ノードからの出力を処理するには**

1. カスタム変換ノードを親ノードとして持つ *SelectFromCollection* 変換ノードを追加します。この変換を更新して、使用するデータセットを指定します。詳細については「[SelectFromCollection を使用して保持するデータセットを選択する](transforms-configure-select-collection.md)」を参照してください。

1. カスタム変換ノードによって生成される他の `DynamicFrames` を使用する場合は、*SelectFromCollection* 変換をジョブ図に追加します。

   カスタム変換ノードを追加してフライトのデータセットを複数のデータセットに分割し、フライトの日付や番号などの各出力スキーマで識別プロパティキーを複製するシナリオを考えてみましょう。各出力スキーマに、カスタム変換ノードを親として持つ *SelectFromCollection* 変換ノードを追加します。

1. (オプション) その後、各 *SelectFromCollection* 変換ノードをジョブ内の他のノードの入力として、またはデータターゲットノードの親として使用できます。