

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

# 在 AWS Glue Studio 中評估 ETL 任務的資料品質
<a name="tutorial-data-quality"></a>

在本教學課程中，您可開始使用 AWS Glue Studio 中的 AWS Glue Data Quality。您將了解如何：
+  使用資料品質定義語言 (DQDL) 規則建置器建立規則。
+  指定資料品質動作、要輸出的資料，以及資料品質結果的輸出位置。
+  檢閱資料品質結果。

 若要練習範例，請檢閱部落格文章 [https://aws.amazon.com/blogs/big-data/getting-started-with-aws-glue-data-quality-for-etl-pipelines/](https://aws.amazon.com/blogs/big-data/getting-started-with-aws-glue-data-quality-for-etl-pipelines/)。

## 步驟 1：將「評估資料品質」轉換節點新增至視覺化任務
<a name="tutorial-data-quality-step1"></a>

在此步驟中，您要將評估資料品質節點新增到視覺化任務編輯器。

**新增資料品質節點**

1.  在 AWS Glue Studio 主控台中，從**建立任務**區段中選擇**具有來源和目標的視覺化**，然後選擇**建立**。

1.  選擇您要套用資料品質轉換的節點。一般而言，這將是轉換節點或資料來源。

1.  透過選擇 "\$1" 圖示開啟左側的資源面板。然後在搜尋列中輸入**評估資料品質**，接著從搜尋結果中選擇**評估資料品質**。

1.  視覺化任務編輯器將顯示從您選取的節點分支的**評估資料品質**轉換節點。在主控台右側，**轉換**索引標籤將自動開啟。如果需要變更父節點，請選擇**節點屬性**索引標籤，然後從下拉式選單中選擇父節點。

    選擇新的父節點時，會在父節點與**評估資料品質**節點之間建立新的連線。移除任何不需要的父節點。只有一個父節點可以連接到一個**評估資料品質**節點。

1.  「評估資料品質」轉換支援多個父項，因此您可以驗證多個資料集的資料品質規則。支援多個資料集的規則包括 ReferentialIntegrity、DatasetMatch、SchemaMatch、RowCountMatch 和 AggregateMatch。

   當您將多個輸入新增至「評估資料品質」轉換時，您需要選取「主要」輸入。您的主要輸入是您想要驗證資料品質的資料集。所有其他節點或輸入都被視為參考。

   您可以使用「評估資料品質」轉換來識別未通過資料品質檢查的特定記錄。建議您選擇主資料集，因為標示錯誤記錄的新資料欄會新增至主資料集。

1.  您可以為輸入資料來源指定別名。當您使用 ReferentialIntegrity 規則時，別名會提供另一種參考輸入來源的方式。因為只能將一個資料來源指定為主要來源，您新增的每個其他資料來源都需要別名。

   在下列範例中，ReferentialIntegrity 規則會依別名指定輸入資料來源，並與主要資料來源執行一對一的比較。

   ```
   Rules = [
   	ReferentialIntegrity “Aliasname.name” = 1
   ]
   ```

## 步驟 2：使用 DQDL 建立規則
<a name="tutorial-data-quality-step2"></a>

在此步驟中，您要使用 DQDL 建立規則。在本教學課程中，您將使用**完整度**規則類型建立單一規則。此規則類型會根據指定運算式檢查資料欄中完整 (非 Null) 值的百分比。如需有關使用 DQDL 的詳細資訊，請參閱 [DQDL](https://docs.aws.amazon.com/glue/latest/dg/dqdl.html)。

1.  在**轉換**索引標籤中，選擇**插入**按鈕以新增**規則類型**。這會將規則類型新增至規則編輯器，您可以在其中輸入規則的參數。
**注意**  
 編輯規則時，請確保規則位於括號內，且以逗號分隔規則。例如，完整的規則運算式如下所示：  

   ```
   Rules= [
       Completeness "year">0.8, Completeness "month">0.8
   ]
   ```
 此範例指定名為 'year' 和 'month' 資料欄的完整度參數。這些資料欄必須大於 80%「完整」，或各相應資料欄中 80% 以上的執行個體都有資料，才能通過規則。

    在此範例中，搜尋並插入**完整度**規則類型。這會將規則類型新增至規則編輯器。此規則類型的語法如下：`Completeness <COL_NAME> <EXPRESSION>`。

   大多數規則類型都需要您提供運算式作為參數，以建立布林值回應。如需有關支援的 DQDL 運算式的詳細資訊，請參閱 [DQDL 運算式](https://docs.aws.amazon.com/glue/latest/dg/dqdl.html#dqdl-syntax)。接著新增資料欄名稱。

1.  在 DQDL 規則建置器中，按一下**結構描述**索引標籤。使用搜尋列尋找輸入結構描述中的欄名稱。輸入結構描述會顯示欄名稱和資料類型。

1.  在規則編輯器中按一下規則類型右側，將游標插入要插入資料欄的位置。或者，您也可以在規則中輸入資料欄的名稱。

    例如，在輸入結構描述清單中的資料欄清單中，選擇資料欄 (在此範例中為**年**) 旁的**插入**按鈕。這會將資料欄新增至規則。

1.  然後，在規則編輯器中新增運算式來評估規則。由於**完整度**規則類型會根據指定運算式檢查欄中完整 (非 Null) 值的百分比，請輸入運算式，例如 `> 0.8`。此規則將檢查資料欄是否大於 80% 的完整 (非 Null) 值。

## 步驟 3：設定資料品質輸出
<a name="tutorial-data-quality-step3"></a>

 建立資料品質規則後，即可選取其他選項以指定資料品質節點輸出：

1.  在**資料品質轉換輸出**中，從以下選項中選擇：
   +  **原始資料**：選擇輸出原始輸入資料。當您選擇此選項時，任務中會新增一個新的子節點 “rowLevelOutcomes”。其結構描述與作為輸入傳遞至轉換的主資料集結構描述相符。如果您只想在品質問題發生時傳遞資料並讓任務失敗，則此選項非常有用。

     另一個使用案例是當您想要偵測未通過資料品質檢查的錯誤記錄時。若要偵測錯誤記錄，請選擇**新增資料欄以指出資料品質錯誤**選項。此動作會將四個新資料欄新增至 “rowLevelOutcomes” 轉換的結構描述。
     +  **DataQualityRulesPass** (字串陣列)：提供通過資料品質檢查的規則陣列。
     +  **DataQualityRulesFail** (字串陣列)：提供未通過資料品質檢查的規則陣列。
     +  **DataQualityRulesSkip** (字串陣列)：提供已略過的規則陣列。下列規則無法識別錯誤記錄，因為它們是在資料集層級套用。
       +  AggregateMatch 
       +  ColumnCount 
       +  ColumnExists 
       +  ColumnNamesMatchPattern 
       +  CustomSql 
       +  RowCount 
       +  RowCountMatch 
       +  StandardDeviation 
       +  Mean 
       +  ColumnCorrelation 
     +  **DataQualityEvaluationResult**：在資料列層級提供「已通過」或 「未通過」狀態。請注意，您的整體結果可能是未通過，但某個記錄可能會通過。例如，RowCount 規則可能已失敗，但所有其他規則可能已成功。在這種情況下，此欄位狀態為「已通過」。

1.  **資料品質結果**：選擇輸出已設定的規則及其通過或失敗狀態。如果您想要將結果寫入 Amazon S3 或其他資料庫，此選項非常有用。

1. **資料品質輸出設定** (選用)：選擇**資料品質輸出設定**，以顯示**資料品質結果位置**欄位。然後選擇**瀏覽**，以搜尋要設定為資料品質輸出目標的 Amazon S3 位置。

## 步驟 4. 設定資料品質動作
<a name="tutorial-data-quality-step4"></a>

 動作可讓您根據特定條件將指標發布至 CloudWatch 或停止任務。動作只有在您建立規則之後才可用。當您選擇此選項時，相同的指標也會發布至 Amazon EventBridge。您可以使用這些選項[建立通知警示](https://docs.aws.amazon.com/glue/latest/dg/data-quality-alerts.html)。
+  **規則集失敗時**：如果規則集在任務執行時失敗，您可以選擇該怎麼做。如果您希望任務在資料品質失敗時失敗，請選取下列其中一個選項來選擇任務失敗的時間。預設不會選取此動作，即使資料品質規則失敗，任務也會完成執行。
  +  **無**：如果選擇 **無** (預設值)，即使規則集失敗，任務也不會失敗，而會繼續執行。
  +  **將資料載入目標後任務失敗**：任務失敗且不儲存任何資料。若要儲存結果，請選擇要儲存資料品質結果的 Amazon S3 位置。
  +  **任務失敗而不載入至目標資料**：發生資料品質錯誤時，此選項會立即讓任務失敗。它不會載入任何資料目標，包括資料品質轉換的結果。

## 步驟 5：檢視資料品質結果
<a name="tutorial-data-quality-step5"></a>

 執行任務後，選擇**資料品質**索引標籤來檢視資料品質結果。

1.  檢視每個任務執行的資料品質結果。每個節點都會顯示資料品質狀態和狀態詳細資訊。選擇節點以檢視所有規則和每個規則的狀態。

1.  選擇**下載結果**以下載 CSV 檔案，其中包含有關任務執行和資料品質結果的資訊。

1.  如果您執行多個具有資料品質結果的任務，則可以依日期和時間範圍篩選結果。選擇*依日期和時間範圍篩選*以展開篩選條件視窗。

1.  選擇相對範圍或絕對範圍。如要使用絕對範圍，請使用行事曆選取日期，並輸入開始時間和結束時間的值。完成時，請選擇**套用**。

## 自動資料品質
<a name="automatic-data-quality"></a>

 當您以 AWS Amazon S3 做為目標建立 Glue ETL 任務時， AWS Glue ETL 會自動啟用 Data Quality 規則，以檢查要載入的資料是否至少有一個資料欄。此規則旨在確保載入的資料不會空白或損毀。不過，如果此規則失敗，任務將不會失敗；反之，您會發現資料品質分數降低。此外，會預設啟用異常偵測，其可監控資料中的資料欄數目。如果資料欄計數中有任何變化或異常， AWS Glue ETL 會通知您這些異常。此功能可協助您發現資料的潛在問題，並採取適當動作。若要檢視 Data Quality 規則及其組態，您可以在 Glue ETL 任務中按一下 Amazon S3 AWS 目標。將會顯示規則的組態，如提供的螢幕擷取畫面所示。

![\[螢幕擷取畫面顯示可供選取的自動資料品質選項。\]](http://docs.aws.amazon.com/zh_tw/glue/latest/dg/images/automatic-data-quality.png)


 可以選取**編輯資料品質組態**來新增其他資料品質規則。

## 彙總指標
<a name="data-quality-aggregated-metrics"></a>

您可能需要彙總指標來建置儀表板，例如在規則層級或規則集層級傳遞、失敗、略過的記錄數。若要取得每個規則的彙總指標和規則指標，請先將 `publishAggregatedMetrics` 選項新增至 `EvaluateDataQuality` 函數，以啟用彙總指標。

`additional_options` `publishAggregatedMetrics` 的可能選項為 `ENABLED` 和 `DISABLED`。舉例來說：

```
EvaluateDataQualityMultiframe = EvaluateDataQuality().process_rows(
    frame=medicare_dyf,
    ruleset=EvaluateDataQuality_ruleset,
    publishing_options={
        "dataQualityEvaluationContext": "EvaluateDataQualityMultiframe",
        "enableDataQualityCloudWatchMetrics": False,
        "enableDataQualityResultsPublishing": False,
    },
    additional_options={"publishAggregatedMetrics.status": "ENABLED"},
)
```

如果未指定，則 `publishAggregatedMetrics.status` 預設為 `DISABLED`，現在將計算規則指標和彙總指標。Glue AWS 互動式工作階段和 Glue ETL 任務目前支援此功能。Glue Catalog Data Quality API 不支援此功能。

### 擷取彙總指標結果
<a name="data-quality-aggregated-metrics-results"></a>

當 `additionalOptions` 為 `"publishAggregatedMetrics.status": "ENABLED"` 時，可以在兩個位置取得結果：

1. 當提供 `resultId` 時，透過 `GetDataQualityResult()` 傳回 `AggregatedMetrics` 和 `RuleMetrics`，其中 `AggregatedMetrics` 和 `RuleMetrics` 包含：

   **彙總指標：**
   + 已處理的資料列總數
   + 已傳遞的資料列總數
   + 已失敗的資料列總數
   + 已處理的規則總數
   + 已傳遞的規則總數
   + 已失敗的規則總數  
![\[螢幕擷取畫面顯示 Glue Data Quality AWS 評估的彙總指標和規則指標結構。\]](http://docs.aws.amazon.com/zh_tw/glue/latest/dg/images/data-quality-aggregated-metrics.png)

   此外，在規則層級，會提供下列指標：

   **規則指標：**
   + 已傳遞的資料列
   + 已失敗的資料列
   + 已略過的資料列
   + 已處理的資料列總數

1. 會以其他的資料影格傳回 `AggregatedMetrics`，並擴增 `RuleOutcomes` 資料影格以包含 `RuleMetrics`。

### 實作範例
<a name="data-quality-aggregated-metrics-example"></a>

下列範例示範如何在 Scala 中實作彙總指標：

```
// Script generated for node Evaluate Data Quality
val EvaluateDataQuality_node1741974822533_ruleset = """
  # Example rules: Completeness "colA" between 0.4 and 0.8, ColumnCount > 10
  Rules = [
      IsUnique "customer_identifier",
      RowCount > 10,
      Completeness "customer_identifier" > 0.5
  ]
"""

val EvaluateDataQuality_node1741974822533 = EvaluateDataQuality.processRows(frame=ChangeSchema_node1742850392012, ruleset=EvaluateDataQuality_node1741974822533_ruleset, publishingOptions=JsonOptions("""{"dataQualityEvaluationContext": "EvaluateDataQuality_node1741974822533", "enableDataQualityCloudWatchMetrics": "true", "enableDataQualityResultsPublishing": "true"}"""), additionalOptions=JsonOptions("""{"compositeRuleEvaluation.method":"ROW","observations.scope":"ALL","performanceTuning.caching":"CACHE_NOTHING", "publishAggregatedMetrics.status": "ENABLED"}"""))

println("--------------------------------ROW LEVEL OUTCOMES--------------------------------")
val rowLevelOutcomes_node = EvaluateDataQuality_node1741974822533("rowLevelOutcomes")

rowLevelOutcomes_node.show(10)

 println("--------------------------------RULE LEVEL OUTCOMES--------------------------------")

val ruleOutcomes_node = EvaluateDataQuality_node1741974822533("ruleOutcomes")

ruleOutcomes_node.show()

 println("--------------------------------AGGREGATED METRICS--------------------------------")

val aggregatedMetrics_node = EvaluateDataQuality_node1741974822533("aggregatedMetrics")

aggregatedMetrics_node.show()
```

### 範例結果
<a name="data-quality-aggregated-metrics-sample-results"></a>

會傳回結果，如下所示：

```
{
    "Rule": "IsUnique \"customer_identifier\"",
    "Outcome": "Passed",
    "FailureReason": null,
    "EvaluatedMetrics": {
        "Column.customer_identifier.Uniqueness": 1
    },
    "EvaluatedRule": "IsUnique \"customer_identifier\"",
    "PassedCount": 10,
    "FailedCount": 0,
    "SkippedCount": 0,
    "TotalCount": 10
}
{
    "Rule": "RowCount > 10",
    "Outcome": "Failed",
    "FailureReason": "Value: 10 does not meet the constraint requirement!",
    "EvaluatedMetrics": {
        "Dataset.*.RowCount": 10
    },
    "EvaluatedRule": "RowCount > 10",
    "PassedCount": 0,
    "FailedCount": 0,
    "SkippedCount": 10,
    "TotalCount": 10
}
{
    "Rule": "Completeness \"customer_identifier\" > 0.5",
    "Outcome": "Passed",
    "FailureReason": null,
    "EvaluatedMetrics": {
        "Column.customer_identifier.Completeness": 1
    },
    "EvaluatedRule": "Completeness \"customer_identifier\" > 0.5",
    "PassedCount": 10,
    "FailedCount": 0,
    "SkippedCount": 0,
    "TotalCount": 10
}
```

彙總指標如下所示：

```
{ "TotalRowsProcessed": 10, "PassedRows": 10, "FailedRows": 0, "TotalRulesProcessed": 3, "RulesPassed": 2, "RulesFailed": 1 }
```