

# AWS Glue Data Catalog を使用してデータに接続する
<a name="data-sources-glue"></a>

Athena は、Amazon S3 に保存されているデータのテーブルおよび列の名前などのメタデータを保存するために AWS Glue Data Catalog を使用します。このメタデータ情報は、Athena クエリエディタに表示されるデータベース、テーブル、ビューになります。

Athena で AWS Glue Data Catalog を使用するときは、AWS Glue を使用して Athena でクエリされるデータベースとテーブル (スキーマ) を作成するか、Athena を使用してスキーマを作成してから AWS Glue や関連サービスでそれらを使用することができます。

AWS Glue のスキーマ情報を定義するには、Athena コンソールでフォームを使用するか、Athena でクエリエディタを使用するか、または AWS Glue コンソールで AWS Glue クローラーを作成します。AWS Glue クローラーは、Amazon S3 のデータからデータベースとテーブルスキーマを自動的に推論します。フォームを使用すると、よりカスタマイズできます。独自の `CREATE TABLE` ステートメントを記述するには、より多くの労力が必要ですが、最も強力なコントロールが得られます。詳細については、「[CREATE TABLE](create-table.md)」を参照してください。

## その他のリソース
<a name="glue-additional-resources"></a>
+ AWS Glue Data Catalog に関する詳細については、「*AWS Glue デベロッパーガイド*」の「[AWS Glue のデータカタログおよびクローラー](https://docs.aws.amazon.com/glue/latest/dg/catalog-and-crawler.html)」を参照してください。
+ AWS Glue と Athena を使用して XML データを処理する方法については、「AWS Big Data Blog」の記事「[Process and analyze highly nested and large XML files using AWS Glue and Amazon Athena](https://aws.amazon.com/blogs/big-data/process-and-analyze-highly-nested-and-large-xml-files-using-aws-glue-and-amazon-athena/)」を参照してください。
+ AWS Glue には別料金が適用されます。詳細については、「[AWS Glue 料金表](https://aws.amazon.com/glue/pricing)」を参照してください。

**Topics**
+ [その他のリソース](#glue-additional-resources)
+ [Athena でデータカタログを登録して使用する](gdc-register.md)
+ [別のアカウントからデータカタログを登録する](data-sources-glue-cross-account.md)
+ [IAM ポリシーを使用してデータカタログへのアクセスを制御する](datacatalogs-iam-policy.md)
+ [Athena コンソールでフォームを使用して AWS Glue テーブルを追加する](data-sources-glue-manual-table.md)
+ [クローラーを使用してテーブルを追加する](schema-crawlers.md)
+ [AWS Glue パーティションのインデックス作成とフィルタリングでクエリを最適化する](glue-best-practices-partition-index.md)
+ [AWS CLI を使用して AWS Glue データベースとそのテーブルを再度作成する](glue-recreate-db-and-tables-cli.md)
+ [ETL ジョブのテーブルを作成する](schema-classifier.md)
+ [AWS Glue で CSV データを使用する](schema-csv.md)
+ [AWS Glue で地理空間データを使用する](schema-geospatial.md)

# Athena でデータカタログを登録して使用する
<a name="gdc-register"></a>

Athena は、複数のデータカタログへのマウントと接続をサポートしています。
+ Amazon Redshift データを AWS Glue Data Catalog にマウントし、データをコピーすることも移動することもなく Athena からクエリを実行できます。詳細については、「[Amazon Redshift データの AWS Glue Data Catalog への取り込み](https://docs.aws.amazon.com/lake-formation/latest/dg/managing-namespaces-datacatalog.html)」を参照してください。
+  AWS Glue 接続を使用して AWS Glue Data Catalog を外部データソースに接続し、フェデレーティッドカタログを作成して、Lake Formation を使用してきめ細かなアクセスコントロールでデータへのアクセス許可を一元管理します。詳細については、「[接続を Glue データカタログとして登録する](register-connection-as-gdc.md)」を参照してください。
+ Amazon S3 テーブルバケットからカタログを作成し、Lake Formation を使用してアクセス許可を一元管理し、テーブルバケット内のオブジェクトへのユーザーアクセスを制限します。詳細については、「Amazon S3 ユーザーガイド」の「[Amazon S3 Tables とテーブルバケットの使用](https://docs.aws.amazon.com/AmazonS3/latest/userguide/s3-tables.html)」を参照してください。

**注記**  
Glue カタログでは、`123412341234:my_catalog/my_child` のようなマルチレベルカタログのみを登録できます。`123412341234:linkcontainer` や `my_catalog` などの単一レベルのカタログを登録することはできません。単一レベルのカタログをクエリするには、Athena クエリで Glue データカタログを直接使用します。詳細については、「[Athena で AWS Glue データカタログをクエリする](gdc-register-query-the-data-source.md)」を参照してください。

**Topics**
+ [Redshift データカタログを Athena に登録する](gdc-register-rs.md)
+ [Athena でフェデレーティッドカタログを登録する](gdc-register-federated.md)
+ [Athena から S3 テーブルのバケットカタログを登録し、テーブルをクエリする](gdc-register-s3-table-bucket-cat.md)
+ [Athena で AWS Glue データカタログをクエリする](gdc-register-query-the-data-source.md)

# Redshift データカタログを Athena に登録する
<a name="gdc-register-rs"></a>

Athena は、AWS Glue Data Catalog に登録されている Redshift クラスターまたはサーバーレス名前空間に保存されているデータの読み取りと書き込みができます。これは、AWS Lake Formation と連携して機能します。このサービスは、一元化されたセキュリティとガバナンスを提供し、さまざまなクエリエンジン間でデータアクセスが一貫して管理され、共有 Redshift データのきめ細かなアクセスコントロールを維持します。

## 考慮事項と制限事項
<a name="gdc-register-rs-considerations-and-limitations"></a>
+ **マテリアライズドビュー** – Amazon Redshift マテリアライズドビューは Athena からクエリ可能ですが、Athena または Spark を使用したマテリアライズドビューの作成はサポートされていません。
+ AWS Glue Data Catalog の設定や Amazon Redshift マネージドストレージテーブルでのオペレーションを含む DDL オペレーションはサポートされていません。

## 前提条件
<a name="gdc-register-rs-prerequisites"></a>

以下のタスクを完了するまでは、Athena から AWS Glue データカタログをクエリできません。

1. Amazon Redshift クラスターまたはサーバーレス名前空間を作成して AWS Glue Data Catalog に登録します。詳細については、「Amazon Redshift 管理ガイド」の「[クラスターを AWS Glue Data Catalog に登録する](https://docs.aws.amazon.com/redshift/latest/mgmt/register-cluster.html)」または「[名前空間を AWS Glue Data Catalog に登録する](https://docs.aws.amazon.com/redshift/latest/mgmt/serverless_datasharing-register-namespace.html)」を参照してください。

1. 登録された名前空間から AWS Lake Formation にデータカタログを作成します。詳細については、「AWS Lake Formation デベロッパーガイド」の「[Amazon Redshift フェデレーティッドカタログの作成](https://docs.aws.amazon.com/lake-formation/latest/dg/create-ns-catalog.html)」を参照してください。

1. (オプション) Lake Formation を使用して、カタログにきめ細かなアクセスコントロールを設定します。詳細については、「AWS Lake Formation デベロッパーガイド」の「[AWS Glue Data Catalog へのデータの取り込み](https://docs.aws.amazon.com/lake-formation/latest/dg/bring-your-data-overview.html)」を参照してください。

## Athena コンソールで Redshift データカタログを登録する
<a name="gdc-register-rs-console-steps"></a>

Redshift データカタログを Athena コンソールに登録するには、次の手順を実行します。

1. [https://console.aws.amazon.com/athena/](https://console.aws.amazon.com/athena/) で Athena コンソールを開きます。

1. ナビゲーションペインで、**[データソースとカタログ]** を選択します。

1. **[データソースとカタログ]** ページで **[データソースを作成]** を選択します。

1. **[データソースを選択]** で、**[Amazon S3 - AWS Glue Data Catalog]** を選択します。

1. **[AWS Glue Data Catalog]** セクションの **[データソースアカウント]** で、**[このアカウントの AWS Glue Data Catalog]** を選択します。

1. **[テーブルの作成またはカタログの登録]** で、**[新しい AWS Glue カタログを登録]** を選択します。

1. **[データソースの詳細]** セクションの **[データソース名]** に、SQL クエリでデータソースを指定するために使用する名前を入力するか、生成されたデフォルト名を使用します。

1. **[カタログ]** で、**[参照]** を選択して、同じアカウントの AWS Glue カタログのリストを検索します。既存のカタログが表示されない場合は、[AWS Glue コンソール](https://console.aws.amazon.com/glue/)で作成します。

1. **[AWS Glue カタログを参照]** ダイアログボックスで、使用するカタログを選択し、**[選択]** を選択します。

1. (オプション) **[タグ]** では、データソースと関連付けるキーと値のペアがあれば入力します。

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

1. **[確認と作成]** ページで、入力した情報が正しいことを確認し、**[データソースを作成]** を選択します。

# Athena でフェデレーティッドカタログを登録する
<a name="gdc-register-federated"></a>

フェデレーティッドデータソースへの接続を作成したら、フェデレーティッドデータカタログとして登録してデータ検出を簡素化し、Lake Formation を使用してきめ細かなアクセス許可でデータアクセスを管理できます。詳細については、「[接続を Glue データカタログとして登録する](register-connection-as-gdc.md)」を参照してください。

## 考慮事項と制限事項
<a name="gdc-register-federated-consideration"></a>
+ DDL オペレーションは、フェデレーティッドカタログではサポートされていません。
+ 次のコネクタを登録して AWS Glue と統合し、きめ細かなアクセスコントロールを行うことができます。
  + [Azure Data Lake Storage](connectors-adls-gen2.md)
  + [Azure Synapse](connectors-azure-synapse.md)
  + [BigQuery](connectors-bigquery.md)
  + [CMDB](connectors-cmdb.md)
  + [Db2](connectors-ibm-db2.md)
  + [Db2 iSeries](connectors-ibm-db2-as400.md)
  + [DocumentDB](connectors-docdb.md)
  + [DynamoDB](connectors-dynamodb.md)
  + [Google Cloud Storage](connectors-gcs.md)
  + [HBase](connectors-hbase.md)
  + [MySQL](connectors-mysql.md)
  + [OpenSearch](connectors-opensearch.md)
  + [Oracle](connectors-oracle.md)
  + [[PostgreSQL]](connectors-postgresql.md)
  + [Redshift](connectors-redshift.md)
  + [SAP HANA](connectors-sap-hana.md)
  + [Snowflake](connectors-snowflake.md)
  + [SQL Server](connectors-microsoft-sql-server.md)
  + [Timestream](connectors-timestream.md)
  + [TPC-DS](connectors-tpcds.md)
+ Glue 接続フェデレーションのリソースリンクを作成する場合、[リソースリンク](https://docs.aws.amazon.com/lake-formation/latest/dg/create-resource-link-database.html)の名前はプロデューサーのデータベース名と同じである必要があります。
+ 現在、データソースで大文字と小文字が区別されていない場合でも、小文字のテーブル名と列名のみが認識されます。

# Athena から S3 テーブルのバケットカタログを登録し、テーブルをクエリする
<a name="gdc-register-s3-table-bucket-cat"></a>

Amazon S3 テーブルバケットは、Amazon S3 のバケットの一種で、Apache Iceberg テーブルに表形式データを保存するために専用に構築されています。テーブルバケットは、圧縮、スナップショット管理、ガベージコレクションなどのテーブル管理タスクを自動化して、クエリのパフォーマンスを継続的に最適化し、コストを最小限に抑えます。Iceberg 環境を始めたばかりの場合でも、Iceberg 環境に何千ものテーブルがある場合でも、テーブルバケットはあらゆる規模でデータレイクを簡素化します。詳細については、「[Table buckets](https://docs.aws.amazon.com/AmazonS3/latest/userguide/s3-tables-buckets.html)」を参照してください。

## 考慮事項と制限事項
<a name="gdc-register-s3-table-consideration"></a>
+ Iceberg テーブルでサポートされているすべての DDL オペレーションは、S3 Tables でもサポートされていますが、以下の例外があります。
  + `ALTER TABLE RENAME`、`CREATE VIEW`、`ALTER DATABASE` はサポートされていません。
  + `OPTIMIZE` および `VACUUM` – S3 で圧縮とスナップショットの管理を行うことができます。詳細については、「[S3 Tables のメンテナンスドキュメント](https://docs.aws.amazon.com/AmazonS3/latest/userguide/s3-tables-maintenance.html)」を参照してください。
+ Athena データソースとして登録された S3 Tables での DDL クエリはサポートされていません。
+ クエリ結果の再利用はサポートされていません。
+ SSE-KMS、CSE-KMS 暗号化が有効になっているワークグループでは、`INSERT`、`UPDATE`、`DELETE`、または `MERGE` などの書き込みオペレーションを S3 Tables で実行することはできません。
+ S3 リクエスタ支払いオプションが有効になっているワークグループでは、S3 Tables で DML オペレーションを実行できません。

## Athena から S3 Tables をクエリする
<a name="gdc-register-s3-table-prereq-setup"></a>

**Athena で S3 Tables をクエリする前に、以下の前提条件となる手順を実行する**

1. S3 テーブルバケットを作成します。詳細については、「Amazon Simple Storage Service ユーザーガイド」の「[テーブルバケットの作成](https://docs.aws.amazon.com/AmazonS3/latest/userguide/s3-tables-buckets-create.html)」を参照してください。

1. テーブルバケットと AWS Glue Data Catalog の統合が成功していることを確認します。必要なアクセス許可とセットアップ手順については、「AWS Glue デベロッパーガイド」の「[S3 Tables 統合の前提条件](https://docs.aws.amazon.com/glue/latest/dg/s3tables-catalog-prerequisites.html)」および「[S3 Tables と Glue Data Catalog の統合の有効化](https://docs.aws.amazon.com/glue/latest/dg/enable-s3-tables-catalog-integration.html)」を参照してください。

1. Athena でクエリを実行するために使用されるプリンシパルには、次のいずれかのアプローチを使用して S3 Table カタログに対するアクセス許可を付与します。

   **オプション 1: IAM アクセス許可を使用する**

   IAM アクセスコントロールを使用する場合、プリンシパルには AWS Glue Data Catalog リソースと Amazon S3 Tables リソースの両方に対するアクセス許可が必要です。

   次のリストには、Athena の S3 テーブルに対してサポートされている DDL または DML オペレーションを実行する上で必要なすべての `s3tables` アクセス許可が含まれています。
   + `s3tables:GetTableBucket`
   + `s3tables:GetNamespace`
   + `s3tables:GetTable`
   + `s3tables:GetTableData`
   + `s3tables:PutTableData`
   + `s3tables:ListNamespaces`
   + `s3tables:ListTables`
   + `s3tables:DeleteNamespace`
   + `s3tables:DeleteTable`
   + `s3tables:CreateNamespace`
   + `s3tables:CreateTable`
   + `s3tables:UpdateTableMetadataLocation`

   これらのアクセス許可を特定の S3 テーブルバケットと S3 テーブルリソースに適用するか、`*` をリソースとして使用して、アカウント内のすべてのテーブルバケットとテーブルへのアクセスを許可します。これらのアクセス許可を [https://docs.aws.amazon.com/aws-managed-policy/latest/reference/AmazonAthenaFullAccess.html](https://docs.aws.amazon.com/aws-managed-policy/latest/reference/AmazonAthenaFullAccess.html) 管理ポリシーと組み合わせて、完全な機能を有効にできます。

   **オプション 2: Lake Formation アクセス許可を使用する**

   または、きめ細かなアクセスコントロールを有効にするには、Lake Formation コンソールまたは AWS CLI を使用して、S3 Table カタログに対する Lake Formation アクセス許可を付与できます。これには、S3 テーブルバケットを Lake Formation データロケーションとして登録する必要があります。詳細については、「Lake Formation デベロッパーガイド」の「[AWS Glue Data Catalog での Amazon S3 Tables カタログの作成](https://docs.aws.amazon.com/lake-formation/latest/dg/create-s3-tables-catalog.html)」を参照してください。

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

   1. [https://console.aws.amazon.com/lakeformation/](https://console.aws.amazon.com/lakeformation/) で AWS Lake Formation コンソールを開き、データレイク管理者としてサインインします。データレイク管理者の作成方法の詳細については、「[データレイク管理者を作成する](https://docs.aws.amazon.com/lake-formation/latest/dg/initial-lf-config.html#create-data-lake-admin)」を参照してください。

   1. ナビゲーションペインで、**[データアクセス許可]**、**[付与]** の順に選択します。

   1. **[アクセス許可の付与]** ページの **[プリンシパル]** で、Athena からクエリを送信するために使用するプリンシパルを選択します。

   1. **[LF タグまたはカタログリソース]** で、**[名前付きのデータカタログリソース]** を選択します。

   1. **[カタログ]** では、テーブルバケットの統合から作成したグルーデータカタログを選択します。例えば、*<accountID>*:s3tablescatalog/*amzn-s3-demo-bucket* です。

   1. **[Catalog のアクセス許可]** で、**[Super]** を選択します。

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

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

   Lake Formation データレイク管理者ロールで次のコマンドを実行して、Athena からクエリを送信するために使用するプリンシパルへのアクセスを許可します。

   ```
   aws lakeformation grant-permissions \
   --region <region (Example,us-east-1)> \
   --cli-input-json \
   '{
       "Principal": {
           "DataLakePrincipalIdentifier": "<user or role ARN (Example, arn:aws:iam::<Account ID>:role/ExampleRole>"
       },
       "Resource": {
           "Catalog": {
               "Id":"<Account ID>:s3tablescatalog/amzn-s3-demo-bucket"
           }
       },
       "Permissions": ["ALL"]
   }'
   ```

------

**S3 Tables のクエリを送信する**

1. 上記で付与されたユーザー/ロールを使用して、Athena から `CREATE DATABASE` クエリを送信します。この例では、`s3tablescatalog` は統合から作成された親 Glue データカタログで、` s3tablescatalog/amzn-s3-demo-bucket` は各 S3 テーブルバケット用に作成された子 Glue データカタログです。クエリを実行する方法は 2 つあります。

------
#### [ Option 1 ]

   コンソールまたは AWS CLI から直接、子 Glue データカタログ (`s3tablescatalog/amzn-s3-demo-bucket`) を指定します。

   **AWS マネジメントコンソール の使用**

   1. [https://console.aws.amazon.com/athena/](https://console.aws.amazon.com/athena/) で Athena コンソールを開きます。

   1. 左側のナビゲーションで、**[データソース名]** に **[AwsDataCatalog]** を選択します。

   1. **[カタログ]** に、**[s3tablescatalog/*amzn-s3-demo-bucket*]** を選択します。

   1. クエリエディタで、`CREATE DATABASE test_namespace` のようなクエリを入力します。

   **AWS CLI の使用**

   以下のコマンドを実行してください。

   ```
   aws athena start-query-execution \ 
   --query-string 'CREATE DATABASE `test_namespace`' \ 
   --query-execution-context '{"Catalog": "s3tablescatalog/amzn-s3-demo-bucket"}' \
   --work-group "primary"
   ```

------
#### [ Option 2 ]

   Athena コンソールで子 Glue データカタログから Athena データカタログを作成し、クエリでカタログとして指定します。詳細については、「[Athena データソースとして S3 テーブルバケットカタログを登録する](#gdc-register-s3-table-console-steps)」を参照してください。

------

1. 前のステップで作成したデータベースで、`CREATE TABLE` を使用してテーブルを作成します。次の例では、`s3tablescatalog/amzn-s3-demo-bucket` Glue カタログで以前に作成した *`test_namespace`* データベースにテーブルを作成します。

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

   1. 左側のナビゲーションで、**[データソース名]** に **[AwsDataCatalog]** を選択します。

   1. **[カタログ]** に、**[s3tablescatalog/*amzn-s3-demo-bucket*]** を選択します。

   1. **[データベース]** で **[test\$1namespace]** を選択します。

   1. クエリエディタで、次のクエリを実行します。

      ```
      CREATE TABLE daily_sales (
              sale_date date,
              product_category
              string, sales_amount double)
      PARTITIONED BY (month(sale_date))
      TBLPROPERTIES ('table_type' = 'iceberg')
      ```

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

   以下のコマンドを実行してください。

   ```
   aws athena start-query-execution \
   --query-string "CREATE TABLE daily_sales (
           sale_date date,
           product_category
           string, sales_amount double)
   PARTITIONED BY (month(sale_date))
   TBLPROPERTIES ('table_type' = 'iceberg')" \
   --query-execution-context '{"Catalog": "s3tablescatalog/amzn-s3-demo-bucket", "Database":"test_namespace"}' \
   --work-group "primary"
   ```

------

1. 前のステップで作成したテーブルにデータを挿入します。

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

   1. 左側のナビゲーションで、**[データソース名]** に **[AwsDataCatalog]** を選択します。

   1. **[カタログ]** に、**[s3tablescatalog/*amzn-s3-demo-bucket*]** を選択します。

   1. **[データベース]** で **[test\$1namespace]** を選択します。

   1. クエリエディタで、次のクエリを実行します。

      ```
      INSERT INTO daily_sales
      VALUES 
          (DATE '2024-01-15', 'Laptop', 900.00),
          (DATE '2024-01-15', 'Monitor', 250.00),
          (DATE '2024-01-16', 'Laptop', 1350.00),
          (DATE '2024-02-01', 'Monitor', 300.00);
      ```

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

   以下のコマンドを実行してください。

   ```
   aws athena start-query-execution \
   --query-string "INSERT INTO \"s3tablescatalog/amzn-s3-demo-bucket\".test_namespace.daily_sales
   VALUES 
   (DATE '2024-01-15', 'Laptop', 900.00),
   (DATE '2024-01-15', 'Monitor', 250.00),
   (DATE '2024-01-16', 'Laptop', 1350.00),
   (DATE '2024-02-01', 'Monitor', 300.00)"\ 
   --work-group "primary"
   ```

------

1. テーブルにデータを挿入したら、クエリを実行できます。

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

   1. 左側のナビゲーションで、**[データソース名]** に **[AwsDataCatalog]** を選択します。

   1. **[カタログ]** に、**[s3tablescatalog/*amzn-s3-demo-bucket*]** を選択します。

   1. **[データベース]** で **[test\$1namespace]** を選択します。

   1. クエリエディタで、次のクエリを実行します。

      ```
      SELECT
          product_category,
          COUNT(*) AS units_sold,
          SUM(sales_amount) AS total_revenue,
          AVG(sales_amount) AS average_price
      FROM
          daily_sales
      WHERE
          sale_date BETWEEN DATE '2024-02-01' 
                       AND DATE '2024-02-29'
      GROUP BY
          product_category
      ORDER BY
          total_revenue DESC
      ```

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

   以下のコマンドを実行してください。

   ```
   aws athena start-query-execution \
   --query-string "SELECT product_category,
       COUNT(*) AS units_sold,
       SUM(sales_amount) AS total_revenue,
       AVG(sales_amount) AS average_price
   FROM \"s3tablescatalog/amzn-s3-demo-bucket\".test_namespace.daily_sales
   WHERE sale_date BETWEEN DATE '2024-02-01' AND DATE '2024-02-29'
   GROUP BY product_category
   ORDER BY total_revenue DESC"\
   --work-group "primary"
   ```

------

## Athena で S3 Tables を作成する
<a name="gdc-create-s3-tables-athena"></a>

Athena では、既存の S3 テーブル名前空間でのテーブルの作成、または Athena で `CREATE DATABASE` ステートメントを使用して作成された名前空間の作成がサポートされています。Athena から S3 テーブルを作成するには、次の例に示すように、`LOCATION` を指定しない点を除いて、[通常の Iceberg テーブルを作成する](querying-iceberg-creating-tables.md)場合と同じ構文を使用します。

```
CREATE TABLE
[db_name.]table_name (col_name data_type [COMMENT col_comment] [, ...] )
[PARTITIONED BY (col_name | transform, ... )]
[TBLPROPERTIES ([, property_name=property_value] )]
```

CREATE TABLE AS SELECT (CTAS) ステートメントを使用して S3 テーブルを作成することもできます。詳細については、「[S3 テーブル向けの CTAS](#ctas-s3-tables)」を参照してください。

## Athena データソースとして S3 テーブルバケットカタログを登録する
<a name="gdc-register-s3-table-console-steps"></a>

S3 テーブルバケットカタログを Athena コンソールに登録するには、次の手順を実行します。

1. [https://console.aws.amazon.com/athena/](https://console.aws.amazon.com/athena/) で Athena コンソールを開きます。

1. ナビゲーションペインで、**[データソースとカタログ]** を選択します。

1. **[データソースとカタログ]** ページで **[データソースを作成]** を選択します。

1. **[データソースを選択]** で、**[Amazon S3 - AWS Glue Data Catalog]** を選択します。

1. **[AWS Glue Data Catalog]** セクションの **[データソースアカウント]** で、**[このアカウントの AWS Glue Data Catalog]** を選択します。

1. **[テーブルの作成またはカタログの登録]** で、**[新しい AWS Glue カタログを登録]** を選択します。

1. **[データソースの詳細]** セクションの **[データソース名]** に、SQL クエリでデータソースを指定するために使用する名前を入力するか、生成されたデフォルト名を使用します。

1. **[カタログ]** で、**[参照]** を選択して、同じアカウントの AWS Glue カタログのリストを検索します。既存のカタログが表示されない場合は、[AWS Glue コンソール](https://console.aws.amazon.com/glue/)で作成します。

1. **[AWS Glue カタログを参照]** ダイアログボックスで、使用するカタログを選択し、**[選択]** を選択します。

1. (オプション) **[タグ]** では、データソースと関連付けるキーと値のペアがあれば入力します。

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

1. **[確認と作成]** ページで、入力した情報が正しいことを確認し、**[データソースを作成]** を選択します。

## S3 テーブル向けの CTAS
<a name="ctas-s3-tables"></a>

Amazon Athena で S3 テーブル向けの CREATE TABLE AS SELECT (CTAS) オペレーションが現在サポートされています。この機能を使用すると、SELECT クエリの結果に基づいて新しい S3 テーブルを作成できます。

S3 テーブルの CTAS クエリを作成する際には、標準の Athena テーブルと比べていくつかの重要な違いがあります。
+ S3 Tables は独自のストレージロケーションを自動的に管理するため、ロケーションプロパティを省略する必要があります。
+ `table_type` プロパティはデフォルトで `ICEBERG` になるため、クエリで明示的に指定する必要はありません。
+ 形式を指定しない場合、システムは自動的にデータのデフォルト形式として `PARQUET` を使用します。
+ 他のすべてのプロパティは、通常の Iceberg テーブルと同じ構文に従います。

CTAS を使用して S3 Tables を作成する前に、IAM または AWS Lake Formation で必要なアクセス許可が設定されていることを確認してください。具体的には、S3 Tables カタログにテーブルを作成するためのアクセス許可が必要です。これらのアクセス許可がないと、CTAS オペレーションは失敗します。

**注記**  
CTAS クエリが失敗した場合、クエリを再実行する前に [S3 Tables API](https://docs.aws.amazon.com/AmazonS3/latest/userguide/s3-tables-delete.html) を使用してテーブルの削除が必要な場合があります。Athena `DROP TABLE` ステートメントを使用して、クエリによって部分的に作成されたテーブルを削除することはできません。

**例**

```
CREATE TABLE "s3tablescatalog/amzn-s3-demo-bucket"."namespace"."s3-table-name"
WITH (
    format = 'PARQUET'
)
AS SELECT *
FROM source_table;
```

# Athena で AWS Glue データカタログをクエリする
<a name="gdc-register-query-the-data-source"></a>

Athena からデータカタログをクエリするには、次のいずれかを実行します。
+ カタログをデータソースとして Athena に登録し、データソース名を使用してカタログをクエリします。この使用では、次のクエリは同等です。

  ```
  SELECT * FROM my_data_source.my_database.my_table
  ```
+ Athena データソースとして登録されていないカタログをクエリする場合は、次の例のように、`SELECT` クエリでカタログへのフルパスを指定できます。

  ```
  SELECT * FROM "my_catalog/my_subcatalog".my_database.my_table
  ```
+ これは、AWS マネジメントコンソール から実行することもできます。

  1. [https://console.aws.amazon.com/athena/](https://console.aws.amazon.com/athena/) で Athena コンソールを開きます。

  1. クエリエディタの **[データソース]** で、**[AwsDataCatalog]** を選択します。

  1. **[カタログ]** で、使用するカタログの名前を選択します。

  1. **[データベース]** で、クエリするテーブルを含むデータベースを選択します。

  1. `SELECT * FROM my_table` のようなクエリを入力し、**[実行]** を選択します。

# 別のアカウントからデータカタログを登録する
<a name="data-sources-glue-cross-account"></a>

Athena のクロスアカウント AWS Glue カタログ機能を使用して、所有するアカウント以外のアカウントから AWS Glue カタログを登録できます。AWS Glue に必要な IAM アクセス許可を設定して、カタログを Athena `DataCatalog` リソースとして登録したら、Athena を使用してクロスアカウントクエリを実行できます。必要な許可の設定については、「[AWS Glue データカタログへのクロスアカウントアクセスを構成する](security-iam-cross-account-glue-catalog-access.md)」を参照してください。

以下の手順では、Athena を使用して、所有する Amazon Web Services アカウント以外のアカウントの AWS Glue Data Catalog をデータソースとして設定する方法を説明します。

## コンソールから登録する
<a name="data-sources-glue-cross-account-console"></a>

1. 「[AWS Glue データカタログへのクロスアカウントアクセスを構成する](security-iam-cross-account-glue-catalog-access.md)」のステップに従って、他のアカウントのデータカタログをクエリする許可があることを確認します。

1. [https://console.aws.amazon.com/athena/](https://console.aws.amazon.com/athena/home) で Athena コンソールを開きます。

1. コンソールのナビゲーションペインが表示されない場合は、左側の展開メニューをクリックします。  
![\[展開メニューを選択します。\]](http://docs.aws.amazon.com/ja_jp/athena/latest/ug/images/nav-pane-expansion.png)

1. **[データソースとカタログ]** を選択します。

1. コンソールの右上で、**[Create data source]** (データソースの作成) を選択します。

1. **[Choose a data source]** (データソースを選択) ページの **[Data sources]** (データソース) で、**[S3 - AWS Glue Data Catalog]** (S3 – AWS Glue Data Catalog データカタログ) を選択してから、**[Next]** (次へ) を選択します。

1. **[Enter data source details]** (データソースの詳細を入力) ページの **[AWS Glue Data Catalog]** (AWS Glue Data Catalog データカタログ) セクションにある **[Choose an AWS Glue Data Catalog]** (AWS Glue Data Catalog データカタログを選択) で、**[AWS Glue Data Catalog in another account]** (別のアカウントの AWS Glue Data Catalog データカタログ) を選択します。

1. **[Data source details]** (データソースの詳細) に、以下の情報を入力します。
   + **[Data source name]** (データソース名) – 他のアカウントにあるデータカタログを参照するために SQL クエリで使用する名前を入力します。
   + **Description** (説明) – (オプション) 他のアカウントにあるデータカタログの説明を入力します。
   + **カタログ ID** – データカタログが属する Amazon Web Services アカウントの 12 桁のアカウント ID を入力します。Amazon Web Services アカウント ID はカタログ ID です。

1. (オプション) **[Tags]** (タグ) では、データソースと関連付けるキーと値のペアを入力します。タグの詳細については、[Athena リソースにタグ付けする](tags.md)を参照してください。

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

1. **[Review and create]** (確認と作成) ページで入力した情報を確認してから、**[Create data source]** (データソースの作成) を選択します。**[Data source details]** (データソースの詳細) ページに、登録したデータカタログのデータベースとタグがリストされます。

1. **[データソースとカタログ]** を選択します。登録したデータカタログは、**[Data source name]** (データソース名) 列にリストされています。

1. データカタログに関する情報を表示または編集するには、カタログを選択してから、**[Actions]** (アクション)、**[Edit]** (編集) の順に選択します。

1. 新しいデータカタログを削除するには、カタログを選択してから、**[Actions]** (アクション)、**[Delete]** (削除する) の順に選択します。

## API オペレーションを使用して登録する
<a name="data-sources-glue-cross-account-api"></a>

1. 以下の `CreateDataCatalog` リクエストボディは、クロスアカウントアクセス用に AWS Glue カタログを登録します。

   ```
   # Example CreateDataCatalog request to register a cross-account Glue catalog:
   {
       "Description": "Cross-account Glue catalog",
       "Name": "ownerCatalog",
       "Parameters": {"catalog-id" : "<catalogid>"  # Owner's account ID
       },
       "Type": "GLUE"
   }
   ```

1. 以下のサンプルコードは、Java クライアントを使用して `DataCatalog` オブジェクトを作成します。

   ```
   # Sample code to create the DataCatalog through Java client
   CreateDataCatalogRequest request = new CreateDataCatalogRequest()
       .withName("ownerCatalog")
       .withType(DataCatalogType.GLUE)
       .withParameters(ImmutableMap.of("catalog-id", "<catalogid>"));
   
   athenaClient.createDataCatalog(request);
   ```

   これらのステップの後、借用者が [ListDataCatalogs](https://docs.aws.amazon.com/athena/latest/APIReference/API_ListDataCatalogs.html) API オペレーションを呼び出すと、*`ownerCatalog`* が表示されます。

## AWS CLI を使用して登録する
<a name="data-sources-glue-cross-account-cli"></a>

次の CLI コマンド例を使用して、別のアカウントから AWS Glue Data Catalog を登録します。

```
aws athena create-data-catalog \
  --name cross_account_catalog \
  --type GLUE \
  --description "Cross Account Catalog" \
  --parameters catalog-id=<catalogid>
```

詳細については、*AWS Big Data Blog* の「[Query cross-account AWS Glue Data Catalogs using Amazon Athena](https://aws.amazon.com/blogs/big-data/query-cross-account-aws-glue-data-catalogs-using-amazon-athena/)」を参照してください。

# IAM ポリシーを使用してデータカタログへのアクセスを制御する
<a name="datacatalogs-iam-policy"></a>

データカタログへのアクセスを制御するには、リソースレベルの IAM アクセス許可、またはアイデンティティベースの IAM ポリシーを使用します。

以下の手順は、Athena に固有の手順です。

IAM 固有の情報については、このセクションの最後に表示されているリンク先を参照してください。JSON データカタログポリシーの例については、「[データカタログポリシーの例](datacatalogs-example-policies.md)」を参照してください。

**IAM コンソールのビジュアルエディタを使用してデータカタログポリシーを作成する**

1. AWS マネジメントコンソール にサインインして、IAM コンソール ([https://console.aws.amazon.com/iam/](https://console.aws.amazon.com/iam/)) を開きます。

1. 左側のナビゲーションペインで、[**Policies**] (ポリシー)、[**Create policy**] (ポリシーの作成) の順にクリックします。

1. [**Visual editor**] (ビジュアルエディタ) タブで、[**Choose a service**] (サービスの選択) をクリックします。次に、ポリシーに追加する Athena を選択します。

1. **[Select actions]** (アクションの選択) を選択し、ポリシーに追加するアクションを選択します。ビジュアルエディタが Athena で利用できるアクションを表示します。詳細については、「*サービス承認リファレンス*」の「[Amazon Athena のアクション、リソース、および条件キー](https://docs.aws.amazon.com/service-authorization/latest/reference/list_amazonathena.html)」を参照してください。

1. **[Add actions]** (アクションの追加) をクリックして特定のアクションを入力、またはワイルドカード (\$1) を使用して複数のアクションを指定します。

   デフォルトでは、作成しているポリシーが選択するアクションを許可します。Athena 内の `datacatalog` リソースに対するリソースレベルのアクセス許可をサポートするアクションを 1 つ、または複数選択すると、エディタが `datacatalog` リソースをリストします。

1. **[リソース]** (リソース) をクリックして、ポリシーの特定のデータカタログを指定します。JSON データカタログポリシーの例については、「[データカタログポリシーの例](datacatalogs-example-policies.md)」を参照してください。

1. 以下のように `datacatalog` リソースを指定します。

   ```
   arn:aws:athena:<region>:<user-account>:datacatalog/<datacatalog-name>
   ```

1. **[Review policy]** (ポリシーの確認) をクリックして、作成するポリシーの **[Name]** (名前) と **[Description**] (説明) (オプション) を入力します。ポリシー概要を確認して、意図したアクセス許可を付与したことを確認します。

1. [**Create Policy**] (ポリシーの作成) をクリックして、新しいポリシーを保存します。

1. このアイデンティティベースのポリシーをユーザー、グループ、またはロールにアタッチし、それらのユーザー、グループ、またはロールがアクセスできる `datacatalog` リソースを指定します。

詳細については、「*Service Authorization Reference*」と「*IAM ユーザーガイド*」に記載されている以下のトピックを参照してください。
+ [Amazon Athena のアクション、リソース、および条件キー](https://docs.aws.amazon.com/service-authorization/latest/reference/list_amazonathena.html)
+ [ビジュアルエディタでのポリシーの作成](https://docs.aws.amazon.com/IAM/latest/UserGuide/access_policies_create.html#access_policies_create-visual-editor)
+ [IAM ポリシーの追加と削除](https://docs.aws.amazon.com/IAM/latest/UserGuide/access_policies_manage-attach-detach.html)
+ [リソースへのアクセスの制御](https://docs.aws.amazon.com/IAM/latest/UserGuide/access_controlling.html#access_controlling-resources)

JSON データカタログポリシーの例については、「[データカタログポリシーの例](datacatalogs-example-policies.md)」を参照してください。

AWS Glue のアクセス許可および AWS Glue クローラーのアクセス許可の詳細については、「*AWS Glue デベロッパーガイド*」の「[AWS Glue 用の IAM アクセス許可のセットアップ](https://docs.aws.amazon.com/glue/latest/dg/getting-started-access.html)」および「[クローラーの前提条件](https://docs.aws.amazon.com/glue/latest/dg/crawler-prereqs.html)」を参照してください。

Amazon Athena アクションの完全なリストについては、「[Amazon Athena API リファレンス](https://docs.aws.amazon.com/athena/latest/APIReference/)」の API アクション名を参照してください。

# データカタログポリシーの例
<a name="datacatalogs-example-policies"></a>

このセクションには、データカタログに対するさまざまなアクションを有効にするために使用できるポリシーの例が含まれています。

データカタログは、Athena によって管理されている IAM リソースです。そのため、データカタログポリシーで `datacatalog` を入力として取るアクションを使用する場合、データカタログの ARN を次のように指定する必要があります。

```
"Resource": [arn:aws:athena:<region>:<user-account>:datacatalog/<datacatalog-name>]
```

`<datacatalog-name>` は、データカタログの名前です。例えば、`test_datacatalog` という名前のデータカタログの場合は、次のようにリソースとして指定します。

```
"Resource": ["arn:aws:athena:us-east-1:123456789012:datacatalog/test_datacatalog"]
```

Amazon Athena アクションの完全なリストについては、「[Amazon Athena API リファレンス](https://docs.aws.amazon.com/athena/latest/APIReference/)」の API アクション名を参照してください。IAM ポリシーの詳細については、「*IAM ユーザーガイド*」で「[ビジュアルエディタでのポリシーの作成](https://docs.aws.amazon.com/IAM/latest/UserGuide/access_policies_create.html#access_policies_create-visual-editor)」を参照してください。ワークグループ用の IAM ポリシーの作成に関する詳細については、「[IAM ポリシーを使用してデータカタログへのアクセスを制御する](datacatalogs-iam-policy.md)」を参照してください。
+ [Example Policy for Full Access to All Data Catalogs](#datacatalog-policy-full-access-to-all-data-catalogs)
+ [Example Policy for Full Access to a Specified Data Catalog](#datacatalog-policy-full-access-to-a-specified-catalog)
+ [Example Policy for Querying a Specified Data Catalog](#datacatalog-policy-querying-a-specified-data-catalog)
+ [Example Policy for Management Operations on a Specified Data Catalog](#datacatalog-policy-management-operations-on-a-specified-catalog)
+ [Example Policy for Listing Data Catalogs](#datacatalog-policy-listing-data-catalogs)
+ [Example Policy for Metadata Operations on Data Catalogs](#datacatalog-policy-metadata-operations)

**Example すべてのデータカタログへの完全なアクセスのためのポリシー例**  
以下のポリシーは、アカウントに存在している可能性があるすべてのデータカタログリソースへの完全なアクセスを許可します。アカウントの他のすべてのユーザーのデータカタログを管理する必要があるユーザーにこのポリシーを使用することをお勧めします。    
****  

```
{
   "Version":"2012-10-17",		 	 	 
   "Statement":[
      {
         "Effect":"Allow",
         "Action":[
            "athena:*"
         ],
         "Resource":[
            "*"
         ]
      }
   ]
}
```

**Example 指定されたデータカタログへの完全なアクセスのためのポリシー例**  
次のポリシーでは、`datacatalogA` という名前の 1 つの特定のデータカタログリソースへのフルアクセスを許可します。特定のデータカタログを完全に制御しているユーザーにこのポリシーを使用できます。    
****  

```
{ "Version":"2012-10-17",		 	 	  "Statement":[ { "Effect":"Allow", "Action":[
   "athena:ListDataCatalogs", "athena:ListWorkGroups", "athena:GetDatabase", "athena:ListDatabases",
   "athena:ListTableMetadata", "athena:GetTableMetadata" ], "Resource":"*" }, { "Effect":"Allow",
   "Action":[ "athena:StartQueryExecution", "athena:GetQueryResults", "athena:DeleteNamedQuery",
   "athena:GetNamedQuery", "athena:ListQueryExecutions", "athena:StopQueryExecution",
   "athena:GetQueryResultsStream", "athena:ListNamedQueries", "athena:CreateNamedQuery",
   "athena:GetQueryExecution", "athena:BatchGetNamedQuery", "athena:BatchGetQueryExecution",
   "athena:DeleteWorkGroup", "athena:UpdateWorkGroup", "athena:GetWorkGroup",
   "athena:CreateWorkGroup" ], "Resource":[
      "arn:aws:athena:us-east-1:123456789012:workgroup/*"
   ] }, { "Effect":"Allow", "Action":[ "athena:CreateDataCatalog", "athena:DeleteDataCatalog",
   "athena:GetDataCatalog", "athena:GetDatabase", "athena:GetTableMetadata", "athena:ListDatabases",
   "athena:ListTableMetadata", "athena:UpdateDataCatalog" ],
      "Resource":"arn:aws:athena:us-east-1:123456789012:datacatalog/datacatalogA"
   } ] }
```

**Example 指定されたデータカタログをクエリするためのポリシー例**  
次のポリシーでは、ユーザーは指定した `datacatalogA` に対してクエリを実行することを許可されています。ユーザーは、データカタログの更新や削除など、データカタログ自体の管理タスクを実行することはできません。    
****  

```
{ "Version":"2012-10-17",		 	 	  "Statement":[ { "Effect":"Allow", "Action":[
   "athena:StartQueryExecution" ], "Resource":[
      "arn:aws:athena:us-east-1:123456789012:workgroup/*"
   ] }, { "Effect":"Allow", "Action":[ "athena:GetDataCatalog" ], "Resource":[
      "arn:aws:athena:us-east-1:123456789012:datacatalog/datacatalogA"
   ] } ] }
```

**Example 指定されたデータカタログに対する管理オペレーションのためのポリシー例**  
次のポリシーでは、ユーザーはデータカタログ `datacatalogA` の作成、削除、詳細の取得、および更新を許可されています。    
****  

```
{ "Version":"2012-10-17",		 	 	  "Statement": [ { "Effect": "Allow", "Action": [
    "athena:CreateDataCatalog", "athena:GetDataCatalog", "athena:DeleteDataCatalog",
    "athena:UpdateDataCatalog" ], "Resource": [
        "arn:aws:athena:us-east-1:123456789012:datacatalog/datacatalogA"
    ] } ] }
```

**Example データカタログをリスト化するためのポリシー例**  
以下のポリシーは、すべてのユーザーがすべてのデータカタログをリストアップすることを許可します。    
****  

```
{
    "Version":"2012-10-17",		 	 	 
    "Statement": [
        {
            "Effect": "Allow",
            "Action": [
                "athena:ListDataCatalogs"
            ],
            "Resource": "*"
        }
    ]
}
```

**Example データカタログでのメタデータオペレーションのためのポリシー例**  
以下のポリシーは、データカタログに対するメタデータオペレーションを許可します。    
****  

```
{
    "Version":"2012-10-17",		 	 	 
    "Statement": [
        {
            "Effect": "Allow",
            "Action": [
                "athena:GetDatabase",
                "athena:GetTableMetadata",
                "athena:ListDatabases",
                "athena:ListTableMetadata"
            ],
            "Resource": "*"
        }
    ]
}
```

# Athena コンソールでフォームを使用して AWS Glue テーブルを追加する
<a name="data-sources-glue-manual-table"></a>

以下の手順で、テーブルの追加のために、Athena コンソールの **[Create Table From S3 bucket data]** (S3 バケットデータからテーブルを作成) フォームを使用する方法を説明します。

**フォームによりテーブルを追加してスキーマ情報を入力するには**

1. [https://console.aws.amazon.com/athena/](https://console.aws.amazon.com/athena/home) で Athena コンソールを開きます。

1. クエリエディタで、**[Tables and views]** (テーブルとビュー) の横にある **[Create]** (作成) をクリックし、次に **[S3 bucket data]** (S3 バケットデータ) をクリックします。

1. **[Create Table From S3 bucket data]** (S3 バケットデータからテーブルを作成) フォームで、**[Table name]** (テーブル名) にテーブルの名前を入力します。Athena のデータベース名、テーブル名、および列名で使用できる文字については、「[データベース、テーブル、列に名前を付ける](tables-databases-columns-names.md)」を参照してください。

1. **[Database configuration]** (データベース設定) で既存のデータベースを選択するか、新しいデータベースを作成します。

1. **[Location of Input Data Set]** (入力データセットの場所) に、処理するデータセットが含まれるフォルダへの Amazon S3 のパスを指定します。パスにはファイル名を含めないでください。Athena で、指定したフォルダ内のすべてのファイルがスキャンされます。データが既に分割されている場合 (例: 

    s3://amzn-s3-demo-bucket/logs/year=2004/month=12/day=11/)、ベースパスのみを入力します (例: s3://amzn-s3-demo-bucket/logs/)。

1. **[Data Format]** (データ形式) で、次のオプションから選択します。
   + **[Table type]** (テーブルタイプ) には、**[Apache Hive]** (アパッチハイブ)、**[Apache Iceberg]** (アパッチアイスバーグ)、または **[Delta Lake]** (デルタレイク) を選択してください。Athena では Apache Hive テーブルタイプがデフォルトとして使用されます。Athena での Apache Iceberg テーブルのクエリについては、「[Apache Iceberg テーブルをクエリする](querying-iceberg.md)」を参照してください。Athena での Delta Lake テーブルの使用に関する情報は、「[Linux Foundation Delta Lake テーブルをクエリする](delta-lake-tables.md)」を参照してください。
   + **[File format]** (ファイル形式) で、データに適用されているファイル形式またはログ形式を選択します。
     + [**Text File with Custom Delimiters (カスタム区切り記号のあるテキストファイル)**] オプションでは、[**Field terminator (フィールドターミネータ)**]（列区切り記号）を指定します。オプションで、配列型の終わりを示す **[Collection terminator]** (コレクションターミネータ) またはマッピングデータタイプの終わりを示す **[Collection terminator]** (コレクションターミネータ) を指定できます。
   + **[SerDe library]** (SerDe ライブラリ) – SerDe (シリアライザー/デシリアライザー) ライブラリは特定のデータ形式を解析して、Athena でそのデータ形式のテーブルを作成できるようにします。ほとんどの形式では、デフォルトの SerDe ライブラリが自動的に選択されます。次の形式については、要件に応じてライブラリを選択してください。
     + **[Apache Web Logs]** (Apache ウェブログ) – **[RegexSerDe]** または **[GrokSerDe]** ライブラリのどちらかを選択します。RegexSerDe の場合は、**[Regex definition]** (Regex の定義) ボックスに正規表現を入力します。GrokSerDe の場合は、`input.format` SerDe プロパティに一連の名前付き正規表現を入力します。名前付き正規表現は、正規表現よりも読みやすく、管理しやすいです。詳細については、「[Amazon S3 に保存されている Apache ログをクエリする](querying-apache-logs.md)」を参照してください。
     + **[CSV]** – カンマ区切り (CSV) データに二重引用符で囲まれた値が含まれていない場合、または `java.sql.Timestamp` 形式を使用している場合は、**[LazySimpleSerDe]** を選択します。引用符で囲まれた部分がデータに含まれている場合や、`TIMESTAMP` に UNIX の数値形式 (例: `1564610311`) を使用している場合は、**[OpenCSVSerDe]** を選択します。詳細については、「[CSV、TSV、カスタム区切りファイル用の Lazy Simple SerDe](lazy-simple-serde.md)」および「[CSV を処理するための Open CSV SerDe](csv-serde.md)」を参照してください。
     + **[JSON]** – **[OpenX]** または **[Hive]** JSON SerDe ライブラリのどちらかを選択します。どちらの形式でも、各 JSON ドキュメントが、1 行のテキストに存在し、フィールドが改行文字で区切られていないことが想定されます。OpenX SerDe にはいくつかの追加プロパティがあります。これらのプロパティの詳細については、「[OpenX JSON SerDe](openx-json-serde.md)」を参照してください。Hive SerDe については、「[Hive JSON SerDe](hive-json-serde.md)」を参照してください。

     Athena で SerDe ライブラリを使用する方法の詳細については、「[データ用に SerDe を選択する](supported-serdes.md)」を参照してください。

1. **[SerDe properties]** (SerDe プロパティ) で、使用している SerDe ライブラリと要件に従って、プロパティと値を追加、編集、または削除します。
   + SerDe プロパティを追加するには、**[Add SerDe property]** (SerDe プロパティを追加) を選択します。
   + **[Name]** (名前) フィールドに、プロパティの名前を入力します。
   + **[Value]** (値) フィールドに、プロパティの値を入力します。
   + SerDe プロパティを削除するには、**[Remove]** (削除) を選択します。

1. **[Table properties]** (テーブルプロパティ) で、要件に従ってテーブルプロパティを選択または編集します。
   + **[Write compression]** (書き込み圧縮) で、圧縮オプションを選択します。書き込み圧縮オプションが使用可能かどうかと、使用可能な圧縮オプションは、データ形式によって異なります。詳細については、「[Athena で圧縮を使用する](compression-formats.md)」を参照してください。
   + **[Encryption]** (暗号化) で、元のデータが Amazon S3 で暗号化されていれば **[Encrypted data set]** (暗号化されたデータセット) を選択します。このオプションで、`CREATE TABLE` ステートメント内の `has_encrypted_data` テーブルプロパティが true に設定されます。

1. **[Column details]** (列の詳細) に、テーブルに追加する列の名前とデータ型を入力します。
   + 列を 1 つずつ追加するには、[**Add a column (列の追加)**] を選択します。
   + すばやく列を追加するには、[**Bulk add columns (列を一括追加)**] を選択します。テキストボックスに、列のカンマ区切りのリストを *column\$1name**data\$1type*, *column\$1name**data\$1type*[, ...], の形式で入力し、**[Add]** (追加) を選択します。

1. (オプション) **[Partition details]** (パーティションの詳細) に、1 つ以上の列名とデータ型をそれぞれ追加します。パーティションでは、関連するデータが列の値に基づいてまとめられるため、クエリごとにスキャンされるデータ量を減らすことができます。パーティショニングについては、「[データのパーティション化](partitions.md)」を参照してください。

1. (オプション) **[Bucketing]** (バケット化) で、グループ化する行を含む 1 つまたは複数の列を指定し、それらの行を複数のバケットに入れることができます。これにより、バケット化された列の値が指定されている場合に、読み込むバケットのみをクエリできます。
   + **[Buckets]** (バケット) で、一意の値 (プライマリキーなど) が多く、クエリ内のデータのフィルタリングによく使用される列を 1 つまたは複数選択します。
   + **[Number of buckets]** (バケット数) に、ファイルを最適なサイズにすることができる数値を入力します。詳細については、AWS Big Data ブログの「[Amazon Athena のパフォーマンスチューニング Tips トップ 10](https://aws.amazon.com/blogs/big-data/top-10-performance-tuning-tips-for-amazon-athena/)」を参照してください。
   + バケット列を指定するには、`CREATE TABLE` ステートメントで次の構文を使用します。

     ```
     CLUSTERED BY (bucketed_columns) INTO number_of_buckets BUCKETS
     ```
**注記**  
**[Bucketing]** (バケット化) オプションは、**[Iceberg]** テーブルタイプでは使用できません。

1. **[Preview table query]** (テーブルクエリのプレビュー) ボックスに、フォームで入力した情報を基に生成された `CREATE TABLE` ステートメントが表示されます。プレビューでのステートメントを、直接編集することはできません。ステートメントを変更するには、プレビューの上にあるフォームのフィールドを変更します。あるいは、フォームを使用する代わりに、クエリエディタで[ステートメントを直接作成](creating-tables-how-to.md#to-create-a-table-using-hive-ddl)します。

1. **[Create table]** (テーブルの作成) をクリックして、そこで生成されたステートメントをクエリエディタ内で実行し、テーブルを作成します。

# クローラーを使用してテーブルを追加する
<a name="schema-crawlers"></a>

AWS Glue クローラを使用すると、データセットのスキーマを検出して AWS Glue Data Catalog に登録できます。クローラは、データを参照しスキーマの判定を行います。さらに、パーティションを検出して登録することもできます。詳細については、「AWS Glue デベロッパーガイド」の「[クローラの定義](https://docs.aws.amazon.com/glue/latest/dg/add-crawler.html)」を参照してください。正常にクロールされたデータのテーブルは Athena からクエリできます。

**注記**  
Athena は、AWS Glue クローラに指定した[除外パターン](https://docs.aws.amazon.com/glue/latest/dg/define-crawler.html#crawler-data-stores-exclude)を認識しません。例えば、`.csv` と `.json` ファイルの両方が含まれる Amazon S3 バケットがある場合、`.json` ファイルをクローラーから除外しても、Athena は両方のファイルのグループをクエリします。これを回避するには、除外するファイルを別の場所に配置します。

## AWS Glue クローラーを作成する
<a name="data-sources-glue-crawler-setup"></a>

クローラの作成には、まず Athena コンソールを起動し、それと合わせて AWS Glue コンソールを使用します。クローラーを作成する際には、Amazon S3 内にあるクロール対象のデータの場所を指定します。

**Athena コンソールから AWS Glue のクローラを作成するには**

1. [https://console.aws.amazon.com/athena/](https://console.aws.amazon.com/athena/home) で Athena コンソールを開きます。

1. クエリエディタの **[Tables and views]** (テーブルとビュー) の横にある **[Create]** (作成) を選択し、その後 **[AWS Glue crawler]** を選択します。

1. **AWS Glue** コンソールの [**Add crawler (クローラの追加)**] ページで、次の手順に従いクローラを作成します。詳細については、このガイドの「[AWS Glue クローラの使用](#schema-crawlers)」、ならびに「*AWS Glue デベロッパーガイド*」の「[AWS Glue Data Catalog の入力](https://docs.aws.amazon.com/glue/latest/dg/populate-catalog-methods.html)」を参照してください。

**注記**  
Athena は、AWS Glue クローラに指定した[除外パターン](https://docs.aws.amazon.com/glue/latest/dg/define-crawler.html#crawler-data-stores-exclude)を認識しません。例えば、`.csv` と `.json` ファイルの両方が含まれる Amazon S3 バケットがある場合、`.json` ファイルをクローラーから除外しても、Athena は両方のファイルのグループをクエリします。これを回避するには、除外するファイルを別の場所に配置します。

AWS Glue クローラは、クロール後に、Apache Hive、Presto、Spark などの他の外部テクノロジーに準拠するために特定のテーブルメタデータを自動的に割り当てます。時折、このクローラが割り当てるメタデータプロパティが正しくないことがあります。正しくないプロパティは、Athena でテーブルをクエリする前に、AWS Glue で手動で修正してください。詳細については、「AWS Glue デベロッパーガイド」の「[テーブルの詳細の表示と編集](https://docs.aws.amazon.com/glue/latest/dg/console-tables.html#console-tables-details)」を参照してください。

CSV ファイルの各データフィールドが引用符で囲まれている場合、AWS Glue は `serializationLib` プロパティを誤解してメタデータの割り当てを間違える場合があります。詳細については、「[引用符で囲まれた CSV データの処理](schema-csv.md#schema-csv-quotes)」を参照してください。

# クローラーで複数のデータソースを使用する
<a name="schema-crawlers-data-sources"></a>

AWS Glue クローラが Amazon S3 をスキャンして複数のディレクトリを検出すると、ヒューリスティックを使用してテーブルのルートがディレクトリ構造内のどこにあり、どのディレクトリがテーブルのパーティションであるかを判断します。複数のディレクトリで同様のスキーマが検出されると、クローラは、これらを個別のテーブルではなくパーティションとみなす場合があります。クローラで個別のテーブルを検出しやすくするには、1 つの方法として各テーブルのルートディレクトリをクローラのデータストアとして追加します。

以下の Amazon S3 のパーティションは、その一例です。

```
s3://amzn-s3-demo-bucket/folder1/table1/partition1/file.txt
s3://amzn-s3-demo-bucket/folder1/table1/partition2/file.txt
s3://amzn-s3-demo-bucket/folder1/table1/partition3/file.txt
s3://amzn-s3-demo-bucket/folder1/table2/partition4/file.txt
s3://amzn-s3-demo-bucket/folder1/table2/partition5/file.txt
```

`table1` と `table2` のスキーマが類似し、AWS Glue のデータソースが `s3://amzn-s3-demo-bucket/folder1/` に対して 1 つのみ設定されている場合、クローラは 1 つのテーブルを 2 つのパーティション列で作成することがあります。1 つのパーティション列に `table1` と `table2` が入り、別のパーティション列に `partition1`〜`partition5` が入ります。

AWS Glue クローラで 2 つのテーブルを別個に作成するには、クローラに 2 つのデータソース (`s3://amzn-s3-demo-bucket/folder1/table1/` と `s3://amzn-s3-demo-bucket/folder1/table2`) を設定します。以下に手順を示します。

**AWS Glue で既存のクローラーに S3 データストアを追加するには**

1. AWS マネジメントコンソール にサインインし、AWS Glue コンソール ([https://console.aws.amazon.com/glue/](https://console.aws.amazon.com/glue/)) を開きます。

1. ナビゲーションペインで、[**Crawlers (クローラ) **] を選択します。

1. クローラーへのリンクを選択してから、[**編集**] を選択します。

1. [**ステップ 2: データソースと分類子を選択する**] で、[**編集**] を選択します。

1. **[データソースとカタログ]** で、**[データソースを追加]** を選択します。

1. [**Add data source**] (データソースの追加) ダイアログボックスの [**S3 path**] (S3 パス) で、[**Browse**] (ブラウズ) を選択します。

1. 使用したいバケットを選択し、[**Choose**] (選択) を選択します。

   追加したデータソースは、[**Data sources** ] (データソース) リストに表示されます。

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

1. [**Configure security settings**] (セキュリティ設定の構成) ページで、クローラーの IAM ロールを選択してから、[**Next**] (次へ) を選択します。

1. S3 パスの末尾がスラッシュで終わっていることを確認し、[**Add an S3 data source**] (S3 データソースの追加) を選択します。

1. [**Set output and scheduling**] (出力とスケジュールの設定) ページの、[**Output configuration**] (出力の設定) で、ターゲットデータベースを選択します。

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

1. [**Review and update**] (確認と更新) ページで、選択した内容を確認します。ステップを編集するには、[**Edit**] (編集) を選択します。

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

# クローラーをスケジュールして、AWS Glue Data Catalog と Amazon S3 の同期を保つ
<a name="schema-crawlers-schedule"></a>

AWS Glue クローラは、スケジュールに従って実行するか、オンデマンドで実行するように設定できます。詳細については、「AWS Glue デベロッパーガイド」の「[ジョブとクローラの時間ベースのスケジュール](https://docs.aws.amazon.com/glue/latest/dg/monitor-data-warehouse-schedule.html)」を参照してください。

パーティションテーブルのデータが定時に着信する場合は、スケジュールに従って実行するように AWS Glue クローラを設定し、テーブルのパーティションを検出して更新できます。これにより、時間と費用がかかる可能性がある `MSCK REPAIR` コマンドを実行したり、`ALTER TABLE ADD PARTITION` コマンドの手動で実行したりする必要がなくなります。詳細については、「AWS Glue デベロッパーガイド」の「[テーブルパーティション](https://docs.aws.amazon.com/glue/latest/dg/tables-described.html#tables-partition)」を参照してください。

# AWS Glue パーティションのインデックス作成とフィルタリングでクエリを最適化する
<a name="glue-best-practices-partition-index"></a>

Athena は、パーティション分割されたテーブルに対しクエリを実行する際、クエリに関連するサブセットに使用可能なテーブルパーティションの取得とフィルタリングを行います。新しいデータとパーティションが追加されると、パーティションの処理に時間がかかり、クエリの実行時間が長くなる可能性があります。時間の経過とともに多数のテーブルが増加するパーティションの場合は、AWS Glue パーティションのインデックス作成とフィルタリングを使用することを検討してください。パーティションのインデックス作成により、Athena によるパーティション処理が最適化され、高度にパーティション化されたテーブルでのクエリパフォーマンスを向上させることができます。テーブルのプロパティでのパーティションフィルタリングの設定は、以下 2 つのステップで行います。

1. AWS Glue でのパーティションインデックスの作成。

1. テーブルのパーティションフィルタリングの有効化。

## パーティションインデックスの作成
<a name="glue-best-practices-partition-index-creating"></a>

AWS Glue でのパーティションインデックス作成のステップについては、「AWS Glue デベロッパーガイド」の「[パーティションインデックスの使用](https://docs.aws.amazon.com/glue/latest/dg/partition-indexes.html)」を参照してください。AWS Glue でのパーティションインデックスの制限については、同じページの「[パーティションインデックスについて](https://docs.aws.amazon.com/glue/latest/dg/partition-indexes.html#partition-index-1)」セクションを参照してください。

## パーティションフィルタリングの有効化
<a name="glue-best-practices-partition-filtering-enabling"></a>

テーブルのパーティションフィルタリングを有効にするには、AWS Glue で新しくテーブルのプロパティを設定する必要があります。AWS Glue でテーブルプロパティを設定する方法については、「[パーティション射影のセットアップ](https://docs.aws.amazon.com/athena/latest/ug/partition-projection-setting-up.html)」ページを参照してください。AWS Glue でテーブルの詳細設定を編集する際、**[Table properties]** (テーブルのプロパティ) セクションに、以下のキーと値のペアを追加します。
+ **[Key]** (キー) に `partition_filtering.enabled` を追加します。
+ **[Value]** (値) に `true` を追加します。

値 `partition_filtering.enabled` に `false` を設定することで、このテーブルのパーティションフィルタリングをいつでも無効にすることができます。

上記の各ステップを完了したら、Athena コンソールに戻ってデータをクエリできます。

パーティションのインデックス作成のフィルタリングの使用の詳細については、*AWS Big Data Blog* の「[Improve Amazon Athena query performance using AWS Glue Data Catalog partition indexes](https://aws.amazon.com/blogs/big-data/improve-amazon-athena-query-performance-using-aws-glue-data-catalog-partition-indexes/)」を参照してください。

# AWS CLI を使用して AWS Glue データベースとそのテーブルを再度作成する
<a name="glue-recreate-db-and-tables-cli"></a>

AWS Glue データベースの名前を直接変更することはできませんが、その定義をコピーして定義を変更し、その定義を使用してデータベースを別の名前で再度作成することができます。同様に、古いデータベースのテーブルの定義をコピーして、その定義を変更し、変更した定義を使用して新しいデータベースにテーブルを再度作成することができます。

**注記**  
 ここで示した方法では、テーブルのパーティショニングはコピーされません。

次の Windows での手順では、お客様の AWS CLI に JSON 出力が設定されていることを前提としています。AWS CLI のデフォルトの出力形式を変更するには、`aws configure` を実行します。

**AWS CLI を使用して AWS Glue データベースをコピーする方法**

1. コマンドプロンプトで次の AWS CLI コマンドを実行し、コピーする AWS Glue データベースの定義を取得します。

   ```
   aws glue get-database --name database_name
   ```

   `get-database` コマンドの詳細については、「[get-database](https://awscli.amazonaws.com/v2/documentation/api/latest/reference/glue/get-database.html)」を参照してください。

1. JSON 出力を、新しいデータベースの名前が付けられたファイル (例: `new_database_name.json`) としてデスクトップに保存します。

1. テキストエディタで `new_database_name.json` ファイルを開きます。

1. JSON ファイルで以下の手順を実行します。

   1. 外側の `{ "Database":` エントリと、ファイルの最後にある対応する閉じ括弧 `}` を削除します。

   1. `Name` エントリを新しいデータベース名に変更します。

   1. `CatalogId` フィールドを削除します。

1. ファイルを保存します。

1. コマンドプロンプトで次の AWS CLI コマンドを実行し、変更したデータベース定義ファイルを使用して、新しい名前でデータベースを作成します。

   ```
   aws glue create-database --database-input "file://~/Desktop\new_database_name.json"
   ```

   `create-database` コマンドの詳細については、「[create-database](https://awscli.amazonaws.com/v2/documentation/api/latest/reference/glue/create-database.html)」を参照してください。ファイルから AWS CLI パラメータを読み込む方法の詳細については、「AWS Command Line Interface ユーザーガイド」の「[ファイルから AWS CLI パラメータを読み込む](https://docs.aws.amazon.com/cli/latest/userguide/cli-usage-parameters-file.html)」を参照してください。

1. 新しいデータベースが AWS Glue に作成されたことを確認するには、次のコマンドを実行します。

   ```
   aws glue get-database --name new_database_name
   ```

これで、新しいデータベースにコピーするテーブルの定義を取得し、定義を変更して、変更した定義を使用して新しいデータベースにテーブルを再度作成する準備ができました。この手順でテーブル名は変更されません。

**AWS CLI を使用して AWS Glue テーブルをコピーする方法**

1. コマンドプロンプトで、次の AWS CLI コマンドを実行します。

   ```
   aws glue get-table --database-name database_name --name table_name
   ```

   `get-table` コマンドの詳細については、「[get-table](https://awscli.amazonaws.com/v2/documentation/api/latest/reference/glue/get-table.html)」を参照してください。

1. JSON 出力を、テーブルの名前が付けられたファイル (例: *table\$1name*.json) として Windows デスクトップに保存します。

1. テキストエディタで ファイルを開きます。

1. JSON ファイルで、外部 `{"Table": ` エントリとファイルの最後にあるそれに対応する閉じ括弧 `}` を削除します。

1. JSON ファイルで、次のエントリとその値を削除します。
   + `DatabaseName` — `create-table` CLI コマンドは `--database-name` パラメータを使用するため、このエントリは必要ありません。
   + `CreateTime`
   + `UpdateTime`
   + `CreatedBy`
   + `IsRegisteredWithLakeFormation`
   + `CatalogId`
   + `VersionId`

1. テーブル定義ファイルを保存します。

1. コマンドプロンプトで次の AWS CLI コマンドを実行し、新しいデータベースにテーブルを再度作成します。

   ```
   aws glue create-table --database-name new_database_name --table-input "file://~/Desktop\table_name.json"     
   ```

   `create-table` コマンドの詳細については、「[create-table](https://awscli.amazonaws.com/v2/documentation/api/latest/reference/glue/create-table.html)」を参照してください。

   これで、テーブルが AWS Glue の新しいデータベースに表示され、Athena からクエリできるようになりました。

1. 手順を繰り返して、追加する各テーブルを AWS Glue の新しいデータベースにコピーします。

# ETL ジョブのテーブルを作成する
<a name="schema-classifier"></a>

Athena を使用して、AWS Glue が ETL ジョブに使用できるテーブルを作成できます。AWS Glue ジョブは ETL オペレーションを実行します。AWS Glue ジョブは、ソースからデータを抽出し、そのデータを変換してターゲット内にロードするためのスクリプトを実行します。詳細については、[AWS デベロッパーガイド](https://docs.aws.amazon.com/glue/latest/dg/author-job-glue.html)の「*AWS Glue Glue でのジョブの作成*」を参照してください。

## AWS Glue ETL ジョブ用の Athena テーブルの作成
<a name="schema-etl-tables"></a>

Athena 内で作成するテーブルには、データの形式を識別する `classification` と呼ばれるテーブルプロパティが追加されている必要があります。これにより、AWS Glue はテーブルを ETL ジョブに使用できます。分類値は `avro`、`csv`、`json`、`orc`、`parquet` または `xml` です。Athena での `CREATE TABLE` ステートメントの例は、以下のとおりです。

```
CREATE EXTERNAL TABLE sampleTable (
  column1 INT,
  column2 INT
  ) STORED AS PARQUET
  TBLPROPERTIES (
  'classification'='parquet')
```

`classification` テーブルプロパティは、テーブルの作成時に追加しなかった場合、AWS Glue コンソールを使用して追加できます。

**AWS Glue コンソールを使用して分類テーブルプロパティを追加するには**

1. AWS マネジメントコンソール にサインインし、AWS Glue コンソール ([https://console.aws.amazon.com/glue/](https://console.aws.amazon.com/glue/)) を開きます。

1. コンソールのナビゲーションペインで、[**Tables**] (テーブル) を選択します。

1. 編集するテーブルのリンクを選択した後、**[Action]** (アクション)、**[Edit table]** (テーブルの編集) の順に選択します。

1. [**Table properties**] (テーブルプロパティ) セクションまで、下にスクロールします。

1. **[Add]** (追加) を選択します。

1. **[Key]** (キー) に「**classification**」と入力します。

1. [**Value**] (値) に、データタイプを入力します（例:**json**)。

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

   [**Table details**] (テーブルの詳細) セクションで、入力したデータタイプがテーブルの [**Classification**] (分類) フィールドに表示されます。

詳細については、「AWS Glue デベロッパーガイド」の「[テーブルの使用](https://docs.aws.amazon.com/glue/latest/dg/console-tables.html)」を参照してください。

## ETL ジョブを使用してクエリパフォーマンスを最適化する
<a name="schema-etl-performance"></a>

AWS Glue ジョブは、Athena でのクエリパフォーマンスが最適化されるような形式にデータを変換するのに役立ちます。データの形式は、Athena でのクエリパフォーマンスとクエリコストに大きな影響を及ぼします。

AWS Glue は、Parquet および ORC データ形式への書き込みをサポートしています。この機能を使用して、Athena で利用するためにデータを変換できます。Parquet と ORC の使用、および Athena でパフォーマンスを改善する他の方法の詳細については、「[Amazon Athena のパフォーマンスチューニング Tips トップ 10](https://aws.amazon.com/blogs/big-data/top-10-performance-tuning-tips-for-amazon-athena/)」を参照してください。

**注記**  
Athena が AWS Glue ETL ジョブによって生成された `SMALLINT` および `TINYINT` データ型を読み取れなくなる可能性を低くするには、データを ORC に変換する ETL ジョブを作成する際に `SMALLINT` と `TINYINT` を `INT` に変換します。

## ETL のために AWS Glue ジョブを自動化する
<a name="schema-etl-automate"></a>

AWS Glue ETL ジョブは、トリガーに基づいて自動的に実行するように設定できます。この機能は、AWS 外からのデータが、Athena でのクエリのために最適とは言えない形式で Amazon S3 バケットにプッシュされている場合に適しています。詳細については、「AWS Glue デベロッパーガイド」の「[AWS Glue ジョブのトリガー](https://docs.aws.amazon.com/glue/latest/dg/trigger-job.html)」を参照してください。

# AWS Glue で CSV データを使用する
<a name="schema-csv"></a>

このページでは、AWS Glue を使用して、各列のデータ値を引用符で囲んだ CSV ファイルまたはヘッダー値を含む CSV ファイルからスキーマを作成する方法について説明します。

## 引用符で囲まれた CSV データの処理
<a name="schema-csv-quotes"></a>

次の例のように、CSV ファイルに二重引用符で囲まれたデータフィールドがあるとします。

```
"John","Doe","123-555-1231","John said \"hello\""
"Jane","Doe","123-555-9876","Jane said \"hello\""
```

引用符で囲まれた値を持つ CSV ファイルから作成されたテーブルに対して Athena でクエリを実行するには、AWS Glue で、OpenCSVSerDe を使用するようにテーブルプロパティを変更する必要があります。OpenCSV SerDe の詳細については、「[CSV を処理するための Open CSV SerDe](csv-serde.md)」を参照してください。

**AWS Glue コンソールでテーブルプロパティを編集するには**

1. AWS Glue コンソールのナビゲーションペインで、[**テーブル**] を選択します。

1. 編集するテーブルのリンクを選択した後、**[Action]** (アクション)、**[Edit table]** (テーブルの編集) の順に選択します。

1. [**Edit table**] (テーブルを編集) ページで、以下の変更を行います。
   + [**Serialization lib**] (シリアル化ライブラリ) には `org.apache.hadoop.hive.serde2.OpenCSVSerde` を入力します。
   + **[Serde parameters]** (Serde パラメータ) には、`escapeChar`、`quoteChar`、および `separatorChar` の各キーに以下の値を入力します。
     + `escapeChar` には、バックスラッシュ (**\$1**) を入力します。
     + `quoteChar` には、二重引用符 (**"**) を入力します。
     + `separatorChar` には、カンマ (**,**) を入力します。

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

詳細については、「AWS Glue デベロッパーガイド」の「[テーブルの詳細の表示と編集](https://docs.aws.amazon.com/glue/latest/dg/console-tables.html#console-tables-details)」を参照してください。

AWS Glue テーブルプロパティをプログラムで更新することもできます。次の JSON 例にあるように、テーブル定義内の `SerDeInfo` ブロックを変更するために、AWS Glue の [UpdateTable](https://docs.aws.amazon.com/glue/latest/webapi/API_UpdateTable.html) API オペレーション、または [update-table](https://docs.aws.amazon.com/cli/latest/reference/glue/update-table.html) AWS CLI コマンドを使用します。

```
"SerDeInfo": {
   "name": "",
   "serializationLib": "org.apache.hadoop.hive.serde2.OpenCSVSerde",
   "parameters": {
      "separatorChar": ","
      "quoteChar": "\""
      "escapeChar": "\\"
      }
},
```

## ヘッダーを使用した CSV ファイルの処理
<a name="schema-csv-headers"></a>

`CREATE TABLE` ステートメントを使用して Athena でテーブルを定義するときは、以下の例にあるように、`skip.header.line.count` テーブルプロパティを使用して CSV データ内のヘッダーを無視することができます。

```
...
STORED AS TEXTFILE
LOCATION 's3://amzn-s3-demo-bucket/csvdata_folder/';
TBLPROPERTIES ("skip.header.line.count"="1")
```

または、CSV のヘッダーを事前に削除して、ヘッダー情報が Athena のクエリ結果に含まれないようにすることもできます。そのためには、1 つの方法として AWS Glue ジョブを使用して ETL (抽出、変換、ロード) スクリプトを実行します。必要なスクリプトは、AWS Glue で PySpark Python ダイアレクトの拡張言語を使用して作成できます。詳細については、AWS Glue デベロッパーガイドの「[AWS Glue でのジョブの作成](https://docs.aws.amazon.com/glue/latest/dg/author-job-glue.html)」を参照してください。

次の例に示す AWS Glue スクリプトの関数では、`from_options` を使用して動的フレームを作成し、`writeHeader` フォーマットオプションを false に設定することで、ヘッダー情報を削除しています。

```
glueContext.write_dynamic_frame.from_options(frame = applymapping1, connection_type = "s3", connection_options = {"path": "s3://amzn-s3-demo-bucket/MYTABLEDATA/"}, format = "csv", format_options = {"writeHeader": False}, transformation_ctx = "datasink2")
```

# AWS Glue で地理空間データを使用する
<a name="schema-geospatial"></a>

AWS Glue は、Well-known Text (WKT)、Well-Known Binary (WKB)、またはその他の PostGIS データ型をネイティブにサポートしていません。AWS Glue 分類子は地理空間データを解析し、CSV 用の `varchar` など、形式でサポートされているデータ型を使用して分類します。他の AWS Glue テーブルと同様に、Athena がこれらのデータ型をそのまま解析できるよう、地理空間データから作成されたテーブルのプロパティ更新が必要になる場合があります。詳細については、「[クローラーを使用してテーブルを追加する](schema-crawlers.md)」および「[AWS Glue で CSV データを使用する](schema-csv.md)」を参照してください。Athena は、AWS Glue テーブルの一部の地理空間データ型をそのまま解析できない場合があります。Athena での地理空間データの操作の詳細については、「[地理空間データをクエリする](querying-geospatial-data.md)」を参照してください。