本文為英文版的機器翻譯版本,如內容有任何歧義或不一致之處,概以英文版為準。
為資料表建立一或多個分割區欄。每個分割區由一或多個不同的欄名稱/值組合組成。每種指定的組合都會另外建立一個資料目錄,這樣可在某些情況下改善查詢效能。分割區的欄本身不存在於資料表的資料中,因此,如果您使用的分割區欄名稱和資料表中的欄名稱相同,就會發生錯誤。如需詳細資訊,請參閱分割您的資料。
在 Athena 中,資料表及其分割區必須使用相同的資料格式,但其結構描述可能不同。如需詳細資訊,請參閱使用分割區更新資料表。
如需有關 IAM 政策中所需資源層級許可的資訊 (包括 glue:CreatePartition
),請參閱《AWS Glue API 許可:動作和資源參考》以及 設定對 中資料庫和資料表的存取 AWS Glue Data Catalog。如需有關使用 Athena 時許可的疑難排解資訊,請參閱 對 Athena 中的問題進行故障診斷 主題的 許可 章節。
概要
ALTER TABLE table_name ADD [IF NOT EXISTS]
PARTITION
(partition_col1_name = partition_col1_value
[,partition_col2_name = partition_col2_value]
[,...])
[LOCATION 'location1']
[PARTITION
(partition_colA_name = partition_colA_value
[,partition_colB_name = partition_colB_value
[,...])]
[LOCATION 'location2']
[,...]
參數
當新增分割區時,您可以為分割區指定一或多個資料欄名稱/值組,以及該分割區的資料檔案所在的 Simple Storage Service (Amazon S3) 路徑。
- [IF NOT EXISTS]
-
如果已有相同定義的分割區,則會造成錯誤隱藏。
- PARTITION (partition_col_name = partition_col_value [,...])
-
使用您指定的資料欄名稱/值組合來建立分割區。只有當欄的資料類型是字串時,才需要以字串字元圍住
partition_col_value
。 - [LOCATION 'location']
-
指定目錄,將在其中存放先前陳述式定義的分割區。當資料使用 Hive 樣式分割 (
pk1=v1/pk2=v2/pk3=v3
) 時,LOCATION
子句為選用的。使用 Hive 樣式分割時,會從資料表的位置、分割區索引鍵名稱和分割區索引鍵值自動建構完整的 Amazon S3 URI。如需詳細資訊,請參閱分割您的資料。
考量事項
Amazon Athena 不會對您可以在單一 ALTER TABLE ADD PARTITION
DDL 陳述式中新增的分割區數量施加特定限制。不過,如果您需要新增大量分割區,請考慮將操作分成較小的批次,以避免潛在的效能問題。下列範例使用連續命令個別新增分割區,並使用 IF NOT EXISTS
來避免新增重複項目。
ALTER TABLE table_name
ADD IF NOT EXISTS PARTITION (ds='2023-01-01')
ALTER TABLE table_name
ADD IF NOT EXISTS PARTITION (ds='2023-01-02')
ALTER TABLE table_name
ADD IF NOT EXISTS PARTITION (ds='2023-01-03')
在 Athena 中使用分割區時,也請記住下列幾點:
-
雖然 Athena 支援查詢具有 1,000 萬個分割區的 AWS Glue 資料表,但 Athena 無法在單一掃描中讀取超過 100 萬個分割區。
-
若要最佳化查詢並減少掃描的分割區數量,請考慮分割區刪除或使用分割區索引等策略。
如需在 Athena 中使用分割區的其他考量,請參閱 分割您的資料。
範例
下列範例會將單一分割區新增至資料表,以取得 HIVE 樣式分割資料。
ALTER TABLE orders ADD
PARTITION (dt = '2016-05-14', country = 'IN');
下列範例會將多個分割區新增至資料表,以取得 HIVE 樣式分割資料。
ALTER TABLE orders ADD
PARTITION (dt = '2016-05-31', country = 'IN')
PARTITION (dt = '2016-06-01', country = 'IN');
如果資料表不適用於 HIVE 樣式的分割資料,則 LOCATION
子句是必需的,且應該是包含分割區資料之字首的完整 Amazon S3 URI。
ALTER TABLE orders ADD
PARTITION (dt = '2016-05-31', country = 'IN') LOCATION 's3://amzn-s3-demo-bucket/path/to/INDIA_31_May_2016/'
PARTITION (dt = '2016-06-01', country = 'IN') LOCATION 's3://amzn-s3-demo-bucket/path/to/INDIA_01_June_2016/';
若要在分割區已存在時忽略錯誤,請使用 IF NOT EXISTS
子句,如下列範例所示。
ALTER TABLE orders ADD IF NOT EXISTS
PARTITION (dt = '2016-05-14', country = 'IN');
零位元組 _$folder$
檔案
如果您執行 ALTER TABLE ADD PARTITION
語句並錯誤地指定已存在的分區和不正確的 Simple Storage Service (Amazon S3) 位置,則格式為
的零位元組預留位置檔案會在 Simple Storage Service (Amazon S3) 中建立。您必須手動移除這些檔案。partition_value
_$folder$
若要防止這種情況發生,請使用 ALTER TABLE ADD PARTITION
陳述式中的 ADD IF NOT EXISTS
語法,如下列範例所示。
ALTER TABLE table_name ADD IF NOT EXISTS PARTITION […]