

# 编辑或上载任务脚本
<a name="edit-nodes-script"></a>

使用 Amazon Glue Studio 可视化编辑器编辑任务脚本或上载您自己的脚本。

仅当任务使用 Amazon Glue Studio 创建时，您才能使用可视化编辑器编辑任务节点。如果任务是使用 Amazon Glue 控制台、通过 API 命令或命令行界面（CLI）创建，您可以使用 Amazon Glue Studio 中的脚本编辑器编辑任务脚本、参数和计划。您还可以将任务转换为仅脚本模式，编辑 Amazon 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 (选项)** 部分，您可以使用启动程序脚本（**使用 boilerplate 代码创建新脚本**）启动，也可以上载本地文件以用作任务脚本。

   如果选择 **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 (编辑脚本)** 解锁脚本以进行编辑。

   要使脚本可编辑，Amazon Glue Studio 将您的任务从可视化任务转换为仅脚本任务。如果解锁脚本进行编辑，则在保存此任务后，无法再使用可视化编辑器。

   在确认窗口中，选择 **Confirm (确认)** 以继续浏览，或选择 **Cancel (取消)** 以保持任务可用于可视化编辑。

   如果选择 **Confirm (确认)**，**Visual (可视化)** 选项卡不再显示在编辑器中。您可以使用 Amazon Glue Studio 可使用脚本编辑器修改脚本、修改任务详细信息或调度，或查看任务运行。
**注意**  
在保存任务之前，转换为仅脚本任务不是永久性操作。如果您刷新控制台网页，或者在保存之前关闭任务并在可视编辑器中重新打开它，则仍然可以在可视编辑器中编辑各个节点。

1. 根据需要编辑脚本。

   编辑完脚本后，选择 **Save (保存)** 保存任务并将任务从可视化对象永久转换为仅脚本。

1. （可选）您可以在 **Script (脚本)** 选项卡上选择 **Download (下载)** 按钮，从 Amazon Glue Studio 控制台下载脚本。选择此按钮后，将打开一个新的浏览器窗口，其中显示脚本在 Amazon S3 中的位置。任务的 **Job details (任务详细信息)** 选项卡中的 **Script filename** 和 **Script path** 参数确定脚本文件在 Amazon S3 中的名称和位置。  
![\[\]](http://docs.amazonaws.cn/glue/latest/dg/images/job-details-script-location-params-screenshot.png)

   保存任务时，Amazon Glue 将任务脚本保存在这些字段指定的位置。如果您在 Amazon S3 中修改此位置的脚本文件，Amazon Glue Studio 将在您下次编辑任务时加载修改后的脚本。

## 在 Amazon Glue Studio 中创建和编辑 Scala 脚本
<a name="edit-job-scala-script"></a>

当您选择用于创建任务的脚本编辑器时，默认情况下，任务编程语言设置为 `Python 3`。如果您选择编写新脚本而不是上载脚本，Amazon Glue Studio 会开启一个新的脚本，以 Python 编写样板文本。如果要改为编写 Scala 脚本，则必须首先将脚本编辑器配置为使用 Scala。

**注意**  
如果选择 Scala 作为任务的编程语言，并使用可视化编辑器设计任务，则生成的任务脚本将使用 Scala 编写，因此无需进一步操作。

**要在 Amazon 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` 语句。

## 在 Amazon Glue Studio 中创建和编辑 Python Shell 任务
<a name="edit-job-python-shell"></a>

选择 Python shell 脚本编辑器来创建任务时，可以上载现有 Python 脚本或编写新脚本。如果选择编写新脚本，样板代码将添加到新的 Python 任务脚本中。

**创建新的 Python Shell 任务**  
请参阅[在 Amazon Glue Studio 中启动作业](edit-nodes-chapter.md#create-jobs-start)中的说明。

Python Shell 任务支持的任务属性与 Spark 任务支持的任务属性不同。下面的列表描述了 **Job details (任务详细信息)** 选项卡上对 Python Shell 任务的可用任务参数所做的更改。
+ 任务的 **Type (类型)** 属性将自动设置为 `Python Shell`，而且无法更改。
+ 有面向任务的 **Python version (Python 版本)** 属性，而不是 **Language (语言)**。目前，Python Shell 任务在 Amazon Glue Studio 中使用 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 日志路径**
  + 标题 **Libraries (库)** 下面的 **Dependent jars path (从属 jars 路径)**