

本文為英文版的機器翻譯版本，如內容有任何歧義或不一致之處，概以英文版為準。

# 建立自訂轉換
<a name="transforms-custom"></a>

如果您需要對資料執行更複雜的轉換，或是想要將資料屬性索引鍵新增至資料集，您可以將**自訂程式碼**轉換新增至您的任務圖表。自訂程式碼節點可讓您輸入執行轉換的指令碼。

使用自訂程式碼時，您必須使用結構描述編輯器來指出透過自訂程式碼對輸出所做的變更。編輯結構描述時，您可以執行下列動作：
+ 新增或移除資料屬性索引鍵
+ 變更資料屬性索引鍵的資料類型
+ 變更資料屬性索引鍵的名稱
+ 重新建構巢狀屬性索引鍵

您必須使用 *SelectFromCollection* 轉換以從自訂轉換節點的結果選擇單一 `DynamicFrame`，然後才能將輸出傳送到目標位置。

使用下列任務，將自訂轉換節點新增到您的任務圖表。

## 將自訂程式碼轉換節點新增至任務圖表
<a name="transforms-custom-addnode"></a>

**將自訂轉換節點新增到您的任務圖表**

1. (選用) 根據需要開啟資源面板，然後選擇**自訂轉換**，將自訂轉換新增至您的任務圖表。

1. 在 **Node properties (節點屬性)** 索引標籤上，輸入任務圖表中節點的名稱。如果尚未選取節點父項，或者如果您想要進行自訂轉換的多個輸入，請從**節點父項**清單選擇用作轉換之輸入來源的節點。

## 輸入自訂轉換節點的程式碼
<a name="transforms-custom-addcode"></a>

您可以在輸入欄位中輸入或複製程式碼。任務會使用此程式碼來執行資料轉換。您可以提供 Python 或 Scala 的程式碼片段。程式碼應該需要一個或多個 `DynamicFrames` 作為輸入，並會傳回 `DynamicFrames` 的集合。

**輸入自訂轉換節點的指令碼**

1. 在任務圖表中選取自訂轉換節點後，選擇**轉換**索引標籤。

