本文為英文版的機器翻譯版本,如內容有任何歧義或不一致之處,概以英文版為準。
使用 Amazon Athena 查詢具有 SQL 的檔案
企業系統經常產生以檔案為基礎的輸出:日誌匯出、交易擷取、庫存快照、系統間檔案捨棄,這些輸出會落在 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 磁碟區本身的持續費用。
先決條件
開始前,請確定您具有下列項目:
連接 Amazon S3 存取點的 FSx for ONTAP 磁碟區。存取點必須具有網際網路原始伺服器。如需建立存取點的說明,請參閱建立存取點。
使用查詢結果位置設定的 Athena 工作群組。Athena 會將查詢結果寫入 Amazon S3 儲存貯體,而不是 FSx for ONTAP 磁碟區。如果您沒有工作群組,您可以使用
primary工作群組,並在設定下的 Athena 主控台中設定結果位置。如需詳細資訊,請參閱《Amazon Athena 使用者指南》中的管理工作群組。連接
AWSGlueServiceRole受管政策 AWS Glue 的 IAM 角色,以及授予 Amazon S3 存取點存取權的內嵌政策。如果您沒有,請使用下列步驟。將下列信任政策儲存為
glue-trust-policy.json。它允許 AWS Glue 擔任該角色。{ "Version": "2012-10-17", "Statement": [ { "Effect": "Allow", "Principal": {"Service": "glue.amazonaws.com"}, "Action": "sts:AssumeRole" } ] }將下列許可政策儲存為
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/*" ] } ] }建立角色並連接政策。
$aws iam create-role \ --role-namefsxn-tutorial-glue-role\ --assume-role-policy-document file://glue-trust-policy.json aws iam attach-role-policy \ --role-namefsxn-tutorial-glue-role\ --policy-arn arn:aws:iam::aws:policy/service-role/AWSGlueServiceRole aws iam put-role-policy \ --role-namefsxn-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 磁碟區
本教學課程使用 NYC Taxi and Limousine Commission (TLC) Trip Record Data
下載一個月的黃色計程車行程資料,並透過 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
在 中建立資料庫 AWS Glue Data Catalog 以保留資料表中繼資料。您可以使用 AWS Glue 主控台、Athena 查詢編輯器或 建立資料庫 AWS CLI。
AWS Glue 主控台
在 https://https://console.aws.amazon.com/glue/
開啟 AWS Glue 主控台。 在導覽窗格中的資料目錄下,選擇資料庫。
選擇新增資料庫。
對於名稱,輸入
。fsxn_taxi_demo選擇建立資料庫。
Athena 查詢編輯器或 AWS CLI
$aws athena start-query-execution \ --query-string "CREATE DATABASE IF NOT EXISTSfsxn_taxi_demo" \ --work-groupprimary
步驟 3:在 中註冊資料 AWS Glue Data Catalog
您可以使用 AWS Glue 爬蟲程式 (建議) 或 Athena 中的手動CREATE EXTERNAL TABLE陳述式來註冊資料。
選項 A:使用 AWS Glue 爬蟲程式 (建議)
AWS Glue 爬蟲程式會自動探索資料的結構描述,並在 中建立資料表 AWS Glue Data Catalog。這是建議的方法,因為爬蟲程式會從 Parquet 檔案中繼資料推斷正確的資料欄類型。
建立指向存取點別名的爬蟲程式。
將 取代為您的存取點別名,並將my-ap-alias-ext-s3alias取代為您的 IAM AWS Glue 角色的 ARN。my-glue-role-arn$aws glue create-crawler \ --namefsxn-taxi-crawler\ --rolemy-glue-role-arn\ --database-namefsxn_taxi_demo\ --targets '{"S3Targets": [{"Path": "s3://my-ap-alias-ext-s3alias/taxi-data/"}]}'執行爬蟲程式。
$aws glue start-crawler --namefsxn-taxi-crawler檢查爬蟲程式狀態。爬蟲程式通常會在一到兩分鐘內完成。
$aws glue get-crawler --namefsxn-taxi-crawler\ --query "Crawler.{State:State,Status:LastCrawl.Status}"當爬蟲程式完成時,狀態為
READY,狀態為SUCCEEDED。爬蟲程式會在fsxn_taxi_demo資料庫中建立名為taxi_data(衍生自資料夾名稱) 的資料表。
選項 B:在 Athena 中手動建立資料表
如果您已經知道資料的結構描述,可以使用 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:查詢您的資料
開啟 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
考量事項
唯讀存取。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 任務。
清除
若要避免持續收費,請刪除您在本教學課程中建立的資源。
捨棄 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;刪除 AWS Glue 爬蟲程式。
$aws glue delete-crawler --namefsxn-taxi-crawler從 FSx for ONTAP 磁碟區刪除範例資料。
$aws s3 rm s3://my-ap-alias-ext-s3alias/taxi-data/yellow_tripdata_2024-01.parquet