

# AWS Glue Studio ノートブックにおける ETL ジョブ向けの Data Quality
<a name="data-quality-gs-studio-notebooks"></a>

このチュートリアルでは、AWS Glue Studio ノートブックで、抽出、変換、ロード (ETL) ジョブに AWS Glue Data Quality を使用する方法について説明します。

AWS Glue Studio でノートブックを使用してジョブスクリプトを編集し、完全なジョブを実行せずに出力を表示できます。マークダウンを追加したり、ノートブックを `.ipynb` ファイルやジョブスクリプトとして保存したりすることもできます。ソフトウェアをローカルにインストールしたり、サーバーを管理したりすることなくノートブックを起動できます。コードに問題がなければ、AWS Glue Studio を使用して、ノートブックを AWS Glue ジョブに簡単に変換できます。

この例で使用されているデータセットは、2 つの Data.CMS.gov データセット (Inpatient Prospective Payment System Provider Summary for the Top 100 Diagnosis-Related Groups - FY2011 および Inpatient Charge Data FY 2011) からダウンロードされた、メディケアプロバイダーの支払いデータで構成されています。

ダウンロードした後、データセットを修正してファイルの最後にいくつかの誤ったレコードを追加しました。この変更されたファイルは、パブリックな Amazon S3 バケット (`s3://awsglue-datasets/examples/medicare/Medicare_Hospital_Provider.csv`) 内に置かれています。

