Bekerja dengan indeks partisi di AWS Glue - AWS Glue

Terjemahan disediakan oleh mesin penerjemah. Jika konten terjemahan yang diberikan bertentangan dengan versi bahasa Inggris aslinya, utamakan versi bahasa Inggris.

Bekerja dengan indeks partisi di AWS Glue

Seiring waktu, ratusan ribu partisi ditambahkan ke sebuah tabel. GetPartitions API digunakan untuk mengambil partisi dalam tabel. API mengembalikan partisi yang cocok dengan ekspresi yang diberikan dalam permintaan.

Mari kita ambil tabel sales_data sebagai contoh yang dipartisi oleh kunci Negara, Kategori, Tahun, Bulan, dan CreationDate. Jika Anda ingin mendapatkan data penjualan untuk semua item yang dijual untuk kategori Buku pada tahun 2020 setelah 2020-08-15, Anda harus membuat GetPartitions permintaan dengan ungkapan “Kategori = 'Buku' dan CreationDate > '2020-08-15'” ke Katalog Data.

Jika tidak ada indeks partisi yang ada pada tabel tersebut, AWS Glue akan memuat semua partisi dari tabel, dan kemudian menyaring partisi yang dimuat dengan menggunakan ekspresi permintaan yang disediakan oleh pengguna dalam permintaan GetPartitions tersebut. Kueri membutuhkan lebih banyak waktu untuk dieksekusi karena jumlah partisi yang meningkat pada sebuah tabel yang tidak memiliki indeks. Dengan indeks, kueri GetPartitions akan mencoba untuk mengambil subset dari partisi alih-alih memuat semua partisi dalam tabel tersebut.

Tentang indeks partisi

Saat membuat sebuah indeks partisi, Anda menentukan daftar kunci partisi yang sudah ada di tabel tertentu. Indeks partisi merupakan sub daftar dari kunci partisi yang didefinisikan dalam tabel. Sebuah indeks partisi dapat dibuat pada setiap permutasi dari kunci partisi yang didefinisikan pada tabel. Untuk tabel sales_data di atas, indeks yang mungkin adalah (negara, kategori, CreationDate), (negara, kategori, tahun), (negara, kategori), (negara), (kategori, negara, tahun, bulan), dan sebagainya.

Katalog Data akan menggabungkan nilai-nilai partisi dalam urutan yang ditetapkan pada saat pembuatan indeks. Indeks dibangun secara konsisten sebagai partisi ditambahkan ke tabel tersebut. Indeks dapat dibuat untuk jenis kolom String (string, char, dan varchar), Numeric (int, bigint, long, tinyint, dan smallint), dan Date (yyyy-mm-dd).

Tipe data yang didukung

  • Tanggal — Tanggal dalam format ISO, sepertiYYYY-MM-DD. Misalnya, tanggal2020-08-15. Formatnya menggunakan tanda hubung (‐) untuk memisahkan tahun, bulan, dan hari. Rentang yang diizinkan untuk tanggal untuk pengindeksan mencakup dari hingga0000-01-01. 9999-12-31

  • String — Sebuah string literal tertutup dalam tanda kutip tunggal atau ganda.

  • Char - Data karakter panjang tetap, dengan panjang tertentu antara 1 dan 255, seperti char (10).

  • Varchar — Data karakter panjang variabel, dengan panjang tertentu antara 1 dan 65535, seperti varchar (10).

  • Numerik - int, bigint, panjang, tinyint, dan smallint

Indeks tipe data Numerik, String, dan Tanggal mendukung =, >, >=, <, <= dan antar operator. Solusi pengindeksan saat ini hanya mendukung operator logis AND. Sub-ekspresi dengan operator "LIKE", "IN", "OR", dan "NOT" diabaikan dalam ekspresi untuk penyaringan menggunakan sebuah indeks. Penyaringan untuk sub-ekspresi yang diabaikan dilakukan pada partisi yang diambil setelah menerapkan penyaringan indeks.

Untuk setiap partisi yang ditambahkan ke sebuah tabel, dibuat item indeks yang sesuai. Untuk tabel dengan partisi ‘n’, 1 indeks partisi akan menghasilkan item partisi indeks 'n'. Indeks partisi 'm' pada tabel yang sama akan menghasilkan item indeks partisi 'm*n'. Setiap item indeks partisi akan dikenakan biaya sesuai dengan kebijakan harga AWS Glue saat ini untuk penyimpanan katalog data. Untuk detail tentang harga objek penyimpanan, lihat Harga AWS Glue.

Membuat tabel dengan indeks partisi

