本文為英文版的機器翻譯版本,如內容有任何歧義或不一致之處,概以英文版為準。
您可以分割資料,以限制每個查詢所掃描的資料量,從而提高效能和降低成本。您可透過任何索引鍵來分割您的資料。常見做法是根據時間來分割資料,這通常會產生多層級的分割機制。例如,每小時都有資料傳入的客戶可能決定依年、月、日、小時來分割。另一個客戶的資料來自許多不同來源,且每天只載入一次,則可能依資料來源識別符和日期來分割。
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/
)。在 Athena 中,當在包含的資料表上執行folder
/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 Hive 一致。 -
如果您將 AWS Glue Data Catalog 與 Athena 搭配使用,請參閱每個帳戶AWS Glue 和每個資料表分割區上服務配額的端點和配額。
-
雖然 Athena 支援查詢具有 1,000 萬個分割區的 AWS Glue 資料表,但 Athena 無法在單一掃描中讀取超過 100 萬個分割區。在這種情況下,分割區索引可能有利。如需詳細資訊,請參閱 AWS 大數據部落格文章使用 AWS Glue Data Catalog 分割區索引改善 Amazon Athena 查詢效能
。
-
-
若要在使用 時請求增加分割區配額 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 樣式和非 Hive 樣式資料,以便在 Athena 中進行查詢。
在此案例中,分割區存放在 Amazon S3 中的單獨資料夾。例如,以下是 aws s3 ls
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 序列化程式-還原序列化程式,讀取存放在 Amazon S3 中的 JSON 資料。如需支援格式的詳細資訊,請參閱為您的資料選擇 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/ --recursive2016-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/plaintext/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 使用分割區投影。
其他資源
-
如需 Firehose 資料分割選項的詳細資訊,請參閱 Amazon Data Firehose 範例。
-
您可以使用 JDBC 驅動程式來自動新增分割區。
-
您可以使用 CTAS 和 INSERT INTO 來分割資料集。如需詳細資訊,請參閱使用 CTAS 和 INSERT INTO 進行 ETL 和資料分析。