## 前提条件
<a name="w2aac49c54c14"></a>
+  宛先 Amazon S3 バケットに書き込むための Amazon S3 アクセス許可を持つ AWS Glue ロール 
+  新しいノートブック (「[AWS Glue Studio 中でのノートブックの使用開始](https://docs.aws.amazon.com/glue/latest/ug/notebook-getting-started.html)」を参照) 

## AWS Glue Studio での ETL ジョブの作成
<a name="data-quality-notebooks-example"></a>

**ETL ジョブを作成するには**

1.  セッションバージョンを AWS Glue 3.0 に変更します。

    変更するには、以下の方法で定型コードのセルをすべて削除し、セルを実行します。この定型コードは、新しいノートブックを作成すると、最初のセルに自動的に入力されることに注意してください。

   ```
   %glue_version 3.0
   ```

1.  次のコードをコピーして、セルで実行します。

   ```
   import sys
   from awsglue.transforms import *
   from awsglue.utils import getResolvedOptions
   from pyspark.context import SparkContext
   from awsglue.context import GlueContext
   from awsglue.job import Job
   
   sc = SparkContext.getOrCreate()
   glueContext = GlueContext(sc)
   spark = glueContext.spark_session
   job = Job(glueContext)
   ```

1.  次のセルで、AWS Glue Data Quality を評価する `EvaluateDataQuality` クラスをインポートします。

   ```
   from awsgluedq.transforms import EvaluateDataQuality
   ```

1. 次のセルで、公開 Amazon S3 バケットに保存されている .csv ファイルを使用して、ソースデータを読み取ります。

   ```
   medicare = spark.read.format(
   "csv").option(
   "header", "true").option(
   "inferSchema", "true").load(
   's3://awsglue-datasets/examples/medicare/Medicare_Hospital_Provider.csv')
   medicare.printSchema()
   ```

1.  データを AWS Glue DynamicFrame に変換します。

   ```
   from awsglue.dynamicframe import DynamicFrame
   medicare_dyf = DynamicFrame.fromDF(medicare,glueContext,"medicare_dyf")
   ```

1.  データ品質定義言語 (DQDL) を使用して、ルールセットを作成します。

   ```
   EvaluateDataQuality_ruleset = """
       Rules = [
           ColumnExists "Provider Id",
           IsComplete "Provider Id",
           ColumnValues  " Total Discharges " > 15
   ]
       ]
   """
   ```

1.  データセットをルールセットに照らして検証します。

   ```
   EvaluateDataQualityMultiframe = EvaluateDataQuality().process_rows(
       frame=medicare_dyf,
       ruleset=EvaluateDataQuality_ruleset,
       publishing_options={
           "dataQualityEvaluationContext": "EvaluateDataQualityMultiframe",
           "enableDataQualityCloudWatchMetrics": False,
           "enableDataQualityResultsPublishing": False,
       },
       additional_options={"performanceTuning.caching": "CACHE_NOTHING"},
   )
   ```

1.  結果を確認します。

   ```
   ruleOutcomes = SelectFromCollection.apply(
       dfc=EvaluateDataQualityMultiframe,
       key="ruleOutcomes",
       transformation_ctx="ruleOutcomes",
   )
   
   ruleOutcomes.toDF().show(truncate=False)
   ```

    出力: 

   ```
   --------------------------------------+-------+-----------------------------------------------------+-------------------------------------------+
   |Rule                                  |Outcome|FailureReason                                        |EvaluatedMetrics                           |
   +--------------------------------------+-------+-----------------------------------------------------+-------------------------------------------+
   |ColumnExists "Provider Id"            |Passed |null                                                 |{}                                         |
   |IsComplete "Provider Id"              |Passed |null                                                 |{Column.Provider Id.Completeness -> 1.0}   |
   |ColumnValues " Total Discharges " > 15|Failed |Value: 11.0 does not meet the constraint requirement!|{Column. Total Discharges .Minimum -> 11.0}|
   +--------------------------------------+-------+-----------------------------------------------------+-------------------------------------------+
   ```

1.  合格した行をフィルタリングし、データ品質の行レベルの結果から不合格の行を確認します。

   ```
   owLevelOutcomes = SelectFromCollection.apply(
   dfc=EvaluateDataQualityMultiframe,
   key="rowLevelOutcomes",
   transformation_ctx="rowLevelOutcomes",
   )
   
   rowLevelOutcomes_df = rowLevelOutcomes.toDF() # Convert Glue DynamicFrame to SparkSQL DataFrame
   rowLevelOutcomes_df_passed = rowLevelOutcomes_df.filter(rowLevelOutcomes_df.DataQualityEvaluationResult == "Passed") # Filter only the Passed records.
   rowLevelOutcomes_df.filter(rowLevelOutcomes_df.DataQualityEvaluationResult == "Failed").show(5, truncate=False) # Review the Failed records
   ```

    出力: 

   ```
   +----------------------------------------+-----------+-------------------------------------+--------------------------+-------------+--------------+-----------------+------------------------------------+------------------+-------------------------+------------------------+-------------------------+--------------------------+----------------------------------------+----------------------------+---------------------------+
   |DRG Definition                          |Provider Id|Provider Name                        |Provider Street Address   |Provider City|Provider State|Provider Zip Code|Hospital Referral Region Description| Total Discharges | Average Covered Charges | Average Total Payments |Average Medicare Payments|DataQualityRulesPass      |DataQualityRulesFail                    |DataQualityRulesSkip        |DataQualityEvaluationResult|
   +----------------------------------------+-----------+-------------------------------------+--------------------------+-------------+--------------+-----------------+------------------------------------+------------------+-------------------------+------------------------+-------------------------+--------------------------+----------------------------------------+----------------------------+---------------------------+
   |039 - EXTRACRANIAL PROCEDURES W/O CC/MCC|10005      |MARSHALL MEDICAL CENTER SOUTH        |2505 U S HIGHWAY 431 NORTH|BOAZ         |AL            |35957            |AL - Birmingham                     |14                |$15131.85                |$5787.57                |$4976.71                 |[IsComplete "Provider Id"]|[ColumnValues " Total Discharges " > 15]|[ColumnExists "Provider Id"]|Failed                     |
   |039 - EXTRACRANIAL PROCEDURES W/O CC/MCC|10046      |RIVERVIEW REGIONAL MEDICAL CENTER    |600 SOUTH THIRD STREET    |GADSDEN      |AL            |35901            |AL - Birmingham                     |14                |$67327.92                |$5461.57                |$4493.57                 |[IsComplete "Provider Id"]|[ColumnValues " Total Discharges " > 15]|[ColumnExists "Provider Id"]|Failed                     |
   |039 - EXTRACRANIAL PROCEDURES W/O CC/MCC|10083      |SOUTH BALDWIN REGIONAL MEDICAL CENTER|1613 NORTH MCKENZIE STREET|FOLEY        |AL            |36535            |AL - Mobile                         |15                |$25411.33                |$5282.93                |$4383.73                 |[IsComplete "Provider Id"]|[ColumnValues " Total Discharges " > 15]|[ColumnExists "Provider Id"]|Failed                     |
   |039 - EXTRACRANIAL PROCEDURES W/O CC/MCC|30002      |BANNER GOOD SAMARITAN MEDICAL CENTER |1111 EAST MCDOWELL ROAD   |PHOENIX      |AZ            |85006            |AZ - Phoenix                        |11                |$34803.81                |$7768.90                |$6951.45                 |[IsComplete "Provider Id"]|[ColumnValues " Total Discharges " > 15]|[ColumnExists "Provider Id"]|Failed                     |
   |039 - EXTRACRANIAL PROCEDURES W/O CC/MCC|30010      |CARONDELET ST  MARYS HOSPITAL        |1601 WEST ST MARY'S ROAD  |TUCSON       |AZ            |85745            |AZ - Tucson                         |12                |$35968.50                |$6506.50                |$5379.83                 |[IsComplete "Provider Id"]|[ColumnValues " Total Discharges " > 15]|[ColumnExists "Provider Id"]|Failed                     |
   +----------------------------------------+-----------+-------------------------------------+--------------------------+-------------+--------------+-----------------+------------------------------------+------------------+-------------------------+------------------------+-------------------------+--------------------------+----------------------------------------+----------------------------+---------------------------+
   only showing top 5 rows
   ```

    AWS Glue Data Quality に 4 つの新しい列 (DataQualityRulesPass、DataQualityRulesFail、DataQualityRulesSkip、 DataQualityEvaluationResult) が追加されたことに注意してください。これには、合格したレコード、不合格のレコード、行レベルの評価でスキップされたルール、および行レベルの全体的な結果が表示されます。

1.  Amazon S3 バケットに出力を書き込んでデータを分析し、結果を視覚化します。

   ```
   #Write the Passed records to the destination. 
   
   glueContext.write_dynamic_frame.from_options(
          frame = rowLevelOutcomes_df_passed,
          connection_type = "s3",
          connection_options = {"path": "s3://glue-sample-target/output-dir/medicare_parquet"},
          format = "parquet")
   ```