

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

# 編輯或上傳任務指令碼
<a name="edit-nodes-script"></a>

使用 AWS Glue Studio 視覺化編輯器來編輯任務指令碼或上傳自己的指令碼。

只有當任務是使用 AWS Glue Studio 建立時，您才可以使用視覺化編輯器來編輯任務節點。如果任務是使用 AWS Glue 主控台、透過 API 命令或命令列介面 (CLI) 建立的，則您可以使用 AWS Glue Studio 中的指令碼編輯器來編輯任務指令碼、參數和排程。您也可以透過將任務轉換為僅限指令碼模式，編輯在 AWS Glue Studio 中建立之任務的指令碼。

**編輯任務指令碼或上傳您自己的指令碼**

1. 如果建立新任務，請在 **Jobs (任務)** 頁面上，選擇 **Spark script editor (Spark 指令碼編輯器)** 選項來建立 Spark 任務或選擇 **Python Shell script editor (Python Shell 指令碼編輯器)** 來建立 Python Shell 任務。您可以撰寫新指令碼，也可以上傳現有指令碼。如果選擇 **Spark script editor (Spark 指令碼編輯器)**，您可以編寫或上傳 Scala 或 Python 指令碼。如果選擇 **Python Shell script editor (Python Shell 指令碼編輯器)**，您只能編寫或上傳 Python 指令碼。

   選擇建立新任務的選項後，在出現的 **Options (選項)** 區段中，您可以選擇以入門指令碼開始 (**Create a new script with boilerplate code (使用樣板程式碼建立新指令碼)**)，或者您可以上傳本機檔案以作為任務指令碼使用。

   如果您選擇 **Spark script editor (Spark 指令碼編輯器)**，您可以上傳 Python 或 Scala 指令碼檔案。Scala 指令碼的副檔名必須為 `.scala`。Python 指令碼必須被識別為 Python 類型的檔案。如果您選擇 **Python Shell script editor (Python Shell 指令碼編輯器)**，您只能上傳 Python 指令碼檔案。

   完成選擇後，請選擇 **Create (建立)** 以建立任務並開啟視覺化編輯器。

1. 前往新任務或儲存任務的視覺化任務編輯器，然後選擇 **Script (指令碼)** 索引標籤。

1. 如果您沒有使用其中一個指令碼編輯器選項建立新任務，而且您從未編輯現有任務的指令碼，**Script (指令碼)** 索引標籤會顯示標題 **Script (Locked) (指令碼 (已鎖定))**。這表示指令碼編輯器處於唯讀模式。請選擇 **Edit script (編輯指令碼)** 解除鎖定指令碼以進行編輯。

   為了讓指令碼變成可編輯的，AWS Glue Studio 會將您的任務從視覺化任務轉換為僅限指令碼任務。如果您將指令碼解除鎖定以進行編輯，儲存之後就無法再使用視覺化編輯器來執行此任務。

   在確認視窗中，選擇 **Confirm (確認)** 繼續，或 **Cancel (取消)** 以保持任務可供視覺編輯。

   如果選擇 **Confirm (確認)**，**Visual (視覺效果)** 索引標籤不會再出現在編輯器中。您可以使用 AWS Glue Studio 以使用指令碼編輯器來修改指令碼、修改任務詳細資訊或排程，或查看任務執行。
**注意**  
在您儲存任務之前，轉換為僅限指令碼任務並不是永久性的。如果您重新整理主控台網頁，或在儲存任務之前先關閉任務，然後在視覺化編輯器中重新開啟任務，您仍然可以在視覺化編輯器中編輯個別節點。

1. 視需要編輯指令碼。

   當您完成編輯指令碼時，選擇 **Save (儲存)** 儲存任務，並將任務從視覺效果永久轉換為僅限指令碼。

