

# データカタログの管理
<a name="manage-catalog"></a>

 AWS Glue Data Catalog は、Amazon S3 データセットの構造メタデータと運用メタデータを保存する中央メタデータリポジトリです。データカタログを効果的に管理することは、データ品質、パフォーマンス、セキュリティ、ガバナンスを維持する上で重要です。

 これらのデータカタログ管理プラクティスを理解して適用することで、データランドスケープの進化に合わせて、メタデータが正確でパフォーマンスが高く、安全で、十分に管理されるようにすることができます。

このセクションでは、データカタログ管理の以下の側面について説明します。
+ テーブルスキーマとパーティションの更新: データの進化に伴い、データカタログで定義されているテーブルスキーマまたはパーティション構造を更新する必要が生じる場合があります。AWS Glue ETL を使用してプログラムでこれらの更新を行う方法の詳細については、「[AWS Glue ETL ジョブを使用してデータカタログのスキーマを更新し、新規パーティションを追加する](update-from-job.md)」を参照してください。
+ 列統計の管理: 正確な列統計は、クエリプランの最適化とパフォーマンスの向上に役立ちます。列統計を生成、更新、管理する方法については、「[列統計を使用したクエリのパフォーマンスの最適化](column-statistics.md)」を参照してください。
+  データカタログの暗号化: 機密メタデータを保護するために、AWS Key Management Service (AWS KMS) を使用してデータカタログを暗号化できます。このセクションでは、データカタログの暗号化を有効にして管理する方法について説明します。
+ AWS Lake Formation を使用したデータカタログの保護: Lake Formation には、データレイクのセキュリティとアクセスコントロールに対する包括的なアプローチが用意されています。Lake Formation を使用して、データカタログおよび基盤となるデータへのアクセスを保護および管理できます。

**Topics**
+ [AWS Glue ETL ジョブを使用してデータカタログのスキーマを更新し、新規パーティションを追加する](update-from-job.md)
+ [列統計を使用したクエリのパフォーマンスの最適化](column-statistics.md)
+ [Data Catalog の暗号化](catalog-encryption.md)
+ [Lake Formation を使用したデータカタログの保護](secure-catalog.md)
+ [AWS Glue での AWS Glue Data Catalog ビューの使用](catalog-views.md)

# AWS Glue ETL ジョブを使用してデータカタログのスキーマを更新し、新規パーティションを追加する
<a name="update-from-job"></a>

抽出、変換、ロード (ETL) ジョブによって、ターゲットデータストアに新しいテーブルパーティションが作成される場合があります。データセットスキーマは、時間の経過とともに AWS Glue Data Catalog スキーマから進化し、拡散する可能性があります。AWS GlueETL ジョブには、ETL スクリプト内で使用できるいくつかの機能が用意され、Data Catalog でスキーマおよびパーティションを更新できるようになりました。これらの機能を使用すると、クローラを再実行することなく、Data Catalog での ETL 作業の結果を確認できます。

## 新しいパーティション
<a name="update-from-job-partitions"></a>

AWS Glue Data Catalog で新しいパーティションを表示するには、次のいずれかを実行します。
+ ジョブが終了したら、クローラを再実行し、クローラの完了時にコンソールで新しいパーティションを表示します。
+ ジョブが終了すると、クローラを再実行することなく、コンソールで新しいパーティションがすぐに表示されます。この機能は、次の例に示すように、ETL スクリプトに数行のコードを追加して有効にすることができます。このコードは `enableUpdateCatalog` 引数を使用して、新しいパーティションの作成時のジョブ実行中に Data Catalog を更新する必要があることを示します。

**方式 1**  
オプション引数に `enableUpdateCatalog` と `partitionKeys` を渡します。  

```
additionalOptions = {"enableUpdateCatalog": True}
additionalOptions["partitionKeys"] = ["region", "year", "month", "day"]


sink = glueContext.write_dynamic_frame_from_catalog(frame=last_transform, database=<target_db_name>,
                                                    table_name=<target_table_name>, transformation_ctx="write_sink",
                                                    additional_options=additionalOptions)
```

```
val options = JsonOptions(Map(
    "path" -> <S3_output_path>, 
    "partitionKeys" -> Seq("region", "year", "month", "day"), 
    "enableUpdateCatalog" -> true))
val sink = glueContext.getCatalogSink(
    database = <target_db_name>, 
    tableName = <target_table_name>, 
    additionalOptions = options)sink.writeDynamicFrame(df)
```

**方式 2**  
`enableUpdateCatalog` に `partitionKeys` と `getSink()` を渡して、`DataSink` オブジェクトで `setCatalogInfo()` を呼び出します。  

```
sink = glueContext.getSink(
    connection_type="s3", 
    path="<S3_output_path>",
    enableUpdateCatalog=True,
    partitionKeys=["region", "year", "month", "day"])
sink.setFormat("json")
sink.setCatalogInfo(catalogDatabase=<target_db_name>, catalogTableName=<target_table_name>)
sink.writeFrame(last_transform)
```

```
val options = JsonOptions(
   Map("path" -> <S3_output_path>, 
       "partitionKeys" -> Seq("region", "year", "month", "day"), 
       "enableUpdateCatalog" -> true))
val sink = glueContext.getSink("s3", options).withFormat("json")
sink.setCatalogInfo(<target_db_name>, <target_table_name>)
sink.writeDynamicFrame(df)
```

クローラを再実行することなく、AWS Glue ETLジョブ自体を使用して、Data Catalog での新しいカタログテーブルの作成、変更されたスキーマによる既存のテーブルの更新、および新しいテーブルパーティションの追加が可能になりました。

## テーブルスキーマの更新
<a name="update-from-job-updating-table-schema"></a>

Data Catalog テーブルのスキーマを上書きする場合は、次のいずれかを実行します。
+ ジョブが終了したら、クローラを再実行し、テーブル定義も更新するようにクローラが設定されていることを確認します。クローラが終了したら、新しいパーティションをスキーマの更新とともにコンソールに表示します。詳細については、「[API を使用したクローラの設定](https://docs.aws.amazon.com/glue/latest/dg/crawler-configuration.html#crawler-configure-changes-api)」を参照してください。
+ ジョブが終了すると、クローラを再実行することなく、コンソールで変更済みスキーマがすぐに表示されます。この機能は、次の例に示すように、ETL スクリプトに数行のコードを追加して有効にすることができます。このコードでは `enableUpdateCatalog` を true に設定し、`updateBehavior` を `UPDATE_IN_DATABASE` に設定しています。これは、ジョブ実行中にスキーマを上書きし、Data Catalog に新しいパーティションを追加することを示します。

------
#### [ Python ]

```
additionalOptions = {
    "enableUpdateCatalog": True, 
    "updateBehavior": "UPDATE_IN_DATABASE"}
additionalOptions["partitionKeys"] = ["partition_key0", "partition_key1"]

sink = glueContext.write_dynamic_frame_from_catalog(frame=last_transform, database=<dst_db_name>,
    table_name=<dst_tbl_name>, transformation_ctx="write_sink",
    additional_options=additionalOptions)
job.commit()
```

------
#### [ Scala ]

```
val options = JsonOptions(Map(
    "path" -> outputPath, 
    "partitionKeys" -> Seq("partition_0", "partition_1"), 
    "enableUpdateCatalog" -> true))
val sink = glueContext.getCatalogSink(database = nameSpace, tableName = tableName, additionalOptions = options)
sink.writeDynamicFrame(df)
```

------

テーブルスキーマが上書きされないようにして、新しいパーティションを追加する場合は、`updateBehavior` 値を `LOG` に設定することもできます。`updateBehavior` のデフォルト値は `UPDATE_IN_DATABASE` です。そのため、明示的に定義しない場合、テーブルスキーマは上書きされます。

`enableUpdateCatalog` が true に設定されていない場合、`updateBehavior` で選択したオプションに関係なく、ETL ジョブは Data Catalog 内のテーブルを更新しません。

## 新しいテーブルの作成
<a name="update-from-job-creating-new-tables"></a>

同じオプションを使用して、Data Catalog で新しいテーブルを作成することもできます。`setCatalogInfo` を使用して、データベースと新しいテーブル名を指定できます。

------
#### [ Python ]

```
sink = glueContext.getSink(connection_type="s3", path="s3://path/to/data",
    enableUpdateCatalog=True, updateBehavior="UPDATE_IN_DATABASE",
    partitionKeys=["partition_key0", "partition_key1"])
sink.setFormat("<format>")
sink.setCatalogInfo(catalogDatabase=<dst_db_name>, catalogTableName=<dst_tbl_name>)
sink.writeFrame(last_transform)
```

------
#### [ Scala ]

```
val options = JsonOptions(Map(
    "path" -> outputPath, 
    "partitionKeys" -> Seq("<partition_1>", "<partition_2>"), 
    "enableUpdateCatalog" -> true, 
    "updateBehavior" -> "UPDATE_IN_DATABASE"))
val sink = glueContext.getSink(connectionType = "s3", connectionOptions = options).withFormat("<format>")
sink.setCatalogInfo(catalogDatabase = “<dst_db_name>”, catalogTableName = “<dst_tbl_name>”)
sink.writeDynamicFrame(df)
```

------

## 制限事項
<a name="update-from-job-restrictions"></a>

次の制限事項に注意してください。
+ Amazon Simple Storage Service (Amazon S3) のターゲットのみがサポートされています。
+ `enableUpdateCatalog` 機能は、管理対象テーブルでは、サポートされていません。
+ `json`、`csv`、`avro`、および `parquet` の形式のみがサポートされます。
+ `parquet` 分類でテーブルを作成または更新するには、AWS Glue に最適化された DynamicFrames 用 parquet ライターを使用する必要があります。これは、次のいずれかの方法で実現できます。
  + `parquet` 分類を使用してカタログ内の既存のテーブルを更新する場合は、更新前にテーブルでは `"useGlueParquetWriter"` テーブルプロパティを `true` に設定する必要があります。このプロパティは、AWS Glue API/SDK、コンソール、または Athena DDL ステートメントから設定できます。  
![\[AWS Glue コンソールのカタログテーブルプロパティの編集フィールド。\]](http://docs.aws.amazon.com/ja_jp/glue/latest/dg/images/edit-table-property.png)

    カタログテーブルプロパティを設定したら、次のコードスニペットを使用して新しいデータでカタログテーブルを更新します。

    ```
    glueContext.write_dynamic_frame.from_catalog(
        frame=frameToWrite,
        database="dbName",
        table_name="tableName",
        additional_options={
            "enableUpdateCatalog": True,
            "updateBehavior": "UPDATE_IN_DATABASE"
        }
    )
    ```
  + テーブルがカタログ内にまだ存在しない場合は、`connection_type="s3"` を用いた `getSink()` メソッドをスクリプトで使用して、データを Amazon S3 に書き込むとともに、テーブルとそのパーティションをカタログに追加します。ワークフローに適切な `partitionKeys` と `compression` を指定します。

    ```
    s3sink = glueContext.getSink(
        path="s3://bucket/folder/",
        connection_type="s3",
        updateBehavior="UPDATE_IN_DATABASE",
        partitionKeys=[],
        compression="snappy",
        enableUpdateCatalog=True
    )
        
    s3sink.setCatalogInfo(
        catalogDatabase="dbName", catalogTableName="tableName"
    )
        
    s3sink.setFormat("parquet", useGlueParquetWriter=True)
    s3sink.writeFrame(frameToWrite)
    ```
  + `glueparquet` フォーマットの値は、AWS Glue parquet ライターを有効にする従来のメソッドです。
+ `updateBehavior` を `LOG` に設定した場合、`DynamicFrame` スキーマが Data Catalog テーブルのスキーマに定義されている列のサブセットと同等であるか、またはそのサブセットを含んでいる場合にのみ、新しいパーティションが追加されます。
+ スキーマの更新は、パーティション化されていないテーブル (「partitionKeys」オプションを使用していない) ではサポートされていません。
+ partitionKeys は、ETL スクリプトで渡されるパラメータと Data Catalog テーブルスキーマの partitionKeys で同等で、同じ順序でなければなりません。
+ この機能は、現在、更新スキーマがネストされているテーブルの更新/作成をサポートしていません (例えば、構造体の内部の配列)。

詳細については、[Spark スクリプトのプログラミング](aws-glue-programming.md) を参照してください。

# ETL ジョブでの MongoDB 接続の操作
<a name="integrate-with-mongo-db"></a>

MongoDB の接続を作成し、その接続を AWS Glue ジョブで使用します。詳細については、「AWS Glue プログラミングガイド」の「[MongoDB 接続](aws-glue-programming-etl-connect-mongodb-home.md)」を参照してください。接続の `url`、`username`、および `password` は MongoDB 接続に保存されます。ETL ジョブスクリプトで `glueContext.getCatalogSource` という `additionalOptions` パラメータを使用して、その他のオプションを指定できます。その他のオプションには次のようなものがあります。
+ `database`: (必須) 読み込み元の MongoDB データベース。
+ `collection`: (必須) 読み込み元の MongoDB コレクション。

ETL ジョブスクリプト内に `database` および `collection` 情報を書き込むと、複数のジョブに同じ接続を使用できます。

1. AWS Glue Data Catalog 接続を MongoDB データソース用に作成します。接続パラメータの説明については、「["connectionType": "mongodb"](https://docs.aws.amazon.com/glue/latest/dg/aws-glue-programming-etl-connect.html#aws-glue-programming-etl-connect-mongodb)」を参照してください。接続は、コンソール、API、または CLI を使用して作成できます。

1. AWS Glue Data Catalog でデータベースを作成して MongoDB データのテーブル定義を格納します。詳細については「[データベースの作成](define-database.md)」を参照してください。

1. MongoDB に接続するための接続内の情報を使用して、MongoDB 内のデータをクロールするクローラを作成します。クローラによって、ジョブで使用する MongoDB データベース内のテーブルを記述するテーブルが AWS Glue Data Catalog に作成されます。詳細については「[クローラーを使用したデータカタログへの入力](add-crawler.md)」を参照してください。

1. カスタムスクリプトを使用してジョブを作成します。ジョブは、コンソール、API、または CLI を使用して作成できます。詳細については、「[AWS Glue でジョブを追加する](https://docs.aws.amazon.com/glue/latest/dg/add-job.html)」を参照してください。

1. ジョブ用のデータターゲットを選択します。データターゲットを表すテーブルは、Data Catalog で定義することも、ジョブを実行するときに作成することもできます。ジョブを作成するときに、ターゲットの場所を選択します。ターゲットに接続が必要な場合、接続もジョブ内で参照されます。ジョブに複数のデータターゲットが必要な場合、後でスクリプトを編集して追加できます。

1. ジョブと生成されたスクリプトの引数を指定することで、ジョブ処理環境をカスタマイズします。

   Data Catalog で定義されたテーブル構造に基づいて、MongoDB データベースから `DynamicFrame` を作成する例を次に示します。このコードは `additionalOptions` を使用して、追加のデータソースの情報を指定しています。

------
#### [  Scala  ]

   ```
   val resultFrame: DynamicFrame = glueContext.getCatalogSource(
           database = catalogDB, 
           tableName = catalogTable, 
           additionalOptions = JsonOptions(Map("database" -> DATABASE_NAME, 
                   "collection" -> COLLECTION_NAME))
         ).getDynamicFrame()
   ```

------
#### [  Python  ]

   ```
   glue_context.create_dynamic_frame_from_catalog(
           database = catalogDB,
           table_name = catalogTable,
           additional_options = {"database":"database_name", 
               "collection":"collection_name"})
   ```

------

1. オンデマンドで、またはトリガーを使用してジョブを実行します。

# 列統計を使用したクエリのパフォーマンスの最適化
<a name="column-statistics"></a>

追加のデータパイプラインを設定することなく、Parquet、ORC、JSON、ION、CSV、XML などのデータ形式で AWS Glue Data Catalog テーブルの列レベルの統計を計算できます。列統計は、列内の値に関するインサイトを得ることで、データプロファイルを理解するのに役立ちます。

データカタログは、列値（最小値、最大値、null 値の合計、個別の値の合計、値の平均長、真値の合計出現数など）の統計の生成をサポートします。Amazon Redshift や Amazon Athena などの AWS 分析サービスでは、これらの列統計を使用してクエリの実行プランを生成でき、クエリのパフォーマンスを向上させる最適なプランを選択できます。

列統計の生成には次の 3 つのシナリオがあります。

 **Auto**   
AWS Glue は、カタログレベルで列統計の自動生成をサポートしているため、AWS Glue Data Catalog で新しいテーブルの統計を自動的に生成できます。

**Scheduled (スケジュール済み)**  
AWS Glue は、列統計の生成を定期的なスケジュールで自動的に実行できるようにサポートします。  
スケジュールされた統計計算では、列統計タスクは、最小、最大、平均などのテーブルレベルの統計全体を新しい統計で更新し、クエリエンジンに正確かつ最新の統計を提供して、クエリの実行を最適化します。

**[オンデマンド]**  
このオプションを使用して、必要に応じて列統計をオンデマンドで生成します。これは、アドホック分析や統計をすぐに計算する必要がある場合に役立ちます。

AWS Glue コンソール、AWS CLI、AWS Glue API オペレーションを使用して列統計の生成タスクを実行するように設定できます。プロセスを開始すると、AWS Glue はバックグラウンドで Spark ジョブを開始し、データカタログ内の AWS Glue テーブルメタデータを更新します。列統計は、AWS Glue コンソールもしくは AWS CLI を使用して、または [GetColumnStatisticsForTable](https://docs.aws.amazon.com/glue/latest/webapi/API_GetColumnStatisticsForTable.html) API オペレーションを呼び出すことによって表示できます。

**注記**  
Lake Formation の許可を使用してテーブルに対するアクセスを制御している場合、列統計タスクによって引き受けられるロールには、統計を生成するための完全なテーブルアクセスが必要です。

 次の動画では、列統計を使用してクエリのパフォーマンスを向上させる方法が示されます。

[![AWS Videos](http://img.youtube.com/vi/https://www.youtube.com/embed/zUHEXJdHUxs?si=HjyhpoALR6RXJz2i/0.jpg)](http://www.youtube.com/watch?v=https://www.youtube.com/embed/zUHEXJdHUxs?si=HjyhpoALR6RXJz2i)


**Topics**
+ [列統計を生成するための前提条件](column-stats-prereqs.md)
+ [列統計の自動生成](auto-column-stats-generation.md)
+ [スケジュールで列統計の生成](generate-column-stats.md)
+ [オンデマンドでの列統計の生成](column-stats-on-demand.md)
+ [列統計の表示](view-column-stats.md)
+ [列統計タスクの実行の表示](view-stats-run.md)
+ [列統計タスクの実行の停止](stop-stats-run.md)
+ [列統計の削除](delete-column-stats.md)
+ [考慮事項と制限事項](column-stats-notes.md)

# 列統計を生成するための前提条件
<a name="column-stats-prereqs"></a>

列統計を生成または更新するために、統計生成タスクはユーザーに代わって AWS Identity and Access Management (IAM) ロールを引き受けます。ロールに付与された許可に基づいて、列統計生成タスクは Amazon S3 データストアからデータを読み取ることができます。

AWS Glue では、列統計生成タスクを設定するときに、`AWSGlueServiceRole` AWS 管理ポリシーと指定されたデータソースに必要なインラインポリシーを含むロールを作成できます。

列統計の生成に既存のロールを指定する場合は、そのロールに `AWSGlueServiceRole` ポリシーまたは同等のポリシー (またはこのポリシーのスコープダウンバージョン)、および必要なインラインポリシーが含まれてることを確認します。次のステップに従って、新しい IAM ロールを作成します。

**注記**  
 Lake Formation によって管理されるテーブルの統計を生成するには、統計の生成に使用される IAM ロールに完全なテーブルアクセスが必要です。　 

AWS Glue では、列統計生成タスクを設定するときに、`AWSGlueServiceRole` AWS 管理ポリシーと指定されたデータソースに必要なインラインポリシーを含むロールを作成できます。また、ロールを作成して、以下のポリシーにリストされているアクセス許可をアタッチし、そのロールを列統計生成タスクに追加することもできます。

**列統計を生成するための IAM ロールを作成するには**

1. IAM ロールを作成するには、「[AWS Glue の IAM ロールを作成する](https://docs.aws.amazon.com/glue/latest/dg/create-an-iam-role.html)」を参照してください。

1. 既存のロールを更新するには、IAM コンソールで、列統計の生成プロセスで使用されている IAM ロールにアクセスします。

1. **[許可を追加]** セクションで、**[ポリシーをアタッチ]** を選択します。新しく開いたブラウザウィンドウで、`AWSGlueServiceRole` AWS マネージドポリシーを選択します。

1. Amazon S3 のデータの場所からデータを読み取るための許可も含める必要があります。

   **[Add permissions]** (アクセス許可の追加) セクションで、**[Create policy]** (ポリシーの作成) を選択します。新しく開いたブラウザウィンドウで、ロールで使用する新しいポリシーを作成します。

1. **[ポリシーを作成]** ページで、**[JSON]** タブを選択します。次の `JSON` コードをポリシーエディタフィールドにコピーします。
**注記**  
次のポリシーでは、アカウント ID を有効な AWS アカウント に置き換え、`region` をテーブルのリージョンに置き換え、`bucket-name` を Amazon S3 バケット名に置き換えます。

------
#### [ JSON ]

****  

   ```
   {
       "Version":"2012-10-17",		 	 	 
       "Statement": [
           {
               "Sid": "S3BucketAccess",
               "Effect": "Allow",
               "Action": [
                   "s3:ListBucket",
                   "s3:GetObject"
               ],
               "Resource": [
               	"arn:aws:s3:::amzn-s3-demo-bucket/*",
   							"arn:aws:s3:::amzn-s3-demo-bucket"
               ]
           }
        ]
   }
   ```

------

1. (オプション) Lake Formation の許可を使用してデータに対するアクセスを提供している場合、IAM ロールには `lakeformation:GetDataAccess` 許可が必要です。

------
#### [ JSON ]

****  

   ```
   {
     "Version":"2012-10-17",		 	 	 
     "Statement": [
       {
         "Sid": "LakeFormationDataAccess",
         "Effect": "Allow",
         "Action": "lakeformation:GetDataAccess",
         "Resource": [
           "*"
         ]
       }
     ]
   }
   ```

------

    Amazon S3 のデータの場所が Lake Formation に登録されており、テーブルに対する `IAM_ALLOWED_PRINCIPALS` グループ許可が、列統計生成タスクによって引き受けられる IAM ロールに付与されていない場合、そのロールには、テーブルに対する Lake Formation `ALTER` および `DESCRIBE` 許可が必要です。Amazon S3 バケットの登録に使用されるロールには、テーブルに対する Lake Formation `INSERT` および `DELETE` 許可が必要です。

   Amazon S3 のデータの場所が Lake Formation に登録されておらず、テーブルに対する `IAM_ALLOWED_PRINCIPALS` グループ許可が IAM ロールに付与されていない場合、そのロールには、テーブルに対する Lake Formation `ALTER`、`DESCRIBE`、`INSERT`、および `DELETE` 許可が必要です。

1. カタログレベルの `Automatic statistics generation` オプションを有効にしている場合、IAM ロールには、デフォルトのデータカタログに対する `glue:UpdateCatalog` アクセス許可または Lake Formation `ALTER CATALOG` アクセス許可が必要になります。カタログのプロパティは、`GetCatalog` オペレーションを使用して確認できます。

1. (オプション) 暗号化された Amazon CloudWatch Logs を書き込む列統計生成タスクには、キーポリシーで次の許可が必要です。

------
#### [ JSON ]

****  

   ```
   {
     "Version":"2012-10-17",		 	 	 
     "Statement": [
       {
         "Sid": "CWLogsKmsPermissions",
         "Effect": "Allow",
         "Action": [
           "logs:CreateLogGroup",
           "logs:CreateLogStream",
           "logs:PutLogEvents",
           "logs:AssociateKmsKey"
         ],
         "Resource": [
           "arn:aws:logs:us-east-1:111122223333:log-group:/aws-glue:*"
         ]
       },
       {
         "Sid": "KmsPermissions",
         "Effect": "Allow",
         "Action": [
           "kms:GenerateDataKey",
           "kms:Decrypt",
           "kms:Encrypt"
         ],
         "Resource": [
           "arn:aws:kms:us-east-1:111122223333:key/arn of key used for ETL cloudwatch encryption"
         ],
         "Condition": {
           "StringEquals": {
             "kms:ViaService": [
               "glue.us-east-1.amazonaws.com"
             ]
           }
         }
       }
     ]
   }
   ```

------

1. 列統計の実行に使用するロールには、そのロールに対する `iam:PassRole` のアクセス許可が必要です。

------
#### [ JSON ]

****  

   ```
   {
     "Version":"2012-10-17",		 	 	 
     "Statement": [
       {
         "Effect": "Allow",
         "Action": [
           "iam:PassRole"
         ],
         "Resource": [
           "arn:aws:iam::111122223333:role/columnstats-role-name"
         ]
       }
     ]
   }
   ```

------

1. 列統計を生成するための IAM ロールを作成する場合、そのロールには、サービスがそのロールを引き受けることを可能にする次の信頼ポリシーも必要です。

------
#### [ JSON ]

****  

   ```
   {
     "Version":"2012-10-17",		 	 	 
     "Statement": [
       {
         "Sid": "TrustPolicy",
         "Effect": "Allow",
         "Principal": {
           "Service": "glue.amazonaws.com"
         },
         "Action": "sts:AssumeRole"
       }
     ]
   }
   ```

------

# 列統計の自動生成
<a name="auto-column-stats-generation"></a>

列統計を自動で生成することにより、AWS Glue Data Catalog の新しいテーブルで、統計をスケジュールして自動的に計算することができます。統計の自動生成を有効にすると、データカタログが、特定のデータ形式 (Parquet、JSON、CSV、XML、ORC、ION、Apache Iceberg など) を持つ新しいテーブルを、それぞれのバケットパスとともに検出します。1 回限りのカタログ設定を使用すると、データカタログがこれらのテーブルの統計を生成します。

 データレイクの管理者は、Lake Formation コンソールでデフォルトのカタログを選択し、`Optimization configuration` オプションを使用してテーブル統計を有効にすることで、統計の生成を設定できます。データカタログで新しいテーブルを作成したり既存のテーブルを更新したりすると、データカタログが Apache Iceberg テーブルの個別値の数 (NDV) と、サポートされている他のファイル形式の NULL、最大長、最小長、平均長など、追加の統計を毎週収集します。

テーブルレベルで統計生成を設定している場合、またはテーブルの統計生成の設定を以前に削除している場合、これらテーブル固有の設定は、列統計の自動生成のデフォルトのカタログ設定より優先されます。

 統計の自動生成タスクは、テーブル内のレコードの 50% を分析して統計を計算します。列統計の自動生成により、データカタログは Amazon Athena や Amazon Redshift Spectrum などのクエリエンジンで使用できるメトリクスを週単位で保守でき、クエリのパフォーマンスを向上させ潜在的なコストを削減することができます。AWS Glue API またはコンソールを使用して統計の生成をスケジュールできるため、手動による介入なしにプロセスを自動的に実行できます。

**Topics**
+ [カタログレベルでの統計の自動生成を有効化](enable-auto-column-stats-generation.md)
+ [自動化されたテーブルレベルの設定を表示](view-auto-column-stats-settings.md)
+ [カタログレベルの列統計の生成の無効化](disable-auto-column-stats-generation.md)

# カタログレベルでの統計の自動生成を有効化
<a name="enable-auto-column-stats-generation"></a>

データカタログのすべての新しい Apache Iceberg テーブルと、OTF 以外のテーブル (Parquet、JSON、CSV、XML、ORC、ION) 形式のテーブルに対して、列統計の自動生成を有効にできます。テーブルを作成すると、列統計の設定を手動で明示的に更新することもできます。

 データカタログの設定を更新してカタログレベルを有効にするには、使用する IAM ロールに、ルートカタログに対する `glue:UpdateCatalog` アクセス許可または AWS Lake Formation `ALTER CATALOG` アクセス許可が必要になります。カタログのプロパティは、`GetCatalog` API を使用して確認できます。

------
#### [ AWS マネジメントコンソール ]

**アカウントレベルで列統計の自動生成を有効にするには**

1. Lake Formation コンソール (‭‬[https://console.aws.amazon.com/lakeformation/](https://console.aws.amazon.com/lakeformation/)‬) を開きます。

1. 左のナビゲーションペインで **[カタログ]** を選択します。

1. **[カタログの概要]** ページの **[最適化の設定]** で **[編集]** を選択します。  
![\[このスクリーンショットは、列統計の生成に使用できるオプションを示しています。\]](http://docs.aws.amazon.com/ja_jp/glue/latest/dg/images/edit-column-stats-auto.png)

1. **[テーブル最適化の設定]** ページで、**[カタログのテーブルの自動統計生成を有効にする]** を選択します。  
![\[このスクリーンショットは、列統計の生成に使用できるオプションを示しています。\]](http://docs.aws.amazon.com/ja_jp/glue/latest/dg/images/edit-optimization-option.jpg)

1. 既存の IAM ロールを選択するか、列統計タスクを実行するための必要なアクセス許可を持つ新しいロールを作成します。

1. **[送信]** を選択します。

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

AWS CLI を使ってカタログレベルの統計収集を有効にすることもできます。AWS CLI を使用してテーブルレベルの統計収集を設定するには、次のコマンドを実行します。

```
aws glue update-catalog --cli-input-json '{
    "name": "123456789012",
    "catalogInput": {
        "description": "Updating root catalog with role arn",
        "catalogProperties": {
            "customProperties": {
                "ColumnStatistics.RoleArn": "arn:aws:iam::"123456789012":role/service-role/AWSGlueServiceRole",
                "ColumnStatistics.Enabled": "true"
            }
        }
    }
}'
```

 上記のコマンドは AWS Glue の `UpdateCatalog` オペレーションを呼び出します。これにより、カタログレベルの統計を生成するために、次のキーと値のペアを持つ `CatalogProperties` 構造が取り込まれます。
+ ColumnStatistics.RoleArn – カタログレベルの統計生成でトリガーされるすべてのタスクで使用する IAM ロール ARN
+ ColumnStatistics.Enabled – カタログレベルの設定が有効か無効かを示すブール値

------

# 自動化されたテーブルレベルの設定を表示
<a name="view-auto-column-stats-settings"></a>

 カタログレベルの統計収集が有効になっている場合、Apache Hive テーブルまたは Apache Iceberg テーブルが、AWS マネジメントコンソール、SDK、AWS Glue クローラー のいずれかで `CreateTable` または `UpdateTable` API を介して作成または更新されるたびに、そのテーブルに対して同等のテーブルレベルの設定が作成されます。

 統計の自動生成が有効になっているテーブルは、次のいずれかのプロパティに従う必要があります。
+ org.apache.hadoop で始まり、`TableType` が `EXTERNAL_TABLE` である `InputSerdeLibrary` を使用する
+ `com.amazon.ion` で始まり、`TableType` が `EXTERNAL_TABLE` である `InputSerdeLibrary` を使用する
+ 自身のパラメータ構造に table\$1type: "ICEBERG" を含める 

 テーブルを作成または更新したら、テーブルの詳細を検証して統計の生成を確定できます。`Statistics generation summary` では、`Schedule` プロパティが `AUTO` に設定され、`Statistics configuration` 値が `Inherited from catalog` を示しています。次の設定を持つテーブル設定は、Glue によって内部で自動的にトリガーされます。

![\[カタログレベルの統計収集を含む Hive テーブルのイメージが適用され、統計が収集されました。\]](http://docs.aws.amazon.com/ja_jp/glue/latest/dg/images/auto-stats-summary.png)


# カタログレベルの列統計の生成の無効化
<a name="disable-auto-column-stats-generation"></a>

 新しいテーブルの列統計の自動生成は、AWS Lake Formation コンソール、`glue:UpdateCatalogSettings` API、`glue:DeleteColumnStatisticsTaskSettings` API のいずれかを使用して無効にすることができます。

**アカウントレベルで列統計の自動生成を無効にするには**

1. Lake Formation コンソール (‭‬[https://console.aws.amazon.com/lakeformation/](https://console.aws.amazon.com/lakeformation/)‬) を開きます。

1. 左のナビゲーションペインで **[カタログ]** を選択します。

1. **[カタログの概要]** ページの **[最適化の設定]** で **[編集]** を選択します。

1. **[テーブル最適化の設定]** ページで、**[カタログのテーブルの自動統計生成を有効にする]** の選択を解除します。

1. [**Submit**] を選択します。

# スケジュールで列統計の生成
<a name="generate-column-stats"></a>

以下の手順に従い、AWS Glue コンソール、AWS CLI、[CreateColumnStatisticsTaskSettings](https://docs.aws.amazon.com/glue/latest/dg/aws-glue-api-crawler-column-statistics.html#aws-glue-api-crawler-column-statistics-CreateColumnStatisticsTaskSettings) オペレーションを使用して、AWS Glue Data Catalog で列統計を生成するスケジュールを設定します。

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

**コンソールを使用して列統計を生成するには**

1. AWS Glue コンソール ([https://console.aws.amazon.com/glue/](https://console.aws.amazon.com/glue/)) にサインインします。

1. データカタログテーブルを選択します。

1. リストからテーブルを選択します。

1. **[テーブル]** ページの下部にある **[列統計]** タブを選択します。

1. **[アクション]** の **[列統計]** で **[スケジュールに応じて生成]** を選択することもできます。

1. **[スケジュールに応じて統計を生成]** ページで、頻度および開始時間を選択して、列統計タスクを実行する定期的なスケジュールを設定します。時間単位、日単位、週単位で頻度を選択するか、cron 式を定義してスケジュールを指定できます。

   cron 式は、スペースで区切られた 6 つのフィールドで構成されるスケジュールパターンを表す文字列で、「\$1 \$1 \$1 \$1 \$1 <minute> <hour> <day of month> <month> <day of week> <year>」のように表示されます。例えば、毎日午前 0 時にタスクを実行する場合、cron 式は「0 0 \$1 \$1 ? \$1」になります。

   詳細については、「[Cron 式](https://docs.aws.amazon.com/glue/latest/dg/monitor-data-warehouse-schedule.html#CronExpressions)」を参照してください。  
![\[このスクリーンショットは、列統計の生成に使用できるオプションを示しています。\]](http://docs.aws.amazon.com/ja_jp/glue/latest/dg/images/generate-column-stats-schedule.png)

1. 次に、列のオプションを選択して統計を生成します。
   + **すべての列** - テーブル内のすべての列の統計を生成するには、このオプションを選択します。
   + **選択された列** – 特定の列の統計を生成するには、このオプションを選択します。ドロップダウンリストから列を選択できます。

1. IAM ロールを選択するか、統計を生成するアクセス許可がある既存のロールを作成します。AWS Glue はこのロールを引き受けて列統計を生成します。

   ユーザーに代わって、AWS Glue コンソールにロールを作成させる手取り早いアプローチがあります。作成されるロールは列統計の生成専用に使用され、`AWSGlueServiceRole` AWS 管理ポリシーに加え、指定されたデータソースに必要なインラインポリシーが含まれています。

   列統計の生成に既存のロールを指定する場合は、そのロールに `AWSGlueServiceRole` ポリシーまたは同等のポリシー (またはこのポリシーのスコープダウンバージョン)、および必要なインラインポリシーが含まれてることを確認します。

1. (オプション) 次に、ログの保管中の暗号化を有効にするセキュリティ設定を選択します。

1. (オプション) テーブルから行の特定の割合のみを指定し、統計を生成することで、サンプルサイズを選択できます。デフォルトは、すべての行です。上矢印と下矢印を使用してパーセント (%) の値を増減します。

   正確な統計を計算するには、テーブル内のすべての行を含めることをお勧めします。近似値が許容される場合にのみ、サンプル行を使用して列統計を生成します。

1. **[統計を生成]** を選択して、列統計の生成タスクを実行します。

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

次の AWS CLI 例を使用して、列統計の生成スケジュールを作成できます。database-name、table-name、role は必須パラメータであり、オプションのパラメータは schedule、column-name-list、catalog-id、sample-size、security-configuration です。

```
aws glue create-column-statistics-task-settings \ 
 --database-name 'database_name' \ 
 --table-name table_name \ 
 --role 'arn:aws:iam::123456789012:role/stats-role' \ 
 --schedule 'cron(0 0-5 14 * * ?)' \ 
 --column-name-list 'col-1' \  
 --catalog-id '123456789012' \ 
 --sample-size '10.0 ' \
 --security-configuration 'test-security'
```

[StartColumnStatisticsTaskRun](https://docs.aws.amazon.com/glue/latest/dg/aws-glue-api-crawler-column-statistics.html#aws-glue-api-crawler-column-statistics-StartColumnStatisticsTaskRun) オペレーションを呼び出して列統計を生成することもできます。

------

# 列統計の生成のスケジュール管理
<a name="manage-column-stats-schedule"></a>

AWS Glue の列統計の生成におけるスケジュールの更新、開始、停止、削除などのスケジューリング操作を管理できます。AWS Glue コンソール、AWS CLI、[AWS Glue 列統計の API 操作](https://docs.aws.amazon.com/glue/latest/dg/aws-glue-api-crawler-column-statistics.html)を使用して、これらのタスクを実行できます。

**Topics**
+ [列統計の生成スケジュールの更新](#update-column-stats-shedule)
+ [列統計の生成スケジュールの停止](#stop-column-stats-schedule)
+ [列統計の生成スケジュールの再開](#resume-column-stats-schedule)
+ [列統計の生成スケジュールの削除](#delete-column-stats-schedule)

## 列統計の生成スケジュールの更新
<a name="update-column-stats-shedule"></a>

作成後に列統計の生成タスクがトリガーされるように、スケジュールを更新できます。AWS Glue コンソールまたは AWS CLI を使用するか、[UpdateColumnStatisticsTaskSettings](https://docs.aws.amazon.com/glue/latest/dg/aws-glue-api-crawler-column-statistics.html#aws-glue-api-crawler-column-statistics-UpdateColumnStatisticsTaskSettings) 操作を実行してテーブルのスケジュールを更新できます。スケジュールタイプ (オンデマンドまたはスケジュールされたもの) やその他のオプションのパラメータなど、既存のスケジュールのパラメータを変更できます。

------
#### [ AWS マネジメントコンソール ]

**列統計の生成タスクの設定を更新する方法**

1. AWS Glue コンソール ([https://console.aws.amazon.com/glue/](https://console.aws.amazon.com/glue/)) にサインインします。

1. テーブルリストで、更新するテーブルを選択します。

1. テーブルの詳細ページの下部セクションで、**[列統計]** を選択します。

1. **[アクション]** で **[編集]** を選択し、スケジュールを更新します。

1. スケジュールに必要な変更を行い、**[保存]** を選択します。

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

 コンソールで AWS Glue の統計生成機能を使用していない場合、`update-column-statistics-task-settings` コマンドを使用してスケジュールを手動で更新できます。次の例は、AWS CLI を使用して列統計を更新する方法を示しています。

```
aws glue update-column-statistics-task-settings \ 
 --database-name 'database_name' \ 
 --table-name 'table_name' \ 
 --role arn:aws:iam::123456789012:role/stats_role \ 
 --schedule 'cron(0 0-5 16 * * ?)' \ 
 --column-name-list 'col-1' \
 --sample-size '20.0' \  
 --catalog-id '123456789012'\
 --security-configuration 'test-security'
```

------

## 列統計の生成スケジュールの停止
<a name="stop-column-stats-schedule"></a>

 増分統計が不要になった場合、スケジュールされた生成を停止してリソースおよびコストを節約できます。スケジュールを一時停止しても、以前に生成された統計は影響されません。必要に応じてスケジュールはいつでも再開できます。

------
#### [ AWS マネジメントコンソール ]

**列統計の生成タスクのスケジュールを停止する方法**

1. AWS Glue コンソールで、[データカタログ] の下の **[テーブル]** を選択します。

1. 列統計を含むテーブルを選択します。

1. **[テーブルの詳細]** ページで、**[列統計]** を選択します。

1. **[アクション]** で、**[スケジュールされた生成]** および **[一時停止]** を選択します。

1. **[一時停止]** を選択して確認します。

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

AWS CLI を使用して列統計タスクの実行スケジュールを停止するには、次のコマンドを使用できます。

```
aws glue stop-column-statistics-task-run-schedule \
 --database-name ''database_name' \
 --table-name 'table_name'
```

`database_name` および `table_name` は、列統計のタスク実行スケジュールを停止するデータベースおよびテーブルの実際の名前に置き換えます。

------

## 列統計の生成スケジュールの再開
<a name="resume-column-stats-schedule"></a>

 統計の生成スケジュールを一時停止した場合、AWS Glue は必要に応じてスケジュールを再開できるようにします。AWS Glue コンソール、AWS CLI、[StartColumnStatisticsTaskRunSchedule](https://docs.aws.amazon.com/glue/latest/dg/aws-glue-api-crawler-column-statistics.html#aws-glue-api-crawler-column-statistics-StartColumnStatisticsTaskRunSchedule) 操作を使用してスケジュールを再開できます。

------
#### [ AWS マネジメントコンソール ]

**列統計の生成スケジュールを再開する方法**

1. AWS Glue コンソールで、[データカタログ] の下の **[テーブル]** を選択します。

1. 列統計を含むテーブルを選択します。

1. **[テーブルの詳細]** ページで、**[列統計]** を選択します。

1. **[アクション]** で **[スケジュールされた生成]** を選択し、**[再開]** を選択します。

1. **[再開]** を選択して確認します。

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

`database_name` および `table_name` は、列統計のタスク実行スケジュールを停止するデータベースおよびテーブルの実際の名前に置き換えます。

```
aws glue start-column-statistics-task-run-schedule \
 --database-name 'database_name' \
 --table-name 'table_name'
```

------

## 列統計の生成スケジュールの削除
<a name="delete-column-stats-schedule"></a>

 最適なクエリパフォーマンスを得るために最新の統計を維持することが一般的に推奨されますが、自動生成スケジュールを削除すると、有益になる特定のユースケースがあります。
+ データが比較的に静的な状態が維持される場合、既存の列統計が長期間にわたって正確さが維持される可能性があり、頻繁な更新の必要性が軽減されます。スケジュールを削除すると、変更されていないデータに関する統計の再生成に関連する、不要なリソース消費およびオーバーヘッドを防ぐことができます。
+ 統計の生成より手動の制御が望ましい場合。自動スケジュールを削除することで、特定の間隔または大幅なデータ変更後に、管理者は列統計を選択的に更新し、メンテナンス戦略およびリソース割り当てのニーズに合わせてプロセスを調整することができます。

------
#### [ AWS マネジメントコンソール ]

**列統計の生成のスケジュールを削除するには:**

1. AWS Glue コンソールで、[データカタログ] の下の **[テーブル]** を選択します。

1. 列統計を含むテーブルを選択します。

1. **[テーブルの詳細]** ページで、**[列統計]** を選択します。

1. **[アクション]** で、**[スケジュールされた生成]** と **[削除]** を選択します。

1. **[削除]** を選択して確定します。

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

`database_name` および `table_name` は、列統計のタスク実行スケジュールを停止するデータベースおよびテーブルの実際の名前に置き換えます。

[DeleteColumnStatisticsTaskSettings](https://docs.aws.amazon.com/glue/latest/dg/aws-glue-api-crawler-column-statistics.html#aws-glue-api-crawler-column-statistics-DeleteColumnStatisticsTaskSettings) の API オペレーションまたは AWS CLI を使用して、列統計のスケジュールを削除できます。次の例では、AWS Command Line Interface (AWS CLI) を使用して列統計を生成するスケジュールを削除する方法について示されています。

```
aws glue delete-column-statistics-task-settings \
    --database-name 'database_name' \
    --table-name 'table_name'
```

------

# オンデマンドでの列統計の生成
<a name="column-stats-on-demand"></a>

スケジュールを設定せず、AWS Glue Data Catalog テーブルタスクの列統計タスクをオンデマンドで実行できます。アドホック分析や統計をすぐに計算する必要がある場合、このオプションは便利です。

AWS Glue コンソールまたは AWS CLI を使用し、データカタログのテーブルに列統計をオンデマンドで生成するには、以下の手順を実行してください。

------
#### [ AWS マネジメントコンソール ]

**コンソールを使用して列統計を生成するには**

1. AWS Glue コンソール ([https://console.aws.amazon.com/glue/](https://console.aws.amazon.com/glue/)) にサインインします。

1. データカタログテーブルを選択します。

1.  リストからテーブルを選択します。

1. **[アクション]** メニューで **[統計を生成]** を選択します。

   **[テーブル]** ページの下部セクションにある **[列統計]** タブの **[生成]** または **[オンデマンドで生成]** オプションを選択することもできます。

1. [スケジュールで列統計の生成](generate-column-stats.md) のステップ 7～11 に従ってテーブルの列統計を生成します。

1. **[統計を生成]** ページで、次のオプションを指定します。  
![\[このスクリーンショットは、列統計の生成に使用できるオプションを示しています。\]](http://docs.aws.amazon.com/ja_jp/glue/latest/dg/images/generate-column-stats.png)
   + **すべての列** - テーブル内のすべての列の統計を生成するには、このオプションを選択します。
   + **選択された列** – 特定の列の統計を生成するには、このオプションを選択します。ドロップダウンリストから列を選択できます。
   + **IAM ロール** – 列統計の生成タスクを実行するために必要なアクセス許可ポリシーを持つ **[新しい IAM ロールを作成]** を選択します。[アクセス許可の詳細を表示] を選択して、ポリシーステートメントを確認します。リストから IAM ロールを選択することもできます。必要な許可の詳細については、「[列統計を生成するための前提条件](column-stats-prereqs.md)」を参照してください。

     AWS Glue は、統計を生成するために指定したロールのアクセス許可を引き受けます。

     AWS Glue へのロール提供の詳細については、「[AWS Glue のアイデンティティベースポリシー」を参照してください。](https://docs.aws.amazon.com/glue/latest/dg/security_iam_service-with-iam.html#security_iam_service-with-iam-id-based-policies)
   + (オプション) 次に、ログの保管中の暗号化を有効にするセキュリティ設定を選択します。
   + **サンプル行** – テーブルから特定の割合の行のみを選択して統計を生成します。デフォルトは、すべての行です。上矢印と下矢印を使用してパーセント (%) の値を増減します。
**注記**  
正確な統計を計算するには、テーブル内のすべての行を含めることをお勧めします。近似値が許容される場合にのみ、サンプル行を使用して列統計を生成します。

   **[統計を生成]** を選択してタスクを実行します。

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

このコマンドにより、指定されたテーブルに対して列統計タスクの実行がトリガーされます。データベース名、テーブル名、統計を生成するアクセス許可がある IAM ロールを指定する必要があり、必要に応じて統計の計算用に列名およびサンプルサイズの割合を指定します。

```
aws glue start-column-statistics-task-run \ 
    --database-name 'database_name \ 
    --table-name 'table_name' \ 
    --role 'arn:aws:iam::123456789012:role/stats-role' \
    --column-name 'col1','col2'  \
    --sample-size 10.0
```

このコマンドにより、指定されたテーブルの列統計を生成するタスクが開始されます。

------

## オンデマンドで列統計の更新
<a name="update-column-stats-on-demand"></a>

 列統計を最新に維持することは、クエリオプティマイザーが効率的な実行計画を生成し、クエリパフォーマンスの向上、リソース消費量の削減、システム全体のパフォーマンス向上を実現するうえで不可欠です。既存の統計が古くなる可能性をもたらす大幅なデータ変更 (一括のロードや広範な変更など) の後に、このプロセスは特に重要です。

列の統計を更新するには、AWS Glue コンソールから **[統計を生成]** タスクを明示的に実行する必要があります。データカタログは統計を自動的に更新しません。

コンソールで AWS Glue の統計生成機能を使用していない場合は、[UpdateColumnStatisticsForTable](https://docs.aws.amazon.com/glue/latest/webapi/API_UpdateColumnStatisticsForTable.html) API オペレーションまたは AWS CLI を使用して列統計を手動で更新できます。次の例は、AWS CLI を使用して列統計を更新する方法を示しています。

```
aws glue update-column-statistics-for-table --cli-input-json:

{
    "CatalogId": "111122223333",
    "DatabaseName": "database_name",
    "TableName": "table_name",
    "ColumnStatisticsList": [
        {
            "ColumnName": "col1",
            "ColumnType": "Boolean",
            "AnalyzedTime": "1970-01-01T00:00:00",
            "StatisticsData": {
                "Type": "BOOLEAN",
                "BooleanColumnStatisticsData": {
                    "NumberOfTrues": 5,
                    "NumberOfFalses": 5,
                    "NumberOfNulls": 0
                }
            }
        }
    ]
}
```

# 列統計の表示
<a name="view-column-stats"></a>

統計が正常に生成されると、データカタログは、Amazon Athena と Amazon Redshift のコストベースのオプティマイザーがクエリを実行する際に最適な選択を行うことができるように、この情報を保存します。統計は列のタイプによって異なります。

------
#### [ AWS マネジメントコンソール ]

**テーブルの列統計を表示するには**
+ 列統計タスクを実行すると、**[テーブルの詳細]** ページの **[列統計]** タブにテーブルの統計が表示されます。  
![\[スクリーンショットは、最新の実行から生成された列を示しています。\]](http://docs.aws.amazon.com/ja_jp/glue/latest/dg/images/view-column-stats.png)

  次の統計を使用できます。
  + [列名]: 統計を生成するために使用される列名
  + [最終更新日時]: 統計が生成された日時
  + [平均長]: 列内の値の平均長
  + [個別の値]: 列内の個別の値の合計数。列内の個別の値の数を 5% の相対誤差で推定します。
  + [最大値]: 列内の最大値。
  + [最小値]: 列内の最小値。
  + [最大長]: 列内の最大値の長さ。
  + [Null 値]: 列内の null 値の合計数。
  + [True 値]: 列内の true 値の合計数。
  + [False 値]: 列内の false 値の合計数。
  + [numFiles]: テーブル内のファイルの合計数。この値は、**[詳細プロパティ]** タブで使用できます。

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

次の例は、AWS CLI を使用して列統計を取得する方法を示しています。

```
aws glue get-column-statistics-for-table \
    --database-name database_name \
    --table-name table_name \
    --column-names <column_name>
```

 [GetColumnStatisticsForTable](https://docs.aws.amazon.com/glue/latest/webapi/API_GetColumnStatisticsForTable.html) API オペレーションを使用して列統計を表示することもできます。

------

# 列統計タスクの実行の表示
<a name="view-stats-run"></a>

列統計タスクを実行した後、AWS Glue コンソール、AWS CLI、または [GetColumnStatisticsTaskRuns](https://docs.aws.amazon.com/glue/latest/dg/aws-glue-api-crawler-column-statistics.html#aws-glue-api-crawler-column-statistics-GetColumnStatisticsTaskRun) オペレーションを使用して、テーブルのタスク実行の詳細を調査できます。

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

**列統計タスクの実行の詳細を表示するには**

1. AWS Glue コンソールで、[データカタログ] の下の **[テーブル]** を選択します。

1. 列統計を含むテーブルを選択します。

1. **[テーブルの詳細]** ページで、**[列統計]** を選択します。

1. **[実行を表示]** を選択します。

   指定されたテーブルに関連付けられたすべての実行に関する情報を確認できます。  
![\[スクリーンショットは、列統計の生成に使用できるオプションを示しています。\]](http://docs.aws.amazon.com/ja_jp/glue/latest/dg/images/view-column-stats-task-runs.png)

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

次の例では、`DatabaseName` と `TableName` の値を、実際のデータベースとテーブルの名前に置き換えます。

```
aws glue get-column-statistics-task-runs --input-cli-json file://input.json
{
    "DatabaseName": "database_name",
    "TableName": "table_name"
}
```

------

# 列統計タスクの実行の停止
<a name="stop-stats-run"></a>

テーブルについての列統計タスクの実行は、AWS Glue コンソール、AWS CLI、または [StopColumnStatisticsTaskRun](https://docs.aws.amazon.com/glue/latest/dg/aws-glue-api-crawler-column-statistics.html#aws-glue-api-crawler-column-statistics-StopColumnStatisticsTaskRun) オペレーションを使用して停止できます。

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

**列統計タスクの実行を停止するには**

1. AWS Glue コンソールで、[データカタログ] の下の **[テーブル]** を選択します。

1. 列統計タスクの実行が進行中のテーブルを選択します。

1. **[テーブルの詳細]** ページで、**[列統計]** を選択します。

1. **[停止]** を選択します。

   実行が完了する前にタスクを停止すると、テーブルの列統計は生成されません。

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

次の例では、`DatabaseName` と `TableName` の値を、実際のデータベースとテーブルの名前に置き換えます。

```
aws glue stop-column-statistics-task-run --input-cli-json file://input.json
{
    "DatabaseName": "database_name",
    "TableName": "table_name"
}
```

------

# 列統計の削除
<a name="delete-column-stats"></a>

[DeleteColumnStatisticsForTable](https://docs.aws.amazon.com/glue/latest/webapi/API_DeleteColumnStatisticsForTable.html) API オペレーションまたは AWS CLI を使用して、列統計を削除できます。次の例は、AWS Command Line Interface (AWS CLI) を使用して列統計を削除する方法を示しています。

```
aws glue delete-column-statistics-for-table \
    --database-name 'database_name' \
    --table-name 'table_name' \
    --column-name 'column_name'
```

# 考慮事項と制限事項
<a name="column-stats-notes"></a>

列統計の生成には、次の考慮事項と制限事項が適用されます。

**考慮事項**
+ サンプリングを使用して統計を生成すると、実行時間は短縮されますが、不正確な統計が生成される可能性があります。
+ データカタログは、異なるバージョンの統計を保存しません。
+ テーブルごとに一度に 1 つの統計生成タスクのみを実行できます。
+ データカタログに登録されているカスタマー AWS KMS キーを使用してテーブルが暗号化されている場合、AWS Glue は同じキーを使用して統計を暗号化します。

**列統計タスクは、次の場合に統計の生成をサポートします。**
+ 完全なテーブル許可が IAM ロールに付与されている場合 (IAM または Lake Formation)。
+ Lake Formation ハイブリッドアクセスモードを使用するテーブルに対する許可が IAM ロールに付与されている場合。

**列統計タスクは、次についての統計の生成をサポートしていません。**
+ Lake Formation のセルベースのアクセスコントロールを備えたテーブル
+ トランザクションのデータレイク – Linux Foundation Delta Lake、Apache Hudi
+ フェデレーテッドデータベース内のテーブル - Hive メタストア、Amazon Redshift データ共有
+ ネストされた列、配列、および構造体のデータ型。
+ 別のアカウントからユーザーと共有されるテーブル

# Data Catalog の暗号化
<a name="catalog-encryption"></a>

 AWS Key Management Service (AWS KMS) によって管理される暗号化キーを使用して、保管中の AWS Glue Data Catalog に保存されているメタデータを保護できます。**データカタログ設定**を使用して、新しいデータカタログのデータカタログ暗号化を有効にできます。必要に応じて、既存のデータカタログの暗号化を有効または無効にできます。有効にすると、AWS Glue はカタログに書き込まれたすべての新しいメタデータを暗号化しますが、既存のメタデータは暗号化されません。

データカタログの暗号化の詳細については、「[Data Catalog の暗号化](encrypt-glue-data-catalog.md)」を参照してください。

# Lake Formation を使用したデータカタログの保護
<a name="secure-catalog"></a>

 AWS Lake Formation は、AWS で簡単にセキュアなデータレイクを構築できるサービスです。きめ細かなアクセスコントロール許可を定義することで、データレイクを作成および安全に管理するための一元的な場所を提供します。Lake Formation は、データカタログを使用して、テーブル定義、スキーマ情報、データアクセスコントロール設定など、データレイクに関するメタデータを保存および取得します。

メタデータテーブルまたはデータベースの Amazon S3 データロケーションを Lake Formation に登録し、それを使用してデータカタログリソースに対するメタデータレベルのアクセス許可を定義できます。また、Lake Formation を使用して、統合された分析エンジンに代わって、Amazon S3 に保存されている基盤となるデータへのストレージアクセス許可も管理できます。

詳細については、「[AWS Lake Formation とは](lake-formation/latest/dg/what-is-lake-formation.html)」を参照してください。

# AWS Glue での AWS Glue Data Catalog ビューの使用
<a name="catalog-views"></a>

 AWS Glue Data Catalog ではビューを作成および管理できます。これは一般的に AWS Glue Data Catalog ビューと呼ばれます。これらのビューは複数の SQL クエリエンジンをサポートしているため、Amazon Athena、Amazon Redshift、AWS Glue などのさまざまな AWS サービス間で同じビューにアクセスできるため便利です。Apache Iceberg、Apache Hudi、Delta Lake に基づくビューを使用できます。

 データカタログでビューを作成することで、AWS Lake Formation でのリソース許可とタグベースのアクセスコントロールを使用して、データカタログビューへのアクセスを許可できます。このアクセスコントロール方法を使用すれば、ビューの作成時に参照したテーブルへの追加のアクセスを設定する必要はありません。アクセス許可を付与するこの方法は、definer セマンティクスと呼ばれ、これらのビューは definer ビューと呼ばれます。AWS Lake Formation でのアクセスコントロールの詳細は、「AWS Lake Formation デベロッパーガイド」の「[Granting and revoking permissions on Data Catalog resources](https://docs.aws.amazon.com/lake-formation/latest/dg/granting-catalog-permissions.html)」を参照してください。

 データカタログビューは、次のユースケースに役立ちます。
+  **細やかなアクセス制御** – ユーザーが必要とするアクセス許可に基づいてデータアクセスを制限するビューを作成できます。例えば、データカタログのビューを使用して、人事 (HR) 部門に属さない従業員が個人を特定できる情報 (PII) を表示できないようにすることができます。
+  **完全なビュー定義** – データカタログのビューに特定のフィルターを適用することで、ビュー内のデータレコードを常に完全な状態にすることができます。
+  **セキュリティの強化** – ビューの作成に使用するクエリ定義は完全である必要があります。これにより、データカタログのビューが有害なアクターによる SQL コマンドの影響を受けにくくなります。
+  **シンプルなデータ共有** – AWS Lake Formation でのアカウント間データ共有により、データを移動せずに他の AWS アカウントとデータを共有することができます。

## データカタログビューの作成
<a name="catalog-creating-view"></a>

 Spark SQL による AWS CLI および AWS Glue ETL スクリプトを使用して、データカタログビューを作成できます。データカタログビューを作成するための構文には、ビュータイプを `MULTI DIALECT` に、`SECURITY` 述語を `DEFINER` に指定して定義者ビューを示すことが含まれます。

 データカタログビューを作成する SQL ステートメントの例: 

```
CREATE PROTECTED MULTI DIALECT VIEW database_name.catalog_view SECURITY DEFINER
AS SELECT order_date, sum(totalprice) AS price
FROM source_table
GROUP BY order_date;
```

 データカタログビューを作成したら、当該ビューに対する AWS Lake Formation SELECT アクセス許可を持つ IAM ロールを使用して、Amazon Athena、Amazon Redshift、または AWS Glue ETL ジョブなどのサービスからクエリを実行できます。ビューで参照される基盤となるテーブルへのアクセスを許可する必要はありません。

 データカタログビューの作成と設定の詳細については、「AWS Lake Formation デベロッパーガイド」の「[Building AWS Glue Data Catalog views](https://docs.aws.amazon.com/lake-formation/latest/dg/working-with-views.html)」を参照してください。

## サポートされているビュー操作
<a name="catalog-supported-view-operations"></a>

 以下のコマンドフラグメントは、データカタログビューを操作するさまざまな方法を示します。

 **CREATE VIEW** 

 データカタログビューを作成します。以下は、既存のテーブルからビューを作成する例です。

```
CREATE PROTECTED MULTI DIALECT VIEW catalog_view 
SECURITY DEFINER AS SELECT * FROM my_catalog.my_database.source_table
```

 **ALTER VIEW** 

 使用可能な構文: 

```
ALTER VIEW view_name [FORCE] ADD DIALECT AS query
ALTER VIEW view_name [FORCE] UPDATE DIALECT AS query
ALTER VIEW view_name DROP DIALECT
```

 `FORCE ADD DIALECT` オプションを使用して、新しいエンジンダイアレクトに従ってスキーマとサブオブジェクトを強制的に更新できます。ただし、これを行うと、他のエンジンダイアレクトの更新にも `FORCE` を使用しないと、クエリエラーが発生する可能性があることに注意してください。サンプルを以下に示します。

```
ALTER VIEW catalog_view FORCE ADD DIALECTAS
SELECT order_date, sum(totalprice) AS priceFROM source_tableGROUP BY orderdate;
```

 以下は、ダイアレクトを更新するためにビューを変更する方法を示します。

```
ALTER VIEW catalog_view UPDATE DIALECT AS
SELECT count(*) FROM my_catalog.my_database.source_table;
```

 **DESCRIBE VIEW** 

 ビューを記述するために使用できる構文: 

 `SHOW COLUMNS {FROM|IN} view_name [{FROM|IN} database_name]` – ユーザーがビューの記述に必要な AWS Glue および AWS Lake Formation のアクセス許可を持っている場合、列を一覧表示できます。列を表示するためのいくつかのサンプルコマンドを以下に示します。

```
SHOW COLUMNS FROM my_database.source_table;    
SHOW COLUMNS IN my_database.source_table;
```

 `DESCRIBE view_name` – ユーザーがビューの記述に必要な AWS Glue および AWS Lake Formation のアクセス許可を持っている場合、列およびメタデータをビュー内で一覧表示できます。

 **DROP VIEW** 

 使用可能な構文: 

```
DROP VIEW [ IF EXISTS ] view_name
```

 次のサンプルは、ビューを削除する前にビューが存在するかどうかをテストする `DROP` ステートメントを示します。

```
DROP VIEW IF EXISTS catalog_view;
```

 `SHOW CREATE VIEW view_name` – 指定したビューを作成する SQL ステートメントを示します。以下は、データカタログビューの作成を示すサンプルです。

```
SHOW CREATE TABLE my_database.catalog_view;CREATE PROTECTED MULTI DIALECT VIEW my_catalog.my_database.catalog_view (
  net_profit,
  customer_id,
  item_id,
  sold_date)
TBLPROPERTIES (
  'transient_lastDdlTime' = '1736267222')
SECURITY DEFINER AS SELECT * FROM
my_database.store_sales_partitioned_lf WHERE customer_id IN (SELECT customer_id from source_table limit 10)
```

 **SHOW VIEWS** 

 通常のビュー、マルチダイアレクトビュー (MDV)、Spark ダイアレクトのない MDV など、カタログ内のすべてのビューを一覧表示します。使用可能な構文は次のとおりです。

```
SHOW VIEWS [{ FROM | IN } database_name] [LIKE regex_pattern]:
```

 ビューを表示するサンプルコマンドを以下に示します。

```
SHOW VIEWS IN marketing_analytics LIKE 'catalog_view*';
```

 データカタログビューの作成と設定の詳細については、「AWS Lake Formation デベロッパーガイド」の「[Building AWS Glue Data Catalog views](https://docs.aws.amazon.com/lake-formation/latest/dg/working-with-views.html)」を参照してください。

## データカタログビューをクエリする
<a name="catalog-view-query"></a>

 データカタログビューの作成後は、ビューをクエリできるようになります。AWS Glue ジョブで設定された IAM ロールには、データカタログビューに対する Lake Formation **SELECT** アクセス許可が必要です。ビューで参照される基盤となるテーブルへのアクセスを許可する必要はありません。

 すべてをセットアップしたら、ビューをクエリできます。たとえば、次のクエリを実行してビューにアクセスできます。

```
SELECT * from my_database.catalog_view LIMIT 10;
```

## 制限
<a name="catalog-view-limitations"></a>

 データカタログビューを使用する場合は、次の制限を考慮してください。
+  AWS Glue 5.0 以上では、データカタログビューのみを作成できます。
+  Data Catalog ビュー定義者は、ビューによってアクセスされる基盤となるベーステーブルに対する `SELECT` アクセスを持っている必要があります。特定のベーステーブルに定義者ロールに対する Lake Formation フィルターが適用されている場合、データカタログビューの作成は失敗します。
+  ベーステーブルには AWS Lake Formation 内の `IAMAllowedPrincipals` データレイクのアクセス許可を付与してはいけません。付与されている場合は、**Multi Dialect views may only reference tables without IAMAllowedPrincipals permissions** というエラーが表示されます。
+  テーブルの Amazon S3 の場所は、AWS Lake Formation データレイクの場所として登録する必要があります。テーブルが登録されていない場合、エラー `Multi Dialect views may only reference AWS Lake Formation managed tables` が発生します。AWS Lake Formation で Amazon S3 の場所を登録する方法については、「AWS Lake Formation デベロッパーガイド」の「[Registering an Amazon S3 location](https://docs.aws.amazon.com/lake-formation/latest/dg/register-data-lake.html)」を参照してください。
+  `PROTECTED` データカタログビューのみを作成できます。`UNPROTECTED` ビューはサポートされていません。
+  データカタログビュー定義では別の AWS アカウント内のテーブルを参照することはできません。また、別のリージョンにあるのと同じアカウントのテーブルを参照することはできません。
+  アカウントまたはリージョン間でデータを共有するには、AWS Lake Formation リソースリンクを使用してビュー全体をクロスアカウントおよびクロスリージョンで共有する必要があります。
+  ユーザー定義関数 (UDF) はサポートされていません。
+  データカタログビューで他のビューを参照できません。