本文為英文版的機器翻譯版本,如內容有任何歧義或不一致之處,概以英文版為準。
ALTER TABLE ADD PARTITION
為資料表建立一或多個分割區欄。每個分割區由一或多個不同的欄名稱/值組合組成。每種指定的組合都會另外建立一個資料目錄,這樣可在某些情況下改善查詢效能。分割區的欄本身不存在於資料表的資料中,因此,如果您使用的分割區欄名稱和資料表中的欄名稱相同,就會發生錯誤。如需詳細資訊,請參閱分割您的資料。
在 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) 路徑。
- [如果 NOTEXISTS]
-
如果已有相同定義的分割區,則會造成錯誤隱藏。
- PARTITION(分割區名稱 = 磁碟分割 _ 值 [,...])
-
使用您指定的資料欄名稱/值組合來建立分割區。只有當欄的資料類型是字串時,才需要以字串字元圍住
partition_col_value
。 - [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 TABLEtable_name
ADD IF NOT EXISTS PARTITION (ds='2023-01-02') ALTER TABLEtable_name
ADD IF NOT EXISTS PARTITION (ds='2023-01-03')
在 Athena 中使用分割區時,請記住以下幾點:
-
雖然 Athena 支援查詢具有 1000 萬個分割區的 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
子句為必要條款,且應該是包含分區URI資料之前綴的完整 Amazon S3。
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 […]