

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

# PySpark 分析範本
<a name="pyspark-analysis-templates"></a>

PySpark 分析範本需要 Python 使用者指令碼和選用的虛擬環境，才能使用自訂和開放原始碼程式庫。這些檔案稱為成品。

建立分析範本之前，請先建立成品，然後將成品存放在 Amazon S3 儲存貯體中。 AWS Clean Rooms 會在執行分析任務時使用這些成品。 AWS Clean Rooms 只會在執行任務時存取成品。

在 PySpark 分析範本上執行任何程式碼之前， 會透過以下方式 AWS Clean Rooms 驗證成品：
+ 檢查建立範本時使用的特定 S3 物件版本
+ 驗證成品的 SHA-256 雜湊 
+ 失敗修改或移除成品的任何任務

**注意**  
中指定 PySpark 分析範本的所有合併成品大小上限為 AWS Clean Rooms 1 GB。

## PySpark 分析範本的安全性
<a name="pyspark-analysis-templates-security"></a>

為了保留安全的運算環境， AWS Clean Rooms 會使用雙層運算架構來隔離使用者程式碼與系統操作。此架構是以 Amazon EMR Serverless Fine Grained Access Control 技術為基礎，也稱為 Membrane。如需詳細資訊，請參閱[在具有必要程式碼的情況下，在 Apache Spark 中安全且高效能的資料存取控制](https://www.amazon.science/publications/membrane-safe-and-performant-data-access-controls-in-apache-spark-in-the-presence-of-imperative-code)。

運算環境元件分為單獨的使用者空間和系統空間。使用者空間會在 PySpark 分析範本中執行 PySpark 程式碼。 AWS Clean Rooms 會使用系統空間來執行任務，包括使用客戶提供的服務角色來讀取資料以執行任務並實作資料欄允許清單。由於此架構，會封鎖影響系統空間的客戶 PySpark 程式碼，其中可能包含少量 Spark SQL 和 PySpark DataFrames APIs。

## 中的 PySpark 限制 AWS Clean Rooms
<a name="pyspark-limitations"></a>

當客戶提交核准的 PySpark 分析範本時， 會在自己的安全運算環境中 AWS Clean Rooms 執行，而客戶無法存取該環境。運算環境實作具有使用者空間和系統空間的運算架構，以保留安全的運算環境。如需詳細資訊，請參閱[PySpark 分析範本的安全性](#pyspark-analysis-templates-security)。

在 中使用 PySpark 之前，請考慮下列限制 AWS Clean Rooms。

**限制**
+ 僅支援 DataFrame 輸出
+ 每個任務執行的單一 Spark 工作階段

**不支援的功能**
+ **資料管理**
  + Iceberg 資料表格式
  + LakeFormation 受管資料表
  + 彈性分散式資料集 (RDD)
  + Spark 串流
  + 巢狀資料欄的存取控制
+ **自訂函數和擴充功能**
  + 使用者定義的資料表函數 UDTFs)
  + HiveUDFs
  + 使用者定義函數中的自訂類別
  + 自訂資料來源
  + 適用於以下項目的其他 JAR 檔案：
    + Spark 延伸模組
    + 連接器
    + 中繼存放區組態
+ **監控和分析**
  + Spark 記錄
  + Spark 使用者介面
  + `ANALYZE TABLE` 命令

**重要**  
這些限制適用於維持使用者和系統空間之間的安全隔離。  
無論協同合作組態為何，都適用所有限制。  
未來的更新可能會根據安全性評估新增對其他功能的支援。

## 最佳實務
<a name="python-best-practices"></a>

我們建議在建立 PySpark 分析範本時採用下列最佳實務。
+ [中的 PySpark 限制 AWS Clean Rooms](#pyspark-limitations) 以 為考量來設計您的分析範本。
+ 首先在開發環境中測試您的程式碼。
+ 僅使用支援的 DataFrame 操作。
+ 規劃您的輸出結構以使用 DataFrame 限制。

我們建議您使用下列最佳實務來管理成品
+ 將所有 PySpark 分析範本成品保留在專用 S3 儲存貯體或字首中。
+ 針對不同的成品版本使用透明版本命名。
+ 需要成品更新時建立新的分析範本。
+ 維護哪些範本使用哪些成品版本的庫存。

如需如何撰寫 Spark 程式碼的詳細資訊，請參閱下列內容：
+ [Apache Spark 範例](https://spark.apache.org/examples.html)
+ 在 *Amazon EMR 版本指南*中[撰寫 Spark 應用程式](https://docs.aws.amazon.com/emr/latest/ReleaseGuide/emr-spark-application.html) 
+ [使用者指南中的教學課程：撰寫 AWS Glue 適用於 Spark 的 指令碼](https://docs.aws.amazon.com/glue/latest/dg/aws-glue-programming-intro-tutorial.html) *AWS Glue *

下列主題說明如何在建立和檢閱分析範本之前建立 Python 使用者指令碼和程式庫。

**Topics**
+ [PySpark 分析範本的安全性](#pyspark-analysis-templates-security)
+ [中的 PySpark 限制 AWS Clean Rooms](#pyspark-limitations)
+ [最佳實務](#python-best-practices)
+ [建立使用者指令碼](create-user-script.md)
+ [在 PySpark 分析範本中使用參數](pyspark-parameter-handling.md)
+ [建立虛擬環境 （選用）](create-virtual-environment.md)
+ [在 S3 中存放使用者指令碼和虛擬環境](store-artifacts-in-s3.md)
+ [建立 PySpark 分析範本](create-pyspark-analysis-template.md)
+ [檢閱 PySpark 分析範本](review-pyspark-analysis-template.md)

# 建立使用者指令碼
<a name="create-user-script"></a>

使用者指令碼必須包含進入點函數 （也就是處理常式）。您可以使用任何有效的 Python 檔案名稱來命名使用者指令碼檔案。

下列程序說明如何建立使用者指令碼來定義 PySpark 分析的核心功能。

**先決條件**
+ PySpark 1.0 （對應至 Python 3.11 和 Spark 3.5.3)
+ Amazon S3 中的資料集只能在您定義的 Spark 工作階段中讀取為已設定的資料表關聯。
+ 您的程式碼無法直接呼叫 Amazon S3 和 AWS Glue
+ 您的程式碼無法進行網路呼叫

**建立使用者指令碼**

1. 開啟您選擇的文字編輯器或整合式開發環境 (IDE)。

   您可以使用支援 Python 檔案的任何文字編輯器或 IDE （例如 Visual Studio Code、PyCharm 或 Notepad\$1\$1)。

1. 使用您選擇的名稱建立新的 Python 檔案 （例如 **my\$1analysis.py**)。

1. 定義接受內容物件參數的進入點函數。

   ```
   def entrypoint(context)
   ```

   `context` 物件參數是一種字典，可讓您存取重要的 Spark 元件、參考的資料表和分析參數。它包含以下內容：

   透過 存取 Spark 工作階段 `context['sparkSession']`

   透過 參考的資料表 `context['referencedTables']`

   透過 分析參數 `context['analysisParameters']`（如果在範本中定義參數）

1. 定義進入點函數的結果：

   ```
   return results
   ```

   `results` 必須將包含檔案名稱結果字典的物件傳回至輸出 DataFrame。
**注意**  
AWS Clean Rooms 會自動將 DataFrame 物件寫入結果接收器的 S3 儲存貯體。

1. 您現在已準備好：

   1. 將此使用者指令碼儲存在 S3 中。如需詳細資訊，請參閱[在 S3 中存放使用者指令碼和虛擬環境](store-artifacts-in-s3.md)。

   1. 建立選用的虛擬環境，以支援使用者指令碼所需的任何其他程式庫。如需詳細資訊，請參閱[建立虛擬環境 （選用）](create-virtual-environment.md)。

**Example 範例 1**  

```
# File name: my_analysis.py

def entrypoint(context):
    try:
        # Access Spark session
        spark = context['sparkSession']

        # Access input tables
        input_table1 = context['referencedTables']['table1_name']
        input_table2 = context['referencedTables']['table2_name']

        # Example data processing operations
        output_df1 = input_table1.select("column1", "column2")
        output_df2 = input_table2.join(input_table1, "join_key")
        output_df3 = input_table1.groupBy("category").count()
    
        # Return results - each key creates a separate output folder
        return {
            "results": {
                "output1": output_df1,        # Creates output1/ folder
                "output2": output_df2,        # Creates output2/ folder
                "analysis_summary": output_df3 # Creates analysis_summary/ folder
            }
        }
   
    except Exception as e:
        print(f"Error in main function: {str(e)}")
        raise e
```
此範例的資料夾結構如下：  

```
analysis_results/
│
├── output1/ # Basic selected columns
│ ├── part-00000.parquet
│ └── _SUCCESS
│
├── output2/ # Joined data
│ ├── part-00000.parquet
│ └── _SUCCESS
│
└── analysis_summary/ # Aggregated results
├── part-00000.parquet
└── _SUCCESS
```

**Example 範例 2**  

```
def entrypoint(context):
    try:
        # Get DataFrames from context
        emp_df = context['referencedTables']['employees']
        dept_df = context['referencedTables']['departments']

        # Apply Transformations
        emp_dept_df = emp_df.join(
            dept_df,
            on="dept_id",
            how="left"
        ).select(
            "emp_id",
            "name",
            "salary",
            "dept_name"
        )

        # Return Dataframes
        return {
            "results": {
                "outputTable": emp_dept_df
            }
        }

    except Exception as e:
        print(f"Error in entrypoint function: {str(e)}")
        raise e
```

# 在 PySpark 分析範本中使用參數
<a name="pyspark-parameter-handling"></a>

參數允許在任務提交時提供不同的值，以增加 PySpark 分析範本的彈性。您可以透過傳遞至進入點函數的內容物件來存取參數。

**注意**  
參數是使用者提供的字串，可包含任意內容。  
檢閱程式碼以確保安全地處理參數，以防止分析中的意外行為。
無論提交時提供哪些參數值，設計參數處理都能安全地運作。

## 存取參數
<a name="accessing-parameters"></a>

參數可在 `context['analysisParameters']` 字典中使用。所有參數值都是字串。

**Example 安全地存取參數**  

```
def entrypoint(context):
    # Access parameters from context
    parameters = context['analysisParameters']
    threshold = parameters['threshold']
    table_name = parameters['table_name']
    
    # Continue with analysis using parameters
    spark = context['sparkSession']
    input_df = context['referencedTables'][table_name]
    
    # Convert threshold value
    threshold_val = int(threshold)
    
    # Use parameter in DataFrame operation
    filtered_df = input_df.filter(input_df.amount > threshold_val)
    
    return {
        "results": {
            "output": filtered_df
        }
    }
```

## 參數安全最佳實務
<a name="parameter-security-best-practices"></a>

**警告**  
參數是使用者提供的字串，可包含任意內容。您必須安全地處理參數，以防止分析程式碼中的安全漏洞。

**要避免的不安全參數處理模式：**
+ **以程式碼形式執行參數** – 切勿在參數值`exec()`上使用 `eval()`或

  ```
  # UNSAFE - Don't do this
  eval(parameters['expression'])  # Can execute arbitrary code
  ```
+ **SQL 字串插補** – 切勿將參數直接串連至 SQL 字串

  ```
  # UNSAFE - Don't do this
  sql = f"SELECT * FROM table WHERE column = '{parameters['value']}'"  # SQL injection risk
  ```
+ **不安全的檔案路徑操作** – 請勿在未驗證的情況下直接在檔案系統操作中使用參數

  ```
  # UNSAFE - Don't do this
  file_path = f"/data/{parameters['filename']}"  # Path traversal risk
  ```

**安全參數處理模式：**
+ **在 DataFrame 操作中使用參數** – Spark DataFrames 安全地處理參數值

  ```
  # SAFE - Use parameters in DataFrame operations
  threshold = int(parameters['threshold'])
  filtered_df = input_df.filter(input_df.value > threshold)
  ```
+ **驗證參數值** – 在使用前檢查參數是否符合預期的格式

  ```
  # SAFE - Validate parameters before use
  def validate_date(date_str):
      try:
          from datetime import datetime
          datetime.strptime(date_str, '%Y-%m-%d')
          return True
      except ValueError:
          return False
  
  date_param = parameters['date_filter'] or '2024-01-01'
  if not validate_date(date_param):
      raise ValueError(f"Invalid date format: {date_param}")
  ```
+ **使用參數值的允許清單** – 如果可能，請根據已知的良好值驗證參數

  ```
  # SAFE - Use allowlists
  allowed_columns = ['column1', 'column2', 'column3']
  column_param = parameters['column_name']
  if column_param not in allowed_columns:
      raise ValueError(f"Invalid column: {column_param}")
  ```
+ **使用錯誤處理進行類型轉換** – 將字串參數安全地轉換為預期類型

  ```
  # SAFE - Convert with error handling
  try:
      batch_size = int(parameters['batch_size'] or '1000')
      if batch_size <= 0 or batch_size > 10000:
          raise ValueError(f"Batch size must be between 1 and 10000")
  except ValueError as e:
      print(f"Invalid parameter: {e}")
      raise
  ```

**重要**  
請記住，當任務執行器提供不同的值時，參數會略過程式碼檢閱。設計您的參數處理方式，無論提供哪些參數值，都能安全地運作。

## 完成參數範例
<a name="parameter-examples"></a>

**Example 在 PySpark 指令碼中安全地使用參數**  

```
def entrypoint(context):
    try:
        # Access Spark session and tables
        spark = context['sparkSession']
        input_table = context['referencedTables']['sales_data']
        
        # Access parameters - fail fast if analysisParameters missing
        parameters = context['analysisParameters']
        
        # Validate and convert numeric parameter (handles empty strings with default)
        try:
            threshold = int(parameters['threshold'] or '100')
            if threshold <= 0:
                raise ValueError("Threshold must be positive")
        except (ValueError, TypeError) as e:
            print(f"Invalid threshold parameter: {e}")
            raise
        
        # Validate date parameter (handles empty strings with default)
        date_filter = parameters['start_date'] or '2024-01-01'
        from datetime import datetime
        try:
            datetime.strptime(date_filter, '%Y-%m-%d')
        except ValueError:
            raise ValueError(f"Invalid date format: {date_filter}")
        
        # Use parameters safely in DataFrame operations
        filtered_df = input_table.filter(
            (input_table.amount > threshold) &
            (input_table.date >= date_filter)
        )
        
        result_df = filtered_df.groupBy("category").agg(
            {"amount": "sum"}
        )
        
        return {
            "results": {
                "filtered_results": result_df
            }
        }
    
    except Exception as e:
        print(f"Error in analysis: {str(e)}")
        raise
```

# 建立虛擬環境 （選用）
<a name="create-virtual-environment"></a>

如果您有使用者指令碼所需的任何其他程式庫，您可以選擇建立虛擬環境來存放這些程式庫。如果您不需要其他程式庫，可以略過此步驟。

使用具有原生擴充功能的程式庫時，請記住 中的 PySpark 可在具有 ARM64 架構的 Linux 上 AWS Clean Rooms 運作。

下列程序示範如何使用基本 CLI 命令建立虛擬環境。

**建立虛擬環境**

1. 開啟終端機或命令提示字元。

1. 新增下列內容：

   ```
   # create and activate a python virtual environment
   python3 -m venv pyspark_venvsource
   source pyspark_venvsource/bin/activate
   
   # install the python packages
   pip3 install pandas # add packages here
   
   # package the virtual environment into an archive
   pip3 install venv-pack
   venv-pack -f -o pyspark_venv.tar.gz
   
   
   # optionally, remove the virtual environment directory
   deactivate
   rm -fr pyspark_venvsource
   ```

1. 您現在已準備好將此虛擬環境存放在 S3 中。如需詳細資訊，請參閱[在 S3 中存放使用者指令碼和虛擬環境](store-artifacts-in-s3.md)。

如需使用 Docker 和 Amazon ECR 的詳細資訊，請參閱 [Amazon ECRUser Guide](https://docs.aws.amazon.com/AmazonECR/latest/userguide/)。

# 在 S3 中存放使用者指令碼和虛擬環境
<a name="store-artifacts-in-s3"></a>

下列程序說明如何在 Amazon S3 中存放使用者指令碼和選用的虛擬環境。在建立 PySpark 分析範本之前，請先完成此步驟。

**重要**  
建立分析範本後，請勿修改或移除成品 （使用者指令碼或虛擬環境）。  
這樣做將：  
導致使用此範本的所有未來分析任務失敗。
需要建立具有新成品的新分析範本。
不會影響先前完成的分析任務

**先決條件**
+  AWS 帳戶 具有適當許可的
+ 使用者指令碼檔案 （例如 `my_analysis.py`)
+ （選用，如果有的話） 虛擬環境套件 (`.tar.gz` 檔案） 
+ 建立或修改 IAM 角色的存取權

------
#### [ Console ]

**若要使用主控台將使用者指令碼和虛擬環境存放在 S3 中：**

1. 登入 AWS 管理主控台 ，並在 [https://console.aws.amazon.com/s3/](https://console.aws.amazon.com/s3/)：// 開啟 Amazon S3 主控台。

1. 建立新的 S3 儲存貯體或使用現有的儲存貯體。

1. 啟用儲存貯體的版本控制。

   1. 選取您的儲存貯體。

   1. 選擇 **Properties (屬性)**。

   1. 在**儲存貯體版本控制**區段中，選擇**編輯**。

   1. 選取**啟用**並儲存變更。

1. 上傳成品並啟用 SHA-256 雜湊。

   1. 導覽至您的儲存貯體。

   1. 選擇**上傳**。

   1. 選擇**新增檔案**並新增您的使用者指令碼檔案。

   1. （選用，如果有的話） 新增您的 **.tar.gz** 檔案。

   1. 展開**屬性**。

   1. 在**檢查總**和下，針對**檢查總和函數**，選取 **SHA256**。

   1. 選擇**上傳**。

1. 您現在已準備好建立 PySpark 分析範本。

------
#### [ CLI ]

**若要使用 將使用者指令碼和虛擬環境存放在 S3 中 AWS CLI：**

1. 執行以下命令：

   ```
   aws s3 cp --checksum-algorithm sha256 pyspark_venv.tar.gz s3://ARTIFACT-BUCKET/EXAMPLE-PREFIX/
   ```

1. 您現在已準備好建立 PySpark 分析範本。

------

**注意**  
如果您需要更新指令碼或虛擬環境：  
將新版本上傳為單獨的物件。
使用新的成品建立新的分析範本。
棄用舊範本。
如果仍然需要舊範本，請將原始成品保留在 S3 中。

# 建立 PySpark 分析範本
<a name="create-pyspark-analysis-template"></a>

**注意**  
參數是使用者提供的字串，可包含任意內容。  
檢閱程式碼以確保安全地處理參數，以防止分析中的意外行為。
無論提交時提供哪些參數值，設計參數處理都能安全地運作。

**先決條件**

 建立 PySpark 分析範本之前，您必須具有：
+ 作用中 AWS Clean Rooms 協同合作的成員資格
+ 存取作用中協同合作中至少一個已設定的資料表
+ 建立分析範本的許可
+ 在 S3 中建立和存放的 Python 使用者指令碼和虛擬環境
  + S3 儲存貯體已啟用版本控制。如需詳細資訊，請參閱[在 S3 儲存貯體中使用版本控制](https://docs.aws.amazon.com/AmazonS3/latest/userguide/Versioning.html)
  + S3 儲存貯體可以計算上傳成品的 SHA-256 檢查總和。如需詳細資訊，請參閱[使用檢查總和](https://docs.aws.amazon.com/AmazonS3/latest/userguide/checking-object-integrity.html)
+ 從 S3 儲存貯體讀取程式碼的許可

  如需建立所需服務角色的詳細資訊，請參閱 [建立服務角色以從 S3 儲存貯體讀取程式碼 (PySpark 分析範本角色）](setting-up-roles.md#create-role-pyspark-analysis-template)。

下列程序說明使用[AWS Clean Rooms 主控台](https://console.aws.amazon.com/cleanrooms/home)建立 PySpark 分析範本的程序。其假設您已建立使用者指令碼和虛擬環境檔案，並將使用者指令碼和虛擬環境檔案存放在 Amazon S3 儲存貯體中。

**注意**  
建立 PySpark 分析範本的成員也必須是收到結果的成員。

如需有關如何使用 AWS SDKs 建立 PySpark 分析範本的資訊，請參閱 [AWS Clean Rooms API 參考](https://docs.aws.amazon.com/clean-rooms/latest/apireference/Welcome.html)。

**建立 PySpark 分析範本**

1. 登入 AWS 管理主控台 ，並使用 開啟 [AWS Clean Rooms 主控台](https://console.aws.amazon.com/cleanrooms/home) AWS 帳戶 ，以做為協作建立者。

1. 在左側導覽窗格中，選擇**協同合作**。

1. 選擇協同合作。

1. 在**範本**索引標籤上，前往**您建立的分析範本**區段。

1. 選擇**建立分析範本**。

1. 在**建立分析範本**頁面上，如需**詳細資訊**，

   1. 輸入分析範本**的名稱**。

   1. （選用） 輸入**描述**。

   1. 針對**格式**，選擇 **PySpark** 選項。

1. 對於**定義**，

   1. 檢閱**先決條件**，並確保符合每個先決條件，然後再繼續。

   1. 對於**進入點檔案**，輸入 S3 儲存貯體或選擇**瀏覽 S3**。

   1. （選用） 對於**程式庫檔案**，輸入 S3 儲存貯體或選擇**瀏覽 S3**。

1. 對於**參數 - 選用**，如果您想要新增參數以使分析範本可重複使用：

   1. 選擇 **Add parameter (新增參數)**。

   1. 輸入**參數名稱**。

      參數名稱必須以字母或底線開頭，後面接著英數字元或底線。

   1. 對於**類型**，會自動選取 **STRING** 作為 PySpark 分析範本唯一支援的類型。

   1. （選用） 輸入 參數的**預設值**。

      如果您提供預設值，任務執行器可以在執行任務時使用此值，而無需明確提供參數值。

   1. 若要新增更多參數，請選擇**新增另一個參數**並重複上述步驟。
**注意**  
每個 PySpark 分析範本最多可以定義 50 個參數。每個參數值最多可達 1，000 個字元。

1. 對於**定義中參考的資料表**，
   + 如果定義中參考的所有資料表都已與協同合作相關聯：
     + 保留**定義中參考的所有資料表已與選取的協同合作核取方塊相關聯**。
     + 在**與協同合作相關聯的資料表**下，選擇定義中參考的所有相關資料表。
   + 如果定義中參考的所有資料表尚未與協同合作相關聯：
     + 清除**定義中參考的所有資料表都已與協同合作核取方塊相關聯**。
     + 在**與協同合作相關聯的資料表**下，選擇定義中參考的所有相關資料表。
     + 在**稍後相關聯的資料表**下，輸入資料表名稱。
     + 選擇**列出另一個資料表**以列出另一個資料表。

1. 針對**錯誤訊息組態**，選擇下列其中一項：
   + **基本錯誤訊息** – 傳回基本錯誤訊息，而不會公開基礎資料。建議用於生產工作負載。
   + **詳細的錯誤訊息** – 傳回詳細的錯誤訊息，以加快故障診斷速度。建議在開發和測試環境中使用。可能會公開敏感資料，包括個人身分識別資訊 (PII)。
**注意**  
使用**詳細錯誤訊息**時，所有資料提供者成員都必須核准範本的此設定。

1. 從下拉式清單中選取**現有的服務角色名稱，以指定服務****存取**許可。

   1. 如果您具有列出角色的許可，則會顯示角色清單。

      如果您沒有列出角色的許可，您可以輸入要使用的角色的 Amazon Resource Name (ARN)。

   1. 選擇 **IAM 外部連結中的檢視**，以檢視服務角色。

      如果沒有現有的服務角色，則無法使用**使用現有服務角色**的選項。

      根據預設， AWS Clean Rooms 不會嘗試更新現有的角色政策來新增必要的許可。
**注意**  
AWS Clean Rooms 需要根據分析規則查詢的許可。如需 許可的詳細資訊 AWS Clean Rooms，請參閱 [AWS 的 受管政策 AWS Clean Rooms](security-iam-awsmanpol.md)。
如果角色沒有足夠的許可 AWS Clean Rooms，您會收到錯誤訊息，指出角色沒有足夠的許可給 AWS Clean Rooms。必須先新增角色政策，才能繼續。
如果您無法修改角色政策，您會收到錯誤訊息，指出 AWS Clean Rooms 找不到服務角色的政策。

1. 如果您想要為設定的資料表資源啟用**標籤**，請選擇**新增標籤**，然後輸入**金鑰**和**值**對。

1. 選擇**建立**。

1. 您現在可以通知協同合作成員，他們可以[檢閱分析範本](review-analysis-template.md)。（如果您想要查詢自己的資料，則為選用。)

**重要**  
建立分析範本後，請勿修改或移除成品 （使用者指令碼或虛擬環境）。  
這樣做將：  
導致使用此範本的所有未來分析任務失敗。
需要建立具有新成品的新分析範本。
不會影響先前完成的分析任務。

# 檢閱 PySpark 分析範本
<a name="review-pyspark-analysis-template"></a>

當其他成員在協同合作中建立分析範本時，您必須先檢閱並核准，才能使用它。

下列程序說明如何檢閱 PySpark 分析範本，包括其規則、參數和參考資料表。身為協同合作成員，您將評估範本是否符合您的資料共用協議和安全要求。

分析範本和 核准後，即可用於 中的任務 AWS Clean Rooms。

**注意**  
當您將分析程式碼帶入協同合作時，請注意下列事項：  
AWS Clean Rooms 不會驗證或保證分析程式碼的行為。  
如果您需要確保特定行為，請直接檢閱協同合作合作夥伴的程式碼，或與信任的第三方稽核人員合作進行檢閱。
AWS Clean Rooms 保證 PySpark 分析範本中所列程式碼的 SHA-256 雜湊符合 PySpark 分析環境中執行的程式碼。
AWS Clean Rooms 對於您帶入環境的其他程式庫， 不會執行任何稽核或安全分析。
在共用安全模型中：  
您 （客戶） 負責保護環境中執行之程式碼的安全性。
您 （客戶） 負責為環境設定適當的錯誤訊息組態。
AWS Clean Rooms 負責環境的安全，確保  
只有核准的程式碼會執行 
只能存取指定的已設定資料表 
唯一的輸出目的地是結果接收者的 S3 儲存貯體。

AWS Clean Rooms 會產生使用者指令碼和虛擬環境的 SHA-256 雜湊，供您檢閱。不過，實際的使用者指令碼和程式庫無法直接在 內存取 AWS Clean Rooms。

若要驗證共用的使用者指令碼和程式庫與分析範本中參考的指令碼和程式庫相同，您可以建立共用檔案的 SHA-256 雜湊，並將其與 建立的分析範本雜湊進行比較 AWS Clean Rooms。程式碼執行的雜湊也會在任務日誌中。

**先決條件**
+ Linux/Unix 作業系統或適用於 Linux 的 Windows 子系統 (WSL)
+ 您要雜湊的使用者指令碼檔案
  + 請求分析範本建立者透過安全管道共用檔案。
+ 建立的分析範本雜湊 AWS Clean Rooms

**使用 AWS Clean Rooms 主控台檢閱 PySpark 分析範本**

1. 登入 AWS 管理主控台 ，並使用 開啟 [AWS Clean Rooms 主控台](https://console.aws.amazon.com/cleanrooms/home) AWS 帳戶 ，以做為協同合作建立者。

1. 在左側導覽窗格中，選擇**協同合作**。

1. 選擇協同合作。

1. 在**範本**索引標籤上，前往**其他成員建立的分析範本**區段。

1. 選擇**可以執行狀態**為**否的分析範本需要您的檢閱**。

1. 選擇**檢閱**。

1. 檢閱分析規則**概觀**、**定義**和**參數** （如果有的話）。
**注意**  
參數允許分析執行器在提交時提交不同的值。如果分析範本支援參數，請檢閱如何在協同合作合作夥伴的程式碼中使用參數值，以確保其符合您的需求。

1. 驗證共用的使用者指令碼和程式庫是否與分析範本中參考的使用者指令碼和程式庫相同。

   1. 建立共用檔案的 SHA-256 雜湊，並將其與 建立的分析範本雜湊進行比較 AWS Clean Rooms。

      您可以導覽至包含使用者指令碼檔案的目錄，然後執行下列命令來產生雜湊：

      ```
      sha256sum your_script_filename.py
      ```

      輸出範例：

      ```
      e3b0c44298fc1c149afbf4c8996fb92427ae41e4649b934ca495991b7852b855 my_analysis.py
      ```

   1. 或者，您可以使用 Amazon S3 檢查總和功能。如需詳細資訊，請參閱《[https://docs.aws.amazon.com/AmazonS3/latest/userguide/checking-object-integrity.html](https://docs.aws.amazon.com/AmazonS3/latest/userguide/checking-object-integrity.html)。 *Amazon S3 *

   1. 另一個替代方法是檢視任務日誌中已執行程式碼的雜湊。

1. 檢閱**定義中參考的資料表下列出的已設定資料表**。

   每個資料表旁的**狀態**將讀取**不允許的範本**。

1. 選擇 表格。

   1. 若要核准分析範本，請選擇**允許資料表上的範本**。選擇**允許**，確認您的核准。

   1. 若要拒絕核准，請選擇**不允許**。

如果您選擇核准分析範本，可執行任務的成員現在可以使用 PySpark 分析範本，在設定的資料表上執行 PySpark 任務。如需詳細資訊，請參閱[執行 PySpark 任務](run-jobs.md)。