1. (選用) 您可以選擇 **Script** (指令碼) 索引標籤上的 **Download** (下載) 按鈕，從 AWS Glue Studio 主控台下載指令碼。當您選擇此按鈕時，會開啟新的瀏覽器視窗，顯示其在 Amazon S3 中位置的指令碼。任務的 **Job details (任務詳細資訊)** 索引標籤中的 **Script filename (指令碼檔案名稱)** 和 **Script path (指令碼路徑)** 參數會決定指令碼檔案在 Amazon S3 中的名稱和位置。  
![\[\]](http://docs.aws.amazon.com/zh_tw/glue/latest/dg/images/job-details-script-location-params-screenshot.png)

   當您儲存任務時，AWS Glue 會將任務指令碼儲存在這些欄位指定的位置。如果在 Amazon S3 中修改此位置的指令碼檔案，則您下次編輯任務時，AWS Glue Studio 會載入修改後的指令碼。

## 在 AWS Glue Studio 中建立和編輯 Scala 指令碼
<a name="edit-job-scala-script"></a>

當您選擇指令碼編輯器來建立任務時，依預設，任務程式設計語言被設定為 `Python 3`。如果您選擇編寫新的指令碼而不是上傳指令碼，則 AWS Glue Studio 會啟動一個新的指令碼，其中包含以 Python 編寫的樣板文字。如果您想改為編寫 Scala 指令碼，您必須先將指令碼編輯器設定為使用 Scala。

**注意**  
如果您選擇 Scala 作為任務的程式設計語言，並使用視覺化編輯器來設計任務，則產生的任務指令碼將用 Scala 編寫，並且不需要進一步的操作。

**在 AWS Glue Studio 中編寫新的 Scala 指令碼**

1. 建立新任務，方法是選擇 **Spark script editor (Spark 指令碼編輯器)** 選項。

1. 在 **Options (選項)** 下方，選擇 **Create a new script with boilerplate code (使用樣板程式碼建立新指令碼)**。

1. 選擇 **Job details (任務詳細資訊)** 索引標籤並設定 **Language (語言)** 為 `Scala` (而不是 `Python 3`)。
**注意**  
當您選擇 **Spark script editor (Spark 指令碼編輯器)** 選項建立任務，任務的 **Type (類型)** 屬性會自動設定為 `Spark`。

1. 選擇 **Script (指令碼)** 索引標籤。

1. 移除 Python 樣板文字。您可以用以下 Scala 樣板文字替換它。

   ```
   import com.amazonaws.services.glue.{DynamicRecord, GlueContext}
   import org.apache.spark.SparkContext
   import com.amazonaws.services.glue.util.JsonOptions
   import com.amazonaws.services.glue.util.GlueArgParser
   import com.amazonaws.services.glue.util.Job
   
   object MyScript {
     def main(args: Array[String]): Unit = {
       val sc: SparkContext = new SparkContext()
       val glueContext: GlueContext = new GlueContext(sc)
   
       }
   }
   ```

1. 在編輯器中編寫您的 Scala 任務指令碼。視需要新增其他 `import` 陳述式。

## 在 AWS Glue Studio 中建立和編輯 Python Shell 任務
<a name="edit-job-python-shell"></a>

當您選擇 Python shell 指令碼編輯器來建立任務時，您可以上傳現有的 Python 指令碼，或者編寫新的指令碼。如果您選擇編寫新的指令碼，樣板程式碼將新增到新的 Python 任務指令碼中。

**建立新的 Python Shell 任務**  
請參閱[在 AWS Glue Studio 中啟動任務](edit-nodes-chapter.md#create-jobs-start)中的指示。

Python Shell 任務支援的任務屬性與 Spark 任務支援的任務屬性不相同。下列清單說明 **Job details** (任務詳細資訊) 索引標籤上 Python Shell 任務的可用任務參數的變更。
+ 任務的 **Type (類型)** 屬性會自動設定為 `Python Shell`，且無法變更。
+ 會有一個任務的 **Python version (Python 版本)** 屬性，而不是 **Language (語言)**。目前，在 AWS Glue Studio 中建立的 Python Shell 任務使用 Python 3.6。
+ **Glue version (Glue 版本)** 屬性無法使用，因為它不適用於 Python Shell 任務。
+ 會改為顯示 **Data processing units (資料處理單元)** 屬性，取代 **Worker type (工作者類型)** 和 **Number of workers (工作者數目)**。此任務屬性決定執行任務時，Python Shell 會使用多少資料處理單元 (DPU)。
+ **Job bookmark (任務書籤)** 屬性無法使用，因為它不支援 Python Shell 任務。
+ 在 **Advanced properties (進階屬性)** 下，下列屬性不適用於 Python Shell 任務。
  + **任務指標**
  + **連續記錄**
  + **Spark UI** 和 **Spark UI logs path (Spark UI 日誌路徑)**
  + **Dependent jars path (相依的 jar 路徑)**，在 **Libraries (程式庫)** 標題下