ALTER TABLE ADD PARTITION - Amazon Athena

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

ALTER TABLE ADD PARTITION

為資料表建立一或多個分割區欄。每個分割區由一或多個不同的欄名稱/值組合組成。每種指定的組合都會另外建立一個資料目錄,這樣可在某些情況下改善查詢效能。分割區的欄本身不存在於資料表的資料中,因此,如果您使用的分割區欄名稱和資料表中的欄名稱相同,就會發生錯誤。如需詳細資訊,請參閱 在 Athena 中分割資料

在 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。如需詳細資訊,請參閱 在 Athena 中分割資料

考量事項

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 支援查詢具有 1000 萬個分割區的 AWS Glue 資料表,但是 Athena 在一次掃描中無法讀取超過 100 萬個分割區。

  • 若要最佳化您的查詢並減少掃描的分割區數目,請考慮分割區修剪或使用分割區索引等策略。

  • 如果您未使用 AWS Glue Data Catalog,則每個表的最大分區數量為 20,000 個。您可以要求增加配額。

如需在 Athena 中使用分割區的其他考量,請參閱在 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://mystorage/path/to/INDIA_31_May_2016/' PARTITION (dt = '2016-06-01', country = 'IN') LOCATION 's3://mystorage/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) 位置,則格式為 partition_value_$folder$ 的零位元組預留位置檔案會在 Simple Storage Service (Amazon S3) 中建立。您必須手動移除這些檔案。

若要防止這種情況發生,請使用 ALTER TABLE ADD PARTITION 陳述式中的 ADD IF NOT EXISTS 語法,如下列範例所示。

ALTER TABLE table_name ADD IF NOT EXISTS PARTITION […]