Anda dapat membuat sebuah indeks partisi saat pembuatan tabel. Permintaan CreateTable mengambil daftar Objek PartitionIndex sebagai masukan. Maksimum 3 indeks partisi dapat dibuat pada tabel tertentu. Setiap indeks partisi membutuhkan sebuah nama dan sebuah daftar partitionKeys yang didefinisikan untuk tabel. Indeks yang dibuat pada tabel dapat diambil menggunakan API GetPartitionIndexes

Menambahkan indeks partisi ke tabel yang ada

Untuk menambahkan sebuah indeks partisi ke tabel yang ada, gunakan operasi CreatePartitionIndex. Anda dapat membuat satu PartitionIndex per operasi CreatePartitionIndex. Menambahkan sebuah indeks tidak akan mempengaruhi ketersediaan tabel, karena tabel terus akan tersedia saat indeks sedang dibuat.

Status indeks untuk partisi tambahan diatur ke MEMBUAT dan pembuatan data indeks dimulai. Jika proses untuk membuat indeks berhasil, maka IndexStatus diperbarui menjadi AKTIF dan untuk proses gagal, status indeks diperbarui menjadi GAGAL. Pembuatan indeks dapat gagal karena beberapa alasan, dan Anda dapat menggunakan operasi GetPartitionIndexes untuk mengambil detail kegagalan. Kegagalan yang mungkin terjadi adalah:

  • ENCRYPTED_PARTITION_ERROR — Pembuatan indeks pada tabel dengan partisi terenkripsi tidak didukung.

  • INVALID_PARTITION_TYPE_DATA_ERROR — Terlihat saat nilai partitionKey bukan nilai yang valid untuk tipe data partitionKey yang sesuai. Sebagai contoh: partitionKey dengan tipe data 'int' memiliki nilai 'foo'.

  • MISSING_PARTITION_VALUE_ERROR — Terlihat bila partitionValue untuk indexedKey tidak ada. Hal ini dapat terjadi ketika sebuah tabel tidak dipartisi secara konsisten.

  • UNSUPPORTED_PARTITION_CHARACTER_ERROR — Terlihat ketika nilai untuk kunci partisi diindeks berisi karakter \u0000, \u0001 atau \u0002

  • INTERNAL_ERROR — Sebuah kesalahan internal terjadi saat indeks sedang dibuat.

Menjelaskan indeks partisi di atas meja

Untuk mengambil indeks partisi yang dibuat pada sebuah tabel, gunakan operasi GetPartitionIndexes. Respons mengembalikan semua indeks pada tabel tersebut, bersama dengan status saat ini dari masing-masing indeks (IndexStatus).

IndexStatus untuk sebuah indeks partisi merupakan salah satu dari berikut ini:

  • CREATING — Indeks sedang dibuat, dan belum tersedia untuk digunakan.

  • ACTIVE — Indeks siap digunakan. Permintaan dapat menggunakan indeks untuk melakukan kueri dioptimalkan.

  • DELETING — Indeks saat ini sedang dihapus, dan tidak dapat lagi digunakan. Indeks dalam status aktif dapat dihapus menggunakan permintaan DeletePartitionIndex, yang memindahkan status dari AKTIF untuk MENGHAPUS.

  • FAILED — Pembuatan indeks pada tabel yang ada gagal. Setiap tabel menyimpan 10 indeks gagal terakhir.

Transisi status yang mungkin terjadi untuk indeks yang dibuat pada tabel yang ada adalah:

  • MEMBUAT → AKTIF → MENGHAPUS

  • MEMBUAT → GAGAL

Keterbatasan penggunaan indeks partisi

Setelah Anda membuat sebuah indeks partisi, perhatikan perubahan ini ke fungsionalitas tabel dan partisi:

Pembuatan partisi baru (setelah Penambahan Indeks)

Setelah sebuah indeks partisi dibuat pada sebuah tabel, semua partisi baru yang ditambahkan ke tabel tersebut akan divalidasi untuk pemeriksaan tipe data untuk kunci diindeks. Nilai partisi kunci diindeks akan divalidasi format tipe data-nya. Jika pemeriksaan tipe data gagal, maka operasi membuat partisi akan gagal. Untuk tabel sales_data, jika indeks dibuat untuk kunci (kategori, tahun) di mana kategori adalah tipe string dan tahun merupakan jenis int, maka pembuatan partisi baru dengan nilai TAHUN sebagai "foo" akan gagal.

Setelah indeks diaktifkan, penambahan partisi dengan nilai kunci diindeks yang memiliki karakter U+0000, U+00001, dan U+0002 akan mulai gagal.

Pembaruan tabel

