使用動態 ID 分割 - Amazon Athena

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

使用動態 ID 分割

當您的資料以高基數屬性分割,或者無法事先知道這些值時,您可使用 injected 投影類型。這類屬性的範例包括使用者名稱,以及IDs裝置或產品。當您使用 injected 投影類型來設定分割區索引鍵時,Athena 會使用查詢本身的值來計算將要讀取的分割區集。

對於具有使用 injected 投影類型設定的分割區索引鍵的資料表,若要讓 Athena 能夠在此類資料表上執行查詢,必須符合下列條件:

  • 您的查詢必須包含至少一個分割區索引鍵值。

  • 值必須是文字或運算式,可在不讀取任何資料的情況下進行評估。

如果不滿足上述任何條件,您的查詢會失敗,並出現下列錯誤:

CONSTRAINT_VIOLATION:針對注入的投影分割區資料欄 column_name,子WHERE句必須僅包含靜態平等條件,且至少必須存在一個此類條件。

何時使用injected投影類型

假設您有一個資料集,其中包含來自 IoT 裝置的事件,並在裝置的 上進行分割IDs。此資料集具有下列特性:

  • 裝置IDs會隨機產生。

  • 新裝置會經常進行佈建。

  • 目前有數十萬部裝置,未來將會有數百萬部裝置。

使用傳統的中繼儲存難以管理此資料集。在資料儲存與中繼儲存之間難以保持分割區同步,並且在查詢規劃期間篩選分割區可能較慢。但是,如果您將資料表設定為使用分割區投影,並使用 injected 投影類型,則有兩項優勢:您不必管理中繼儲存中的分割區,並且您的查詢也不必查詢分割區中繼資料。

下列 CREATE TABLE 範例會針對剛才描述的裝置事件資料集來建立資料表。該資料表使用注入的投影類型。

CREATE EXTERNAL TABLE device_events ( event_time TIMESTAMP, data STRING, battery_level INT ) PARTITIONED BY ( device_id STRING ) LOCATION "s3://amzn-s3-demo-bucket/prefix/" TBLPROPERTIES ( "projection.enabled" = "true", "projection.device_id.type" = "injected", "storage.location.template" = "s3://amzn-s3-demo-bucket/prefix/${device_id}" )

下列範例查詢會查詢 12 小時內,從三個特定裝置接收的事件數目。

SELECT device_id, COUNT(*) AS events FROM device_events WHERE device_id IN ( '4a770164-0392-4a41-8565-40ed8cec737e', 'f71d12cf-f01f-4877-875d-128c23cbde17', '763421d8-b005-47c3-ba32-cc747ab32f9a' ) AND event_time BETWEEN TIMESTAMP '2023-11-01 20:00' AND TIMESTAMP '2023-11-02 08:00' GROUP BY device_id

當您執行此查詢時,Athena 會看到 device_id 分割區索引鍵的三個值,並使用這些值來計算分割區位置。Athena 會使用 storage.location.template 屬性的值來產生下列位置:

  • s3://amzn-s3-demo-bucket/prefix/4a770164-0392-4a41-8565-40ed8cec737e

  • s3://amzn-s3-demo-bucket/prefix/f71d12cf-f01f-4877-875d-128c23cbde17

  • s3://amzn-s3-demo-bucket/prefix/763421d8-b005-47c3-ba32-cc747ab32f9a

如果您從分割區投影組態中省略 storage.location.template 屬性,Athena 會根據 LOCATION 中的值 (例如 s3://amzn-s3-demo-bucket/prefix/device_id=4a770164-0392-4a41-8565-40ed8cec737e),使用 HIVE 樣式的分割區來投影分割區位置。