1. 在**程式碼區塊**標題下的文字輸入欄位，貼上或輸入轉換的程式碼。您使用的程式碼必須符合**任務詳細資訊**索引標籤指定的語言。

   在程式碼中引用輸入節點時，AWS Glue Studio 會根據建立的順序循序命名任務圖表節點傳回的 `DynamicFrames`。在程式碼中使用下列其中一種命名方法：
   + 經典程式碼產生 – 使用功能性名稱來引用任務圖表中的節點。
     + 資料來源節點：`DataSource0`、`DataSource1`、`DataSource2`，以此類推。
     + 轉換節點：`Transform0`、`Transform1`、`Transform2`，以此類推。
   + 新程式碼產生 – 使用節點的**節點屬性**索引標籤，附加 '`_node1`'、'`_node2`'，以此類推。例如，`S3bucket_node1`、`ApplyMapping_node2`、`S3bucket_node2`、`MyCustomNodeName_node1`。

   如需新程式碼產生器的詳細資訊，請參閱 [指令碼程式碼產生](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>

當您使用自訂轉換節點時，AWS Glue Studio 不會自動推斷由轉換建立的輸出結構描述。您可以使用結構描述編輯器來描述由自訂轉換程式碼所實作的結構描述變更。

自訂程式碼節點可以有任意數量的父節點，每個節點都會提供 `DynamicFrame` 作為自訂程式碼的輸入。自訂程式碼節點會傳回 `DynamicFrames` 的集合。用作輸入的每個 `DynamicFrame` 會有相關聯的結構描述。您必須新增用於描述每個由自訂程式碼節點傳回之 `DynamicFrame` 的結構描述。

**注意**  
 當您在自訂轉換上設定自己的結構描述時，AWS Glue Studio 不會從以前的節點繼承結構描述。若要更新結構描述，請選擇自訂轉換節點，然後選擇資料預覽索引標籤。產生預覽後，選擇 'Use Preview Schema'。然後，結構描述將會由使用預覽資料的結構描述替換。

**編輯自訂轉換節點的輸出結構描述**

1. 在任務圖表中選取自訂轉換節點後，在節點詳細資訊面板中，選擇**輸出結構描述**索引標籤。

1. 選擇**編輯**以對結構描述進行變更。

   如果您有巢狀資料屬性索引鍵 (例如陣列或物件)，您可以選擇每個結構描述面板右上方的**展開列**圖示 (![A double-ended arrow pointing upwards and downwards between two parallel lines](http://docs.aws.amazon.com/zh_tw/glue/latest/dg/images/expand-rows-icon.png))，以展開子資料屬性索引鍵的清單。選擇此圖示後，它會變更為**摺疊列**圖示 (![Two arrows, one pointing up to a line and one pointing down to the same line](http://docs.aws.amazon.com/zh_tw/glue/latest/dg/images/collapse-rows-icon.png))，您可以選擇摺疊子屬性索引鍵清單。

1. 使用頁面右側區段中的下列動作來修改結構描述：
   + 若要重新命名屬性索引鍵，請將游標放在屬性索引鍵的**索引鍵**文字方塊，然後輸入新名稱。
   + 若要變更屬性索引鍵的資料類型，請使用清單來選擇屬性索引鍵的新資料類型。
   + 若要將新的頂層屬性索引鍵新增至結構描述，請選擇位於**取消**按鈕左側的**溢位** (![An ellipsis (...)](http://docs.aws.amazon.com/zh_tw/glue/latest/dg/images/edit-schema-actions-button.png)) 圖示，然後選擇**新增根索引鍵**。
   + 若要將子屬性索引鍵新增至結構描述，請選擇與父索引鍵相關聯**新增索引鍵**圖示 ![A rectangle with a plus sign in the bottom left corner](http://docs.aws.amazon.com/zh_tw/glue/latest/dg/images/filter-add-icon.png)。輸入子索引鍵的名稱，然後選擇資料類型。
   + 若要從結構描述移除屬性索引鍵，請選擇索引鍵名稱最右側的**移除**圖示 (![An outline of a trash can](http://docs.aws.amazon.com/zh_tw/glue/latest/dg/images/delete-icon-black.png))。

1. 如果您的自訂轉換程式碼使用多個 `DynamicFrames`，您可以新增其他輸出結構描述。
   + 若要新增空白結構描述，請選擇**溢位** (![An ellipsis (...)](http://docs.aws.amazon.com/zh_tw/glue/latest/dg/images/edit-schema-actions-button.png)) 圖示，然後選擇**新增輸出結構描述**。
   + 若要將現有結構描述複製到新的輸出結構描述，請確定要複製的結構描述顯示在結構描述選取器中。選擇**溢位** (![An ellipsis (...)](http://docs.aws.amazon.com/zh_tw/glue/latest/dg/images/edit-schema-actions-button.png)) 圖示，然後選擇**複製**。

   如果要移除輸出結構描述，請確定要複製的結構描述顯示在結構描述選取器中。選擇**溢位** (![An ellipsis (...)](http://docs.aws.amazon.com/zh_tw/glue/latest/dg/images/edit-schema-actions-button.png)) 圖示，然後選擇**刪除**。

1. 新增根索引鍵至新的結構描述或編輯重複的索引鍵。

1. 當您修改輸出結構描述時，請選擇**套用**按鈕以儲存您的變更，並結束結構描述編輯器。

   如果您不想儲存您的變更，請選擇**取消**按鈕。

## 設定自訂轉換輸出
<a name="transforms-custom-output"></a>

自訂程式碼轉換會傳回 `DynamicFrames` 集合，即使結果集內只有一個 `DynamicFrame`。

**處理自訂轉換節點的輸出**

1. 新增*SelectFromCollection*轉換節點，該節點具有自訂轉換節點做為其父節點。更新此轉換以指示您想要使用的資料集。如需詳細資訊，請參閱[使用 SelectFromCollection 選擇要保留的資料集](transforms-configure-select-collection.md)。

1. 如果您想使用自訂轉換節點產生的其他 `DynamicFrames`，請新增其他 *SelectFromCollection* 轉換至任務圖表。

   請試想下列場景：您新增自訂轉換節點，將航班資料集分割成多個資料集，但在每個輸出結構描述中複製某些識別屬性索引鍵，例如航班日期或航班號碼。您可以為每個輸出結構描述新增 *SelectFromCollection* 轉換節點，並將自訂轉換節點做為其父項。

1. (選用) 然後，您可以使用每個 *SelectFromCollection* 將節點轉換為任務中其他節點的輸入，或作為資料目標節點的父節點。