

翻訳は機械翻訳により提供されています。提供された翻訳内容と英語版の間で齟齬、不一致または矛盾がある場合、英語版が優先します。

# Glue データカタログビューの使用
<a name="SECTION-jobs-glue-data-catalog-views"></a>

EMR Serverless で使用する AWS Glue データカタログでビューを作成および管理できます。これらは一般的に AWS Glue データカタログビューと呼ばれます。これらのビューは複数の SQL クエリエンジンをサポートしているため、EMR Serverless、 Amazon Athena Amazon Redshift などのさまざまな AWS サービスで同じビューにアクセスできます。

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

データカタログビューは、次のユースケースに役立ちます。
+ **細やかなアクセス制御** – ユーザーが必要とするアクセス許可に基づいてデータアクセスを制限するビューを作成できます。例えば、データカタログのビューを使用して、人事 (HR) 部門に属さない従業員が個人を特定できる情報 (PII) を表示できないようにすることができます。
+ **完全なビュー定義** – データカタログのビューにフィルターを適用することで、データカタログビューで利用可能なデータレコードを常に完全な状態にすることができます。
+ **セキュリティの強化** – ビューの作成に使用されるクエリ定義は完全である必要があります。このメリットにより、データカタログのビューは悪意のあるアクターからの SQL コマンドの影響を受けにくくなります。
+ **データを簡単に共有** – データを移動することなく、他の AWS アカウントとデータを共有します。詳細については、「[Cross-account data sharing in Lake Formation](https://docs.aws.amazon.com/lake-formation/latest/dg/cross-account-permissions.html)」を参照してください。

## データカタログビューの作成
<a name="SECTION-jobs-glue-data-catalog-views-create"></a>

Data Catalog ビューを作成するには、さまざまな方法があります。これには、 AWS CLI または Spark SQL の使用が含まれます。以下にいくつかの例を示します。

------
#### [ Using SQL ]

以下は、データカタログビューを作成するための構文を示しています。`MULTI DIALECT` ビュータイプを書き留めます。これにより、Data Catalog ビューと他のビューが区別されます。`SECURITY` 述語は `DEFINER` として指定されます。これは、`DEFINER` セマンティクスを含む Data Catalog ビューを示します。

```
CREATE [ OR REPLACE ] PROTECTED MULTI DIALECT VIEW [IF NOT EXISTS] view_name
[(column_name [COMMENT column_comment], ...) ]
[ COMMENT view_comment ]
[TBLPROPERTIES (property_name = property_value, ... )]
SECURITY DEFINER
AS query;
```

以下は、構文に従った `CREATE` ステートメントの例です:

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

実際にリソースを作成することなく、SQL を使用してドライランモードでビューを作成し、ビューの作成をテストすることもできます。このオプションを使用すると、入力を検証する「ドライラン」になり、検証が成功すると、ビューを表す AWS Glue テーブルオブジェクトの JSON が返されます。この場合、実際のビューは作成されません。

```
CREATE [ OR REPLACE ] PROTECTED MULTI DIALECT VIEW view_name
SECURITY DEFINER 
[ SHOW VIEW JSON ]
AS view-sql
```

------
#### [ Using the AWS CLI ]

**注記**  
CLI コマンドを使用する場合、ビューの作成に使用される SQL は解析されません。これにより、ビューは作成されますが、クエリは成功しません。ビューを作成する前に、必ず SQL 構文をテストしてください。

以下の CLI コマンドを使用して、ビューをを作成します:

```
aws glue create-table --cli-input-json '{
  "DatabaseName": "database",
  "TableInput": {
    "Name": "view",
    "StorageDescriptor": {
      "Columns": [
        {
          "Name": "col1",
          "Type": "data-type"
        },
        ...
        {
          "Name": "col_n",
          "Type": "data-type"
        }
      ],
      "SerdeInfo": {}
    },
    "ViewDefinition": {
      "SubObjects": [
        "arn:aws:glue:aws-region:aws-account-id:table/database/referenced-table1",
        ...
        "arn:aws:glue:aws-region:aws-account-id:table/database/referenced-tableN",
       ],
      "IsProtected": true,
      "Representations": [
        {
          "Dialect": "SPARK",
          "DialectVersion": "1.0",
          "ViewOriginalText": "Spark-SQL",
          "ViewExpandedText": "Spark-SQL"
        }
      ]
    }
  }
}'
```

------

## サポートされているビュー操作
<a name="SECTION-jobs-glue-data-catalog-views-supported-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 DIALECT
  AS
  SELECT order_date, sum(totalprice) AS price
  FROM source_table
  GROUP 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 および Lake Formation アクセス許可がある場合は、列を一覧表示できます。列を表示するためのいくつかのコマンドの例を以下に示します:

    ```
    SHOW COLUMNS FROM my_database.source_table;    
    SHOW COLUMNS IN my_database.source_table;
    ```
  + `DESCRIBE view_name` – ユーザーにビューを記述するために必要な AWS Glue および 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 デベロッパーガイド[AWS の「 Glue データカタログビューの構築](https://docs.aws.amazon.com/lake-formation/latest/dg/working-with-views.html)」を参照してください。

## データカタログビューをクエリする
<a name="SECTION-jobs-glue-data-catalog-views-querying"></a>

 データカタログビューを作成したら、 AWS Lake Formation きめ細かなアクセスコントロールが有効になっている Amazon EMR Serverless Spark ジョブを使用してクエリを実行できます。ジョブランタイムロールには、データカタログビューに対する Lake Formation `SELECT` アクセス許可が必要です。ビューで参照される基盤となるテーブルへのアクセスを許可する必要はありません。

すべてをセットアップしたら、ビューをクエリできます。例えば、EMR Studio で EMR Serverless アプリケーションを作成した後、以下のクエリを実行してビューにアクセスします。

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

便利な関数は `invoker_principal` です。EMRS ジョブランタイムロールの一意の識別子を返します。これは、呼び出しプリンシパルに基づいてビュー出力を制御するために使用できます。これを使用して、呼び出しロールに基づいてクエリ結果を絞り込む条件をビューに追加できます。この関数を使用するには、ジョブランタイムロールに `LakeFormation:GetDataLakePrincipal` IAM アクションに対するアクセス許可が必要です。

```
select invoker_principal();
```

例えば、この関数を `WHERE` 句に追加して、クエリ結果を絞り込むことができます。

## 考慮事項と制限事項
<a name="SECTION-jobs-glue-data-catalog-views-considerations"></a>

Data Catalog ビューを作成することにより、以下が適用されます:
+ Amazon EMR 7.6 以上では、Data Catalog ビューのみを作成できます。
+ Data Catalog ビュー定義者は、ビューによってアクセスされる基盤となるベーステーブルに対する `SELECT` アクセスを持っている必要があります。特定のベーステーブルに定義者ロールに対する Lake Formation フィルターが適用されている場合、Data Catalog ビューの作成は失敗します。
+ Lake Formation のベーステーブルには `IAMAllowedPrincipals` データレイクのアクセス許可を付与してはいけません。付与されている場合は、*Multi Dialect views may only reference tables without IAMAllowedPrincipals permissions* というエラーが表示されます。
+ テーブルの Amazon S3 の場所は、Lake Formation データレイクの場所として登録する必要があります。テーブルがこのように登録されていない場合、*Multi Dialect views may only reference Lake Formation managed tables* というエラーが表示されます。Lake Formation で Amazon S3 ロケーションを登録する方法については、「 AWS Lake Formation デベロッパーガイド」の[Amazon S3ロケーションの登録](https://docs.aws.amazon.com/lake-formation/latest/dg/register-location.html)」を参照してください。
+ `PROTECTED` データカタログビューのみを作成できます。`UNPROTECTED` ビューはサポートされていません。
+ データカタログビュー定義の別の AWS アカウントのテーブルを参照することはできません。また、別のリージョンにあるのと同じアカウントのテーブルを参照することはできません。
+ アカウントまたはリージョン間でデータを共有するには、Lake Formation リソースリンクを使用してビュー全体をクロスアカウントおよびクロスリージョンで共有する必要があります。
+ ユーザー定義関数 (UDF) はサポートされていません。
+ Iceberg テーブルに基づくビューを使用できます。オープンテーブル形式の Apache Hudi と Delta Lake もサポートされています。
+ データカタログビューで他のビューを参照できません。
+  AWS Glue データカタログビュースキーマは常に小文字を使用して保存されます。例えば、DDL ステートメントを使用して `Castle` という名前の列のある Glue データカタログビューを作成する場合、Glue Data Catalog に作成される列は小文字で `castle` になります。次に、DML クエリで列名を `Castle` または `CASTLE` として指定することにより、EMR Spark はその名前を小文字にしてクエリを実行します。ただし、列見出しは、クエリで指定した大文字と小文字を使用して表示されます。

  DML クエリで指定された列名が Glue データカタログの列名と一致しない場合にクエリを失敗させるには、`spark.sql.caseSensitive=true` を設定します。