本文為英文版的機器翻譯版本,如內容有任何歧義或不一致之處,概以英文版為準。
使用動態 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/
),使用 HIVE 樣式的分割區來投影分割區位置。prefix
/device_id=4a770164-0392-4a41-8565-40ed8cec737e