

本文為英文版的機器翻譯版本，如內容有任何歧義或不一致之處，概以英文版為準。

# 使用 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 同時存取，因此一個通訊協定可以產生相同的檔案，而另一個無需複製即可使用。

在本教學課程中，您會透過 Amazon S3 存取點將範例資料集上傳至 FSx for ONTAP 磁碟區，在 中註冊 AWS Glue Data Catalog，然後向 Amazon Athena 查詢。

**注意**  
本教學課程大約需要 **20 到 30 分鐘**才能完成。 AWS 服務 使用的 會針對您建立的資源產生費用。如果您立即完成所有步驟，包括**清除**區段，美國東部 （維吉尼亞北部） 的預期成本不到 **1 美元**。 AWS 區域此預估不包含 FSx for ONTAP 磁碟區本身的持續費用。

## 先決條件
<a name="tutorial-athena-prerequisites"></a>

開始前，請確定您具有下列項目：
+ 連接 Amazon S3 存取點的 FSx for ONTAP 磁碟區。存取點必須具有**網際網路**原始伺服器。如需建立存取點的說明，請參閱[建立存取點](fsxn-creating-access-points.md)。
+ 使用查詢結果位置設定的 Athena 工作群組。Athena 會將查詢結果寫入 Amazon S3 儲存貯體，而不是 FSx for ONTAP 磁碟區。如果您沒有工作群組，您可以使用`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 Data Catalog 的 IAM 許可。

**重要**  
Amazon S3 存取點必須使用網際網路原始伺服器。Athena 會從受管基礎設施存取 Amazon S3，而不是從您的 VPC 存取。具有 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)，這是紐約市可公開取得的計程車行程資料集。資料採用 Apache Parquet 格式，這是 Athena 可以有效率地查詢的單欄格式。

下載一個月的黃色計程車行程資料，並透過 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 主控台**

1. 在 https：//[https://console.aws.amazon.com/glue/](https://console.aws.amazon.com/glue/) 開啟 AWS Glue 主控台。

1. 在導覽窗格中的資料**目錄**下，選擇**資料庫**。

1. 選擇**新增資料庫**。

1. 對於**名稱**，輸入 `{{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>

您可以使用 AWS Glue 爬蟲程式 （建議） 或 Athena 中的手動`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}}` 將 取代為您的存取點別名，並將 `{{my-glue-role-arn}}`取代為您的 IAM AWS Glue 角色的 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. 檢查爬蟲程式狀態。爬蟲程式通常會在一到兩分鐘內完成。

   ```
   $ 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`會以 `bigint`(INT64) 形式存放在 Parquet 檔案中，而不是 `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 查詢結果會寫入 Amazon S3 結果儲存貯體，而不是傳回 FSx for ONTAP 磁碟區。
+ **需要網際網路原始伺服器。**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，它可供與 整合的其他 AWS 分析服務使用 AWS Glue Data Catalog，例如 Amazon Redshift Spectrum、Amazon EMR 和 AWS Glue ETL 任務。

## 清除
<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
   ```