Setelah sebuah indeks partisi dibuat pada sebuah tabel, Anda tidak dapat mengubah nama kunci partisi untuk kunci partisi yang ada, dan Anda tidak dapat mengubah jenis, atau urutan, kunci yang terdaftar dengan indeks tersebut.

Menggunakan indeks untuk panggilan yang dioptimalkan GetPartitions

Ketika Anda memanggil GetPartitions pada sebuah tabel dengan indeks, Anda dapat menyertakan ekspresi, dan jika berlaku Katalog Data akan menggunakan sebuah indeks jika mungkin. Kunci pertama dari indeks tersebut harus diberikan dalam ekspresi untuk indeks yang akan digunakan dalam penyaringan. Optimalisasi indeks dalam penyaringan diterapkan sebagai upaya terbaik. Katalog Data mencoba untuk menggunakan indeks optimasi sebanyak mungkin, tetapi jika indeks tidak ada, atau operator tidak didukung, maka ia kembali ke implementasi yang ada, yakni memuat semua partisi.

Untuk tabel sales_data di atas, mari kita tambahkan indeks [Negara, Kategori, Tahun]. Jika "Negara" tidak diberikan dalam ekspresi, maka indeks terdaftar tidak akan dapat mem-filter partisi menggunakan indeks. Anda dapat menambahkan hingga 3 indeks untuk men-support berbagai pola kueri.

Mari kita mengambil beberapa contoh ekspresi dan melihat bagaimana indeks bekerja pada ekspresi-ekspresi tersebut:

Ekspresi Bagaimana indeks akan digunakan

Negara = 'ID'

Indeks akan digunakan untuk mem-filter partisi.

Negara = 'AS' dan Kategori = 'Sepatu'

Indeks akan digunakan untuk mem-filter partisi.

Kategori = 'Sepatu'

Indeks tidak akan digunakan karena "negara" tidak ada dalam ekspresi. Semua partisi akan dimuat untuk mengembalikan sebuah respon.

Negara = 'AS' dan Kategori = 'Sepatu' serta Tahun > '2018'

Indeks akan digunakan untuk mem-filter partisi.

Negara = 'AS' dan Kategori = 'Sepatu' dan Tahun > '2018' dan bulan = 2

Indeks akan digunakan untuk mengambil semua partisi dengan negara = "AS" dan kategori = "sepatu" dan tahun > 2018. Kemudian, penyaringan pada ekspresi bulan akan dilakukan.

Negara = 'AS' DAN Kategori = 'Sepatu' ATAU Tahun > '2018'

Indeks tidak akan digunakan karena sebuah operator OR ada dalam ekspresi.

Negara = 'AS' DAN Kategori = 'Sepatu' DAN (Tahun = 2017 ATAU Tahun = '2018')

Indeks akan digunakan untuk mengambil semua partisi dengan negara = "AS" dan kategori = "sepatu", dan kemudian penyaringan pada ekspresi tahun akan dilakukan.

Negara di ('AS', 'UK') DAN Kategori = 'Sepatu'

Indeks tidak akan digunakan untuk penyaringan karena operator IN tidak didukung saat ini.

Negara = 'AS' DAN Kategori dalam ('Sepatu', 'Buku')

Indeks akan digunakan untuk mengambil semua partisi dengan country = “US”, dan kemudian pemfilteran pada ekspresi Kategori akan dilakukan.

Negara = 'AS' DAN Kategori dalam ('Sepatu', 'Buku') DAN (CreationDate> '2023-9-01'

Indeks akan digunakan untuk mengambil semua partisi dengan country = “US”, dengan creationDate > '2023-9-01', dan kemudian pemfilteran pada ekspresi Kategori akan dilakukan.

Integrasi dengan mesin

Redshift Spectrum, Amazon EMR dan AWS Glue ETL Spark dapat memanfaatkan indeks untuk mengambil partisi setelah indeks DataFrames berada dalam status AKTIF. AWS Glue Athena dan AWS GlueETL Dynamic frame mengharuskan Anda mengikuti langkah-langkah tambahan untuk memanfaatkan indeks untuk peningkatan kueri.

Aktifkan penyaringan partisi

Untuk mengaktifkan pemfilteran partisi di Athena, Anda perlu memperbarui properti tabel sebagai berikut:

  1. Di AWS Glue konsol, di bawah Katalog Data, pilih Tabel.

  2. Pilih meja.

  3. Di bawah Tindakan, pilih Edit tabel.

  4. Di bawah properti Tabel, tambahkan yang berikut ini:

    • Kunci — partition_filtering.enabled

    • Nilai - true

  5. Pilih Terapkan.

Atau, Anda dapat mengatur parameter ini dengan menjalankan kueri ALTER TABLE SET PROPERTIES di Athena.

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