本文為英文版的機器翻譯版本,如內容有任何歧義或不一致之處,概以英文版為準。
建立分割區索引
隨著時間的推移,數十萬個分割區被新增到資料表中。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
清單。在表上創建的索引可以使用 GetPartitionIndexes
API
將分割區索引新增至現有資料表
若要將分割區索引新增至現有資料表,請使用 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' |
由於 |
國家 = '美國' AND 類別 = '鞋'AND(年 = 2017 或年 = '2018') |
索引將用於擷取 country = "US" 和 category = "shoes" 的所有分割區然後執行對年份表達式的篩選。 |
國家(「美國」,「英國」)AND類別 =「鞋子」 |
由於目前不支援 |
國家 =「美國」AND 類別(「鞋」,「書籍」) |
索引將用於擷取具有 country = "US" 的所有分割區,然後執行對「類別」表達式的篩選。 |
國家 =「美國」AND 類別中(「鞋」,「書籍」)AND(creationDate >「2023-9-01」 |
索引將用於獲取國家/地區 =「US」的所有分區,具有 creationDate > '2023-9-01',然後對類別表達式進行過濾將被執行。 |
與引擎整合
Redshift 頻譜,Amazon EMR 和 AWS Glue ETL Spark 能夠 DataFrames 在索引處於ACTIVE狀態之後利用索引來獲取分區。AWS GlueAthena 和AWS GlueETL動態框架要求您遵循額外的步驟,以利用索引來改善查詢。
啟用分割區篩選
若要在 Athena 中啟用分割區篩選,您需要更新資料表屬性,如下所示:
在 AWS Glue 主控台的「資料目錄」下,選擇「表格」。
選擇 表格。
在「動作」 下,選擇「編輯表」。
在 [表格屬性] 下,新增下列項目:
關鍵 —
partition_filtering.enabled
價值 —
true
選擇套用。
或者,您也可以在 Athena 中執行ALTERTABLESETPROPERTIES查詢來設定此參數。
ALTER TABLE partition_index.table_with_index SET TBLPROPERTIES ('partition_filtering.enabled' = 'true')