

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

# Amazon Athena を使用して SQL でファイルをクエリする
<a name="tutorial-query-data-with-athena"></a>

エンタープライズシステムは、NFS または SMB ファイル共有に向かうログエクスポート、トランザクション抽出、インベントリスナップショット、システム間ファイルドロップなどのファイルベースの出力を頻繁に生成します。

Amazon S3 アクセスポイントを FSx for ONTAP ボリュームにアタッチすると、Amazon Athena は所定のファイルにクエリを実行します。アプリケーションとユーザーは、常に NFS または SMB 経由でボリュームに書き込んでおり、アナリストはアクセスポイントを介してそのデータに対して標準 SQL を実行します。FSx for ONTAP ボリュームには NFS、SMB、Amazon S3 API から同時にアクセスできるため、同じファイルを 1 つのプロトコルで生成し、コピーなしで別のプロトコルで使用できます。

このチュートリアルでは、Amazon S3 アクセスポイントを介して FSx for ONTAP ボリュームにサンプルデータセットをアップロードし、 に登録して AWS Glue Data Catalog、Amazon Athena でクエリを実行します。

**注記**  
このチュートリアルの所要時間は約 **20～30 分**です。 AWS のサービス 使用する には、作成したリソースの料金が発生します。**クリーンアップ**セクションを含むすべてのステップをすぐに完了すると、米国東部 (バージニア北部) の予想コストは **1 USD** 未満になります AWS リージョン。この見積もりには、FSx for ONTAP ボリューム自体の継続的な料金は含まれません。

## 前提条件
<a name="tutorial-athena-prerequisites"></a>

作業を開始する前に、次の項目があることを確認します。
+ Amazon S3 アクセスポイントがアタッチされた FSx for ONTAP ボリューム。 Amazon S3 アクセスポイントには**インターネット**ネットワークオリジンが必要です。アクセスポイントの作成手順については、「」を参照してください[アクセスポイントの作成](fsxn-creating-access-points.md)。
+ クエリ結果の場所で設定された Athena ワークグループ。Athena はクエリ結果を FSx for ONTAP ボリュームではなく Amazon S3 バケットに書き込みます。ワークグループがない場合は、`primary`ワークグループを使用して、**Athena** コンソールの設定で結果の場所を設定できます。詳細については、*Amazon Athena ユーザーガイド*[」の「ワークグループの管理](https://docs.aws.amazon.com/athena/latest/ug/workgroups-create-update-delete.html)」を参照してください。
+ `AWSGlueServiceRole` マネージドポリシーがアタッチ AWS Glue された の IAM ロールと、Amazon S3 アクセスポイントへのアクセスを許可するインラインポリシー。持っていない場合は、次の手順を実行します。

  1. 次の信頼ポリシーを として保存します`glue-trust-policy.json`。これにより、 AWS Glue はロールを引き受けることができます。

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

  1. 次のアクセス許可ポリシーを として保存します`glue-s3-policy.json`。アクセスポイントへのアクセスを許可します。`{{region}}`、`{{account-id}}`、 を自分の値`{{access-point-name}}`に置き換えます。

     ```
     {
         "Version": "2012-10-17", 		 	 	 
         "Statement": [
             {
                 "Effect": "Allow",
                 "Action": [
                     "s3:GetObject",
                     "s3:ListBucket"
                 ],
                 "Resource": [
                     "arn:aws:s3:{{region}}:{{account-id}}:accesspoint/{{access-point-name}}",
                     "arn:aws:s3:{{region}}:{{account-id}}:accesspoint/{{access-point-name}}/object/*"
                 ]
             }
         ]
     }
     ```

  1. ロールを作成し、ポリシーをアタッチします。

     ```
     $ aws iam create-role \
         --role-name {{fsxn-tutorial-glue-role}} \
         --assume-role-policy-document file://glue-trust-policy.json
     
     aws iam attach-role-policy \
         --role-name {{fsxn-tutorial-glue-role}} \
         --policy-arn arn:aws:iam::aws:policy/service-role/AWSGlueServiceRole
     
     aws iam put-role-policy \
         --role-name {{fsxn-tutorial-glue-role}} \
         --policy-name s3-access-point-policy \
         --policy-document file://glue-s3-policy.json
     ```
+ Athena クエリを実行し、 AWS Glue データカタログにアクセスするための IAM アクセス許可。

**重要**  
Amazon S3 アクセスポイントはインターネットネットワークオリジンを使用する必要があります。Athena は、VPC からではなく、マネージドインフラストラクチャから Amazon S3 にアクセスします。VPC ネットワークオリジンを持つアクセスポイントは、Athena からのリクエストを拒否します。

## ステップ 1: サンプルデータを FSx for ONTAP ボリュームにアップロードする
<a name="tutorial-athena-upload-data"></a>

このチュートリアルでは、ニューヨーク市のタクシー旅行の公開データセットである [NYC Taxi and Limousine Commission (TLC) Trip Record Data](https://www.nyc.gov/site/tlc/about/tlc-trip-record-data.page) を使用します。データは、Athena が効率的にクエリできる列形式である Apache Parquet 形式です。

1 か月分の黄色のタクシー旅行データをダウンロードし、Amazon S3 アクセスポイントを介して FSx for ONTAP ボリュームにアップロードします。

```
$ curl -O https://d37ci6vzurychx.cloudfront.net/trip-data/yellow_tripdata_2024-01.parquet
```

アクセスポイントエイリアスを使用して、FSx for ONTAP ボリュームにファイルをアップロードします。をアクセスポイントエイリアス`{{my-ap-alias-ext-s3alias}}`に置き換えます。

```
$ aws s3 cp yellow_tripdata_2024-01.parquet \
    s3://{{my-ap-alias-ext-s3alias}}/taxi-data/yellow_tripdata_2024-01.parquet
```

アクセスポイントを介してファイルにアクセスできることを確認します。

```
$ aws s3 ls s3://{{my-ap-alias-ext-s3alias}}/taxi-data/
2024-01-23 02:18:13   49961641 yellow_tripdata_2024-01.parquet
```

## ステップ 2: でデータベースを作成する AWS Glue Data Catalog
<a name="tutorial-athena-create-database"></a>

テーブルメタデータを保持するデータベース AWS Glue Data Catalog を に作成します。 AWS Glue コンソール、Athena クエリエディタ、または を使用してデータベースを作成できます AWS CLI。

**AWS Glue console**

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

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

1. **[Add database]** (データベースの追加) を選択します。

1. **[Name]** (名前) に「`{{fsxn_taxi_demo}}`」と入力します。

1. **[データベースの作成]** を選択します。

**Athena クエリエディタまたは AWS CLI**

```
$ aws athena start-query-execution \
    --query-string "CREATE DATABASE IF NOT EXISTS {{fsxn_taxi_demo}}" \
    --work-group {{primary}}
```

## ステップ 3: にデータを登録する AWS Glue Data Catalog
<a name="tutorial-athena-register-data"></a>

Athena では AWS Glue 、クローラ (推奨) または手動`CREATE EXTERNAL TABLE`ステートメントを使用してデータを登録できます。

### オプション A: AWS Glue クローラを使用する (推奨)
<a name="tutorial-athena-glue-crawler"></a>

 AWS Glue クローラはデータのスキーマを自動的に検出し、 にテーブルを作成します AWS Glue Data Catalog。クローラは Parquet ファイルメタデータから正しい列タイプを推測するため、これは推奨されるアプローチです。

1. アクセスポイントエイリアスを指すクローラを作成します。をアクセスポイントエイリアス`{{my-ap-alias-ext-s3alias}}`に、 を IAM ロールの ARN AWS Glue `{{my-glue-role-arn}}`に置き換えます。

   ```
   $ aws glue create-crawler \
       --name {{fsxn-taxi-crawler}} \
       --role {{my-glue-role-arn}} \
       --database-name {{fsxn_taxi_demo}} \
       --targets '{"S3Targets": [{"Path": "s3://{{my-ap-alias-ext-s3alias}}/taxi-data/"}]}'
   ```

1.  クローラーを実行します。

   ```
   $ aws glue start-crawler --name {{fsxn-taxi-crawler}}
   ```

1. クローラのステータスを確認します。通常、クローラは 1～2 分で完了します。

   ```
   $ aws glue get-crawler --name {{fsxn-taxi-crawler}} \
       --query "Crawler.{State:State,Status:LastCrawl.Status}"
   ```

   クローラが終了すると、状態は `READY`で、ステータスは です`SUCCEEDED`。クローラは、`fsxn_taxi_demo`データベースに `taxi_data` (フォルダ名から派生した) という名前のテーブルを作成します。

### オプション B: Athena でテーブルを手動で作成する
<a name="tutorial-athena-manual-ddl"></a>

データのスキーマが既にわかっている場合は、 `CREATE EXTERNAL TABLE`ステートメントを使用して Athena でテーブルを直接作成できます。`LOCATION` 句でアクセスポイントエイリアスを使用します。

```
CREATE EXTERNAL TABLE fsxn_taxi_demo.yellow_taxi_trips (
    VendorID bigint,
    tpep_pickup_datetime timestamp,
    tpep_dropoff_datetime timestamp,
    passenger_count bigint,
    trip_distance double,
    RatecodeID bigint,
    store_and_fwd_flag string,
    PULocationID bigint,
    DOLocationID bigint,
    payment_type bigint,
    fare_amount double,
    extra double,
    mta_tax double,
    tip_amount double,
    tolls_amount double,
    improvement_surcharge double,
    total_amount double,
    congestion_surcharge double,
    Airport_fee double
)
STORED AS PARQUET
LOCATION 's3://{{my-ap-alias-ext-s3alias}}/taxi-data/'
```

**注記**  
列タイプは、Parquet ファイル内のタイプと一致する必要があります。このデータセットでは、 `passenger_count`や などのフィールド`VendorID`は、 ではなく Parquet ファイルに `bigint` (INT64) として保存されます`double`。型が一致しない場合、Athena は`HIVE_BAD_DATA`エラーを返します。 AWS Glue クローラ (オプション A) を使用すると、クローラは正しいタイプを自動的に推測するため、この問題を回避できます。

## ステップ 4: データをクエリする
<a name="tutorial-athena-query-data"></a>

Athena クエリエディタを開くか、 を使用して AWS CLI FSx for ONTAP データに対して SQL クエリを実行します。次の例では、クローラ () AWS Glue によって作成されたテーブルを使用します`taxi_data`。テーブルを手動で作成した場合は、 を `taxi_data`に置き換えます`yellow_taxi_trips`。

**合計トリップをカウントし、平均を計算する**

```
SELECT
    COUNT(*) AS total_trips,
    ROUND(AVG(trip_distance), 2) AS avg_distance_miles,
    ROUND(AVG(total_amount), 2) AS avg_total_usd,
    ROUND(AVG(passenger_count), 1) AS avg_passengers
FROM fsxn_taxi_demo.taxi_data
```

出力の例:


| total\_trips | avg\_distance\_miles | avg\_total\_usd | avg\_passengers | 
| --- | --- | --- | --- | 
| 2964624 | 3.65 | 26.80 | 1.3 | 

**最も混雑した集荷時間を検索する**

```
SELECT
    HOUR(tpep_pickup_datetime) AS pickup_hour,
    COUNT(*) AS trip_count,
    ROUND(AVG(total_amount), 2) AS avg_fare
FROM fsxn_taxi_demo.taxi_data
GROUP BY HOUR(tpep_pickup_datetime)
ORDER BY trip_count DESC
LIMIT 5
```

**最も収益の高い集荷場所を見つける**

```
SELECT
    PULocationID AS pickup_location,
    COUNT(*) AS trip_count,
    ROUND(SUM(total_amount), 2) AS total_revenue
FROM fsxn_taxi_demo.taxi_data
GROUP BY PULocationID
ORDER BY total_revenue DESC
LIMIT 10
```

## 考慮事項
<a name="tutorial-athena-considerations"></a>
+ **読み取り専用アクセス。**Athena は、アクセスポイントを介して FSx for ONTAP ボリュームからデータを読み取ります。Athena クエリ結果は、FSx for ONTAP ボリュームに戻るのではなく、Amazon S3 結果バケットに書き込まれます。
+ **インターネットオリジンが必要です。**Athena は、VPC 外のマネージドインフラストラクチャから Amazon S3 にアクセスします。`aws:SourceVpc` および `aws:SourceVpce`条件キーは、Athena リクエストでは使用できません。インターネットオリジンアクセスポイントを使用する必要があります。
+ **ファイル形式。**Athena は、Parquet、ORC、JSON、CSV、およびその他の形式をサポートしています。Parquet や ORC などの列形式は、Athena がクエリで参照される列のみを読み取るため、最適なクエリパフォーマンスを提供します。
+ **ファイルシステムのユーザーアクセス許可。**アクセスポイントに関連付けられたファイルシステムユーザーには、クエリ対象のファイルに対する読み取りアクセス許可が必要です。
+ **AWS Glue Data Catalog テーブルは再利用可能です。**にテーブルを登録すると AWS Glue Data Catalog、Amazon Redshift Spectrum、Amazon EMR AWS Glue Data Catalog、 AWS Glue ETL ジョブなど、 と統合されている他の AWS 分析サービスで使用できます。

## クリーンアップ
<a name="tutorial-athena-clean-up"></a>

継続的な課金を回避するには、このチュートリアルで作成したリソースを削除します。

1. Athena テーブルとデータベースを削除します。

   ```
   DROP TABLE IF EXISTS fsxn_taxi_demo.taxi_data;
   DROP TABLE IF EXISTS fsxn_taxi_demo.yellow_taxi_trips;
   DROP DATABASE IF EXISTS fsxn_taxi_demo CASCADE;
   ```

1.  AWS Glue クローラを削除します。

   ```
   $ aws glue delete-crawler --name {{fsxn-taxi-crawler}}
   ```

1. FSx for ONTAP ボリュームからサンプルデータを削除します。

   ```
   $ aws s3 rm s3://{{my-ap-alias-ext-s3alias}}/taxi-data/yellow_tripdata_2024-01.parquet
   ```