Terjemahan disediakan oleh mesin penerjemah. Jika konten terjemahan yang diberikan bertentangan dengan versi bahasa Inggris aslinya, utamakan versi bahasa Inggris.
Gunakan partisi ID dinamis
Ketika data Anda dipartisi oleh properti dengan kardinalitas tinggi atau ketika nilai tidak dapat diketahui sebelumnya, Anda dapat menggunakan jenis proyeksi. injected
Contoh properti tersebut adalah nama pengguna, dan IDs perangkat atau produk. Bila Anda menggunakan jenis injected
proyeksi untuk mengkonfigurasi kunci partisi, Athena menggunakan nilai-nilai dari query itu sendiri untuk menghitung set partisi yang akan dibaca.
Agar Athena dapat menjalankan kueri pada tabel yang memiliki kunci partisi yang dikonfigurasi dengan jenis injected
proyeksi, berikut ini harus benar:
-
Kueri Anda harus menyertakan setidaknya satu nilai untuk kunci partisi.
-
Nilai harus literal atau ekspresi yang dapat dievaluasi tanpa membaca data apa pun.
Jika salah satu kriteria ini tidak terpenuhi, kueri Anda gagal dengan kesalahan berikut:
CONSTRAINT_VIOLATION: Untuk kolom partisi proyeksi yang disuntikkan
column_name
, WHERE klausa harus berisi hanya kondisi kesetaraan statis, dan setidaknya satu kondisi tersebut harus ada.
Kapan menggunakan jenis injected
proyeksi
Bayangkan Anda memiliki kumpulan data yang terdiri dari peristiwa dari perangkat IoT, dipartisi pada perangkat '. IDs Kumpulan data ini memiliki karakteristik sebagai berikut:
-
Perangkat dihasilkan IDs secara acak.
-
Perangkat baru sering disediakan.
-
Saat ini ada ratusan ribu perangkat, dan di masa depan akan ada jutaan.
Kumpulan data ini sulit dikelola menggunakan metastores tradisional. Sulit untuk menjaga partisi tetap sinkron antara penyimpanan data dan metastore, dan partisi penyaringan bisa lambat selama perencanaan kueri. Tetapi jika Anda mengonfigurasi tabel untuk menggunakan proyeksi partisi dan menggunakan jenis injected
proyeksi, Anda memiliki dua keuntungan: Anda tidak perlu mengelola partisi di metastore, dan kueri Anda tidak harus mencari metadata partisi.
CREATE TABLE
Contoh berikut membuat tabel untuk set data peristiwa perangkat yang baru saja dijelaskan. Tabel menggunakan jenis proyeksi yang disuntikkan.
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}" )
Contoh kueri berikut mencari jumlah peristiwa yang diterima dari tiga perangkat tertentu selama 12 jam.
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
Ketika Anda menjalankan query ini, Athena melihat tiga nilai untuk kunci device_id
partisi dan menggunakannya untuk menghitung lokasi partisi. Athena menggunakan nilai storage.location.template
properti untuk menghasilkan lokasi berikut:
-
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
Jika Anda meninggalkan storage.location.template
properti dari konfigurasi proyeksi partisi, Athena menggunakan partisi gaya HIVE untuk memproyeksikan lokasi partisi berdasarkan nilai LOCATION
dalam (misalnya,). s3://amzn-s3-demo-bucket/
prefix
/device_id=4a770164-0392-4a41-8565-40ed8cec737e