建立分割區索引 - AWS Glue

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

建立分割區索引

隨著時間的推移,數十萬個分割區被新增到資料表中。GetPartitions API用來擷取資料表中的分割區。API返回與請求中提供的表達式匹配的分區。

讓我們採取 sales_data 表作為由鍵國家類別和分區的例子。creationDate如果您想獲取 2020 年 08 月 15 日之後所有出售「圖書」類別的物品的銷售數據,則必須向數據目錄提出GetPartitions請求,並註明「類別 = '書籍' 和 creationDate > '2020-08-15'」一詞。

如果資料表上沒有分割區索引,AWS Glue 會載入資料表的所有分割區,然後使用使用者在 GetPartitions 請求中提供的查詢表達式來篩選載入的分割區。查詢需要更多的時間來執行,因為沒有索引的資料表上的分割區數目會增加。使用索引,GetPartitions 查詢可嘗試擷取分割區的子集,而不是載入資料表中的所有分割區。

關於分割區索引

在您建立分割區索引時,指定已存在於指定資料表上的分割區索引鍵清單。分割區索引是在資料表中定義的分割區索引鍵的子清單。分割區索引可以在資料表上定義的分割區索引鍵的任何排列上建立。對於上述 sales_data 表,可能的索引是(國家,類別,creationDate),(國家,類別,年),(國家/地區,類別),(國家/地區),(類別,國家,年,月)等。

Data Catalog 會依建立索引時提供的順序連接分割區值。當分割區新增至資料表時,索引會一致地建立。可以為字符串(字符串,字符和 varchar),數字(整數,大整型,長,小型和小型)和日期(YYYY-MM-DD)列類型創建索引。

支援的資料類型

  • 日期 — 格ISO式的日期,例如YYYY-MM-DD。例如,日期2020-08-15。格式使用連字號 (‐) 來分隔年、月和日。索引日期的允許範圍從到0000-01-01跨越。9999-12-31

  • String — 以單引號或雙引號括住的字串常值。

  • 字元 — 固定長度字元資料,指定長度介於 1 到 255 之間,例如字元 (10)。

  • 瓦爾查爾 — 可變長度字元資料,其指定長度介於 1 到 65535 之間,例如 varchar (10)。

  • 數字-整型,大,長,小和小型

「數字」、「字串」和「日期」資料類型的索引支援 =、>、>=、<、<= 以及運算子之間的索引。索引解決方案目前只支援 AND 邏輯運算子。在使用索引篩選的運算式中,會忽略具有運算子「」、「INNOT」、「OR」和「」的子運算式。LIKE篩選忽略的子表達式會在套用索引篩選之後擷取的分割區上完成。

對於新增到資料表中的每個分割區,會有一個相應的索引項目建立。對於具有 'n' 個分割區的資料表,1 個分割區索引會產生 'n' 個分割區索引項目。同一個資料表上的 'm' 個分割區索引會產生 'm*n' 個分割區索引項目。每個分割區索引項目將根據目前的 AWS Glue Data Catalog 儲存體的定價政策。如需儲存物件定價的詳細資訊,請參閱 AWS Glue 定價

建立具有分割區索引的資料表

您可以在建立資料表期間建立分割區索引。CreateTable 要求會取得 PartitionIndex 物件的清單作為輸入。指定資料表上最多可以建立 3 個分割區索引。每個分割區索引都需要一個名稱和為資料表定義的 partitionKeys 清單。在表上創建的索引可以使用 GetPartitionIndexesAPI

將分割區索引新增至現有資料表

若要將分割區索引新增至現有資料表,請使用 CreatePartitionIndex 操作。每個 CreatePartitionIndex 操作只能建立一個 PartitionIndex。新增索引不會影響資料表的可用性,因為資料表會在建立索引時繼續可用。

已新增分割區的索引狀態設定為,CREATING並開始建立索引資料。如果建立索引的程序順利完成,則會更新 indexStatus 為,ACTIVE且對於失敗的程序,索引狀態會更新為FAILED。索引建立可能會因多種原因而失敗,您可以使用 GetPartitionIndexes 作業擷取失敗詳細資訊。可能失敗如下:

  • ENCRYPTED_ PARTITION _ ERROR — 不支援在含有加密分割區的資料表上建立索引。

  • INVALID_ PARTITION _ _ TYPE DATA _ ERROR — 當partitionKey值不是對應partitionKey資料類型的有效值時觀察到的。例如:具有 'int' 資料類型的 partitionKey 有一個 'foo' 值。

  • MISSING_ PARTITION _ VALUE _ ERROR — 當partitionValue對於不存在時觀察到。indexedKey當資料表沒有一致地進行分割時,可能會發生這種情況。

  • UNSUPPORTED_ _ PARTITION CHARACTER _ ERROR — 當索引分割區索引鍵的值包含字元\ u0000、\ u0001 或\ u0002 時觀察到

  • INTERNAL_ ERROR — 建立索引時發生內部錯誤。

描述資料表上的分割區索引

若要擷取資料表上建立的分割區索引,請使用 GetPartitionIndexes 操作。回應會傳回資料表上的所有索引,以及每個索引的目前狀態 (IndexStatus)。

分割區索引的 IndexStatus 會是下列其中一項:

  • CREATING – 正在建立索引,尚無法使用。

  • ACTIVE— 索引已準備就緒可供使用。請求可以使用索引來執行最佳化的查詢。

  • DELETING – 正在刪除索引,無法再使用。處於活動狀態的索引可以使用DeletePartitionIndex請求,該請求將狀態從移動ACTIVE到被刪除DELETING。

  • FAILED — 在現有資料表上建立索引失敗。每個資料表儲存最後 10 個失敗的索引。

在現有資料表上建立的索引的可能狀態轉換是:

  • CREATING → ACTIVE → DELETING

  • CREATING → FAILED

使用分割區索引的限制

建立分割區索引之後,請注意下列資料表和分割區功能變更:

建立新的分割區 (在新增索引之後)

在資料表上建立分割區索引之後,新增至資料表的所有新分割區都會驗證索引鍵的資料類型檢查。索引索引鍵的分割區值將針對資料類型格式進行驗證。如果資料類型檢查失敗,建立分割區作業將會失敗。對於 sales_data 表,如果為類別為類型和類型年份的索引鍵(類別string,年份)創建索引int,則創建值YEAR為「foo」的新分區將失敗。

啟用索引之後,新增具有索引索引鍵值的分割區,其字元為 U+0000、U+00001 和 U+0002 將會開始失敗。

表格更新

在資料表上建立分割區索引之後,您就無法修改現有分割區索引鍵的分割區索引鍵名稱,也無法變更與索引註冊之索引鍵的類型或順序。

使用索引進行優化的 GetPartitions 調用

當您在具有索引的資料表上呼叫 GetPartitions,您可以包含表達式,如果適用, Data Catalog 將使用索引 (如果可能)。索引的第一個索引鍵應該在用於篩選索引的表達式中傳遞。篩選中的索引最佳化會盡最大努力應用。 Data Catalog 會嘗試盡可能使用索引最佳化,但如果遺失索引或不受支援的運算子,它會回退到載入所有分割區的現有實作。

於上述 sales_data 資料表,讓我們新增索引 [Country, Category, Year]。如果表達式中未傳遞 "Country",註冊的索引將無法使用索引篩選分割區。您最多可以新增 3 個索引,以支援各種查詢模式。

讓我們舉一些範例表達式,看看索引如何在它們上運作:

表達式 如何使用索引

Country = 'US'

索引將用於篩選分割區。

Country = 'US' and Category = 'Shoes'

索引將用於篩選分割區。

Category = 'Shoes'

表達式中沒有提供 "country",所以不會使用索引。所有分割區將被載入以傳回回應。

Country = 'US' and Category = 'Shoes' and Year > '2018'

索引將用於篩選分割區。

Country = 'US' and Category = 'Shoes' and Year > '2018' and month = 2

索引將用於擷取 country = "US" 和 category = "shoes" 和 year > 2018 的所有分割區。然後,將執行月份表達式上的篩選。

國家 = '美國' AND 類別 = '鞋' 或年 > '2018'

由於 OR 運算子存在於表達式中,因此不會使用索引。

國家 = '美國' AND 類別 = '鞋'AND(年 = 2017 或年 = '2018')

索引將用於擷取 country = "US" 和 category = "shoes" 的所有分割區然後執行對年份表達式的篩選。

國家(「美國」,「英國」)AND類別 =「鞋子」

由於目前不支援 IN 運算子,因此不會使用索引進行篩選。

國家 =「美國」AND 類別(「鞋」,「書籍」)

索引將用於擷取具有 country = "US" 的所有分割區,然後執行對「類別」表達式的篩選。

國家 =「美國」AND 類別中(「鞋」,「書籍」)AND(creationDate >「2023-9-01」

索引將用於獲取國家/地區 =「US」的所有分區,具有 creationDate > '2023-9-01',然後對類別表達式進行過濾將被執行。

與引擎整合

Redshift 頻譜,Amazon EMR 和 AWS Glue ETL Spark 能夠 DataFrames 在索引處於ACTIVE狀態之後利用索引來獲取分區。AWS GlueAthenaAWS GlueETL動態框架要求您遵循額外的步驟,以利用索引來改善查詢。

啟用分割區篩選

若要在 Athena 中啟用分割區篩選,您需要更新資料表屬性,如下所示:

  1. 在 AWS Glue 主控台的「資料目錄」下,選擇「表格」。

  2. 選擇 表格。

  3. 在「動作」 下,選擇「編輯表」。

  4. 在 [表格屬性] 下,新增下列項目:

    • 關鍵 — partition_filtering.enabled

    • 價值 — true

  5. 選擇套用

或者,您也可以在 Athena 中執行ALTERTABLESETPROPERTIES查詢來設定此參數。

ALTER TABLE partition_index.table_with_index SET TBLPROPERTIES ('partition_filtering.enabled' = 'true')