分割您的資料 - Amazon Athena

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

分割您的資料

您可以分割資料,以限制每個查詢所掃描的資料量,從而提高效能和降低成本。您可透過任何索引鍵來分割您的資料。常見做法是根據時間來分割資料,這通常會產生多層級的分割機制。例如,每小時都有資料傳入的客戶可能決定依年、月、日、小時來分割。另一個客戶的資料來自許多不同來源,且每天只載入一次,則可能依資料來源識別符和日期來分割。

Athena 可以使用 Apache Hive 樣式的分割區,其資料路徑包含由等號連接的鍵值對 (例如 country=us/...year=2021/month=01/day=26/...)。因此,路徑會包含分割區索引鍵的名稱,以及每個路徑所代表的值。若要將新的 Hive 分割區載入已分割的資料表,您可以使用 MSCK REPAIR TABLE 命令,其只適用於 Hive 樣式的分割區。

Athena 也可以使用非 Hive 樣式的分割區結構描述。例如, CloudTrail 記錄檔和 Firehose 傳送串流會針對日期部分使用不同的路徑元件,例如data/2021/01/26/us/6fc7845e.json。對於這類非 Hive 樣式的分割區,您可以使用 ALTER TABLE ADD PARTITION 手動新增分割區。

考量與限制

使用分割區時,請謹記以下幾點:

  • 若您查詢已分割的資料表並在 WHERE 子句中指定分割區,Athena 便只會掃描該分割區中的資料。

  • 如果您對 Amazon S3 儲存貯體發出具有大量物件的查詢,並且未將資料分割,這類查詢可能會影響 Amazon S3 中的 GET 請求率限制,並導致 Amazon S3 例外狀況。若要避免錯誤,請分割您的資料。此外,請考慮調校您的 Amazon S3 請求率。如需詳細資訊,請參閱最佳實務設計模式:最佳化 Amazon S3 效能

  • 要搭配 Athena 使用的分割區位置必須使用 s3 通訊協定 (例如,s3://amzn-s3-demo-bucket/folder/)。在 Athena 中,當在包含的資料表上執行 MSCK REPAIR TABLE 查詢時,使用其他通訊協定的位置 (例如 s3a://amzn-s3-demo-bucket/folder/) 會導致查詢失敗。

  • 請確定 Amazon S3 路徑是小寫而不是小駝峰式命名法 (camel case) (例如,userid 而非 userId)。如果 S3 路徑是小駝峰式命名法 (camel case),則 MSCK REPAIR TABLE 不會將分割區新增到 AWS Glue Data Catalog。如需詳細資訊,請參閱 MSCK REPAIR TABLE

  • 由於 MSCK REPAIR TABLE 會同時掃描資料夾及其子資料夾,以尋找相符的分割區配置,請務必將個別資料表的資料留在不同的資料夾階層中。例如,假設您在中有表格 1 的資料s3://amzn-s3-demo-bucket1,在中有表格 2 的資料s3://amzn-s3-demo-bucket1/table-2-data。如果兩個資料表都依字串分割,則MSCK REPAIR TABLE會將資料表 2 的分割區新增至資料表 1。為了避免這種情況,請s3://amzn-s3-demo-bucket2改用單獨的s3://amzn-s3-demo-bucket1文件夾結構。請注意,此行為與 Amazon EMR 和 Apache 蜂巢一致。

  • 如果您 AWS Glue Data Catalog 搭配 Athena 使用,請參閱每個帳戶和每個表格分割區的AWS Glue 端點和配額。

  • 若要在使用時要求增加分割區配額 AWS Glue Data Catalog,請造訪的 Service Quotas 主控台 AWS Glue

建立並載入包含分區資料的資料表

若要建立使用分割區的資料表,請在 CREATE TABLE 陳述式中使用 PARTITIONED BY 子句。PARTITIONED BY 子句定義對資料進行分割區的索引鍵,如下列範例所示。LOCATION 子句指定已分割的資料的根位置。

CREATE EXTERNAL TABLE users ( first string, last string, username string ) PARTITIONED BY (id string) STORED AS parquet LOCATION 's3://amzn-s3-demo-bucket'

建立資料表之後,您可以在分割區中載入要查詢的資料。對於 Hive 樣式的分割區,您可以執行 MSCK REPAIR TABLE。對於非 Hive 樣式的分割區,您可以使用 ALTER TABLE ADD PARTITION 手動新增分割區。

準備 Hive 樣式和非蜂巢樣式數據進行查詢

下列區段說明如何準備 Hive 樣式和非 Hive 樣式資料,以便在 Athena 中進行查詢。

在此案例中,分割區存放在 Amazon S3 中的單獨資料夾。例如,以下是 aws s3 ls 命令輸出的廣告曝光範例的部分清單,其中列出了指定字首下的 S3 物件:

aws s3 ls s3://elasticmapreduce/samples/hive-ads/tables/impressions/ PRE dt=2009-04-12-13-00/ PRE dt=2009-04-12-13-05/ PRE dt=2009-04-12-13-10/ PRE dt=2009-04-12-13-15/ PRE dt=2009-04-12-13-20/ PRE dt=2009-04-12-14-00/ PRE dt=2009-04-12-14-05/ PRE dt=2009-04-12-14-10/ PRE dt=2009-04-12-14-15/ PRE dt=2009-04-12-14-20/ PRE dt=2009-04-12-15-00/ PRE dt=2009-04-12-15-05/

在此,存放的日誌將欄名稱 (dt) 設為等於日期、小時和分鐘增量。當您指定父資料夾DDL的位置、結構描述和分割資料行的名稱時,Athena 可以查詢這些子資料夾中的資料。

建立資料表

若要從這項資料建立資料表,請沿著 'dt' 建立分割區,如下列 Athena DDL 陳述式所示:

CREATE EXTERNAL TABLE impressions ( requestBeginTime string, adId string, impressionId string, referrer string, userAgent string, userCookie string, ip string, number string, processId string, browserCookie string, requestEndTime string, timers struct<modelLookup:string, requestTime:string>, threadId string, hostname string, sessionId string) PARTITIONED BY (dt string) ROW FORMAT serde 'org.apache.hive.hcatalog.data.JsonSerDe' LOCATION 's3://elasticmapreduce/samples/hive-ads/tables/impressions/' ;

此表使用 Hive 的原生JSON序列化程式反序列化程式來讀取JSON存放在 Amazon S3 中的資料。如需支援格式的詳細資訊,請參閱 SerDe 為您的資料選擇

執行 MSCK REPAIR TABLE

在您執行 CREATE TABLE 查詢後,在 Athena 查詢編輯器中執行 MSCK REPAIR TABLE 命令以載入分割區,如下列範例所示。

MSCK REPAIR TABLE impressions

執行此命令後,即可對資料進行查詢。

查詢資料

使用分割區欄位查詢 impressions 資料表的資料。範例如下:

SELECT dt,impressionid FROM impressions WHERE dt<'2009-04-12-14-00' and dt>='2009-04-12-13-00' ORDER BY dt DESC LIMIT 100

此查詢應該會顯示類似下列的資料:

2009-04-12-13-20 ap3HcVKAWfXtgIPu6WpuUfAfL0DQEc 2009-04-12-13-20 17uchtodoS9kdeQP1x0XThKl5IuRsV 2009-04-12-13-20 JOUf1SCtRwviGw8sVcghqE5h0nkgtp 2009-04-12-13-20 NQ2XP0J0dvVbCXJ0pb4XvqJ5A4QxxH 2009-04-12-13-20 fFAItiBMsgqro9kRdIwbeX60SROaxr 2009-04-12-13-20 V4og4R9W6G3QjHHwF7gI1cSqig5D1G 2009-04-12-13-20 hPEPtBwk45msmwWTxPVVo1kVu4v11b 2009-04-12-13-20 v0SkfxegheD90gp31UCr6FplnKpx6i 2009-04-12-13-20 1iD9odVgOIi4QWkwHMcOhmwTkWDKfj 2009-04-12-13-20 b31tJiIA25CK8eDHQrHnbcknfSndUk

在下列範例中,aws s3 ls命令會顯示存放在 Amazon S3 中的ELB日誌。請注意,資料配置如何不使用 key=value 對,因此不屬於 Hive 格式。(aws s3 ls 命令的 --recursive 選項指定列出指定目錄或字首下的所有檔案或物件。)

aws s3 ls s3://athena-examples-myregion/elb/plaintext/ --recursive 2016-11-23 17:54:46 11789573 elb/plaintext/2015/01/01/part-r-00000-ce65fca5-d6c6-40e6-b1f9-190cc4f93814.txt 2016-11-23 17:54:46 8776899 elb/plaintext/2015/01/01/part-r-00001-ce65fca5-d6c6-40e6-b1f9-190cc4f93814.txt 2016-11-23 17:54:46 9309800 elb/plaintext/2015/01/01/part-r-00002-ce65fca5-d6c6-40e6-b1f9-190cc4f93814.txt 2016-11-23 17:54:47 9412570 elb/plaintext/2015/01/01/part-r-00003-ce65fca5-d6c6-40e6-b1f9-190cc4f93814.txt 2016-11-23 17:54:47 10725938 elb/plaintext/2015/01/01/part-r-00004-ce65fca5-d6c6-40e6-b1f9-190cc4f93814.txt 2016-11-23 17:54:46 9439710 elb/plaintext/2015/01/01/part-r-00005-ce65fca5-d6c6-40e6-b1f9-190cc4f93814.txt 2016-11-23 17:54:47 0 elb/plaintext/2015/01/01_$folder$ 2016-11-23 17:54:47 9012723 elb/plaintext/2015/01/02/part-r-00006-ce65fca5-d6c6-40e6-b1f9-190cc4f93814.txt 2016-11-23 17:54:47 7571816 elb/plaintext/2015/01/02/part-r-00007-ce65fca5-d6c6-40e6-b1f9-190cc4f93814.txt 2016-11-23 17:54:47 9673393 elb/plaintext/2015/01/02/part-r-00008-ce65fca5-d6c6-40e6-b1f9-190cc4f93814.txt 2016-11-23 17:54:48 11979218 elb/plaintext/2015/01/02/part-r-00009-ce65fca5-d6c6-40e6-b1f9-190cc4f93814.txt 2016-11-23 17:54:48 9546833 elb/plaintext/2015/01/02/part-r-00010-ce65fca5-d6c6-40e6-b1f9-190cc4f93814.txt 2016-11-23 17:54:48 10960865 elb/plaintext/2015/01/02/part-r-00011-ce65fca5-d6c6-40e6-b1f9-190cc4f93814.txt 2016-11-23 17:54:48 0 elb/plaintext/2015/01/02_$folder$ 2016-11-23 17:54:48 11360522 elb/plaintext/2015/01/03/part-r-00012-ce65fca5-d6c6-40e6-b1f9-190cc4f93814.txt 2016-11-23 17:54:48 11211291 elb/plaintext/2015/01/03/part-r-00013-ce65fca5-d6c6-40e6-b1f9-190cc4f93814.txt 2016-11-23 17:54:48 8633768 elb/plaintext/2015/01/03/part-r-00014-ce65fca5-d6c6-40e6-b1f9-190cc4f93814.txt 2016-11-23 17:54:49 11891626 elb/plaintext/2015/01/03/part-r-00015-ce65fca5-d6c6-40e6-b1f9-190cc4f93814.txt 2016-11-23 17:54:49 9173813 elb/plaintext/2015/01/03/part-r-00016-ce65fca5-d6c6-40e6-b1f9-190cc4f93814.txt 2016-11-23 17:54:49 11899582 elb/plaintext/2015/01/03/part-r-00017-ce65fca5-d6c6-40e6-b1f9-190cc4f93814.txt 2016-11-23 17:54:49 0 elb/plaintext/2015/01/03_$folder$ 2016-11-23 17:54:50 8612843 elb/plaintext/2015/01/04/part-r-00018-ce65fca5-d6c6-40e6-b1f9-190cc4f93814.txt 2016-11-23 17:54:50 10731284 elb/plaintext/2015/01/04/part-r-00019-ce65fca5-d6c6-40e6-b1f9-190cc4f93814.txt 2016-11-23 17:54:50 9984735 elb/plaintext/2015/01/04/part-r-00020-ce65fca5-d6c6-40e6-b1f9-190cc4f93814.txt 2016-11-23 17:54:50 9290089 elb/plaintext/2015/01/04/part-r-00021-ce65fca5-d6c6-40e6-b1f9-190cc4f93814.txt 2016-11-23 17:54:50 7896339 elb/plaintext/2015/01/04/part-r-00022-ce65fca5-d6c6-40e6-b1f9-190cc4f93814.txt 2016-11-23 17:54:51 8321364 elb/plaintext/2015/01/04/part-r-00023-ce65fca5-d6c6-40e6-b1f9-190cc4f93814.txt 2016-11-23 17:54:51 0 elb/plaintext/2015/01/04_$folder$ 2016-11-23 17:54:51 7641062 elb/plaintext/2015/01/05/part-r-00024-ce65fca5-d6c6-40e6-b1f9-190cc4f93814.txt 2016-11-23 17:54:51 10253377 elb/plaintext/2015/01/05/part-r-00025-ce65fca5-d6c6-40e6-b1f9-190cc4f93814.txt 2016-11-23 17:54:51 8502765 elb/plaintext/2015/01/05/part-r-00026-ce65fca5-d6c6-40e6-b1f9-190cc4f93814.txt 2016-11-23 17:54:51 11518464 elb/plaintext/2015/01/05/part-r-00027-ce65fca5-d6c6-40e6-b1f9-190cc4f93814.txt 2016-11-23 17:54:51 7945189 elb/plaintext/2015/01/05/part-r-00028-ce65fca5-d6c6-40e6-b1f9-190cc4f93814.txt 2016-11-23 17:54:51 7864475 elb/plaintext/2015/01/05/part-r-00029-ce65fca5-d6c6-40e6-b1f9-190cc4f93814.txt 2016-11-23 17:54:51 0 elb/plaintext/2015/01/05_$folder$ 2016-11-23 17:54:51 11342140 elb/plaintext/2015/01/06/part-r-00030-ce65fca5-d6c6-40e6-b1f9-190cc4f93814.txt 2016-11-23 17:54:51 8063755 elb/plaintext/2015/01/06/part-r-00031-ce65fca5-d6c6-40e6-b1f9-190cc4f93814.txt 2016-11-23 17:54:52 9387508 elb/plaintext/2015/01/06/part-r-00032-ce65fca5-d6c6-40e6-b1f9-190cc4f93814.txt 2016-11-23 17:54:52 9732343 elb/plaintext/2015/01/06/part-r-00033-ce65fca5-d6c6-40e6-b1f9-190cc4f93814.txt 2016-11-23 17:54:52 11510326 elb/plaintext/2015/01/06/part-r-00034-ce65fca5-d6c6-40e6-b1f9-190cc4f93814.txt 2016-11-23 17:54:52 9148117 elb/plaintext/2015/01/06/part-r-00035-ce65fca5-d6c6-40e6-b1f9-190cc4f93814.txt 2016-11-23 17:54:52 0 elb/plaintext/2015/01/06_$folder$ 2016-11-23 17:54:52 8402024 elb/plaintext/2015/01/07/part-r-00036-ce65fca5-d6c6-40e6-b1f9-190cc4f93814.txt 2016-11-23 17:54:52 8282860 elb/plaintext/2015/01/07/part-r-00037-ce65fca5-d6c6-40e6-b1f9-190cc4f93814.txt 2016-11-23 17:54:52 11575283 elb/plaintext/2015/01/07/part-r-00038-ce65fca5-d6c6-40e6-b1f9-190cc4f93814.txt 2016-11-23 17:54:53 8149059 elb/plaintext/2015/01/07/part-r-00039-ce65fca5-d6c6-40e6-b1f9-190cc4f93814.txt 2016-11-23 17:54:53 10037269 elb/plaintext/2015/01/07/part-r-00040-ce65fca5-d6c6-40e6-b1f9-190cc4f93814.txt 2016-11-23 17:54:53 10019678 elb/plaintext/2015/01/07/part-r-00041-ce65fca5-d6c6-40e6-b1f9-190cc4f93814.txt 2016-11-23 17:54:53 0 elb/plaintext/2015/01/07_$folder$ 2016-11-23 17:54:53 0 elb/plaintext/2015/01_$folder$ 2016-11-23 17:54:53 0 elb/plaintext/2015_$folder$

執行 ALTER TABLE ADD PARTITION

因為資料不是 Hive 格式,您無法在建立資料表後,使用 MSCK REPAIR TABLE 命令將分割區新增至該資料表。相反,您可以使用 ALTER TABLE ADD PARTITION 命令以手動新增每個分割區。例如,要在以下位置載入資料:s3://athena-examples-myregion/ELB/明文/2015/01/01/,您可以運行以下查詢。請注意,每個 Amazon S3 資料夾不需要單獨的分割區資料欄,且分割區鍵值可與 Amazon S3 索引鍵不同。

ALTER TABLE elb_logs_raw_native_part ADD PARTITION (dt='2015-01-01') location 's3://athena-examples-us-west-1/elb/plaintext/2015/01/01/'

如果已具有分割區,您會收到 Partition already exists (分割區已存在) 錯誤。若要避免發生此錯誤,您可以使用 IF NOT EXISTS 子句。如需詳細資訊,請參閱ALTER TABLE ADD PARTITION。如需移除分割區,請使用 ALTER TABLE DROP PARTITION

考慮分割區投影

為了避免必須自行管理分割區,您可以使用分割區投影。分割區投影是高度已分割的資料表,其結構是提前已知的選項。在分割區投影中,分割區的值和位置是以您所設定的資料表屬性計算,而不是從中繼資料儲存庫所讀取到的來計算。因為記憶體中的計算是比遠端查詢更快,分割區投影的使用可以大幅減少查詢執行時間。

如需詳細資訊,請參閱搭配 Amazon Athena 使用分割區投影

其他資源