Terjemahan disediakan oleh mesin penerjemah. Jika konten terjemahan yang diberikan bertentangan dengan versi bahasa Inggris aslinya, utamakan versi bahasa Inggris.
Menggunakan Athena untuk menanyakan kumpulan data Apache Hudi
Apache HudiUpsert
mengacu pada kemampuan untuk menyisipkan catatan ke dalam set data yang ada jika mereka belum ada atau untuk memperbaruinya jika mereka sudah ada.
Hudi menangani peristiwa penyisipan dan pembaruan data tanpa membuat banyak file kecil yang dapat menyebabkan masalah performa untuk analisis. Apache Hudi secara otomatis melacak perubahan dan menggabungkan file sehingga ukurannya tetap optimal. Ini untuk menghindari kebutuhan untuk membangun solusi kustom yang memantau dan menulis ulang banyak file kecil ke dalam file besar yang lebih sedikit.
Set data Hudi cocok untuk kasus penggunaan berikut:
-
Mematuhi peraturan privasi seperti peraturan perlindungan data umum
(GDPR) dan undang-undang privasi konsumen California (CCPA) yang memberlakukan hak orang untuk menghapus informasi pribadi atau mengubah cara data mereka digunakan. -
Bekerja dengan data streaming dari sensor dan perangkat Internet untuk Segala (IoT) lainnya yang memerlukan penyisipan data dan pembaruan peristiwa tertentu.
-
Menerapkan sistem change data capture (CDC)
.
Kumpulan data yang dikelola oleh Hudi disimpan di Amazon S3 menggunakan format penyimpanan terbuka. Saat ini, Athena dapat membaca set data Hudi yang dipadatkan tetapi tidak menulis data Hudi. Athena mendukung hingga Hudi versi 0.8.0 dengan mesin Athena versi 2, dan Hudi versi 0.14.0 dengan mesin Athena versi 3. Ini dapat berubah. Athena tidak dapat menjamin kompatibilitas baca dengan tabel yang dibuat dengan versi Hudi yang lebih baru. Untuk informasi tentang versi mesin Athena, lihat Versi mesin Athena. Untuk informasi selengkapnya tentang fitur dan pembuatan versi Hudi, lihat dokumentasi Hudi di situs web Apache
Jenis tabel dataset Hudi
Sebuah set data Hudi dapat menjadi salah satu dari tipe berikut:
-
Copy on Write (CoW) – Data disimpan dalam format kolom (Parquet), dan setiap pembaruan membuat versi file baru selama penulisan.
-
Merge on Read (MoR) – Data disimpan menggunakan kombinasi kolom (Parquet) dan format berbasis baris (Avro). Pembaruan dicatat ke file
delta
berbasis baris dan dipadatkan sesuai kebutuhan untuk membuat file kolom versi baru.
Dengan set data CoW, setiap kali ada pembaruan ke catatan, file yang berisi catatan ditulis ulang dengan nilai yang diperbarui. Dengan set data MoR, setiap kali ada pembaruan, Hudi hanya menulis baris untuk catatan yang berubah. MoR lebih cocok untuk beban kerja tulis atau perubahan berat dengan lebih sedikit pembacaan. CoW lebih cocok untuk beban kerja pembacaan berat pada data yang jarang berubah.
Hudi menyediakan tiga tipe kueri untuk mengakses data:
-
Kueri snapshot — Kueri yang melihat snapshot terbaru dari tabel sebagai tindakan komit atau pemadatan yang diberikan. Untuk tabel MoR, kueri snapshot memapar status terbaru tabel dengan menggabungkan file dasar dan delta potongan file terbaru pada pada saat kueri.
-
Kueri tambahan — Kueri hanya melihat data baru yang ditulis ke tabel, karena komit/pemadatan yang diberikan. Ini secara efektif menyediakan pengaliran perubahan untuk mengaktifkan data pipeline tambahan.
-
Baca kueri yang dioptimalkan — Untuk tabel MoR, kueri melihat data terbaru yang dipadatkan. Untuk tabel CoW, kueri melihat data terbaru yang dikomit.
Tabel berikut menunjukkan kemungkinan tipe kueri Hudi untuk setiap tipe tabel.
Jenis tabel | Kemungkinan jenis kueri Hudi |
---|---|
Copy On Write | Snapshot, tambahan |
Merge On Read | snapshot, tambahan, dioptimalkan baca |
Saat ini, Athena mendukung kueri snapshot dan dioptimalkan baca, tetapi tidak kueri tambahan. Pada tabel MoR, semua data yang terpapar untuk mengkueri dioptimalkan baca dipadatkan. Ini memberikan performa yang baik tetapi tidak termasuk komit delta terbaru. Kueri snapshot berisi data terbaru tetapi dikenai beberapa overhead komputasi, yang membuat performa kueri ini tidak terlalu baik.
Untuk informasi selengkapnya tentang pengorbanan antara tipe tabel dan kueri, lihat Jenis Tabel & Kueri
Perubahan terminologi Hudi: Tampilan sekarang menjadi kueri
Dimulai pada rilis versi 0.5.1, Apache Hudi mengubah beberapa terminologi. Yang sebelumnya tampilan kini disebut kueri dalam rilis berikutnya. Tabel berikut merangkum perubahan antara istilah lama dan baru.
Istilah lama | Istilah baru |
---|---|
CoW: tampilan dioptimalkan baca MoR: tampilan waktu nyata |
Kueri snapshot |
Tampilan tambahan | Kueri tambahan |
Tampilan dioptimalkan baca MoR | Kueri dioptimalkan baca |
Tabel dari operasi bootstrap
Mulai di Apache Hudi versi 0.6.0, fitur operasi bootstrap memberikan performa yang lebih baik dengan set data Parquet yang ada. Sebagai ganti menulis ulang set data, operasi bootstrap dapat menghasilkan metadata saja, meninggalkan set data di tempat.
Anda dapat menggunakan Athena untuk mengkueri tabel dari operasi bootstrap seperti tabel lain berdasarkan data di Amazon S3. Di pernyataan CREATE TABLE
, tentukan jalur tabel Hudi Anda di klausa LOCATION
.
Untuk informasi lebih lanjut tentang membuat tabel Hudi menggunakan operasi bootstrap di AmazonEMR, lihat artikel Fitur baru dari Apache Hudi tersedia di Amazon EMR di Blog
Daftar metadata Hudi
Apache Hudi memiliki tabel metadata
Dari fitur-fitur ini, Athena saat ini hanya mendukung indeks daftar file. Indeks daftar file menghilangkan panggilan sistem file seperti “daftar file” dengan mengambil informasi dari indeks yang memelihara partisi ke pemetaan file. Ini menghilangkan kebutuhan untuk daftar secara rekursif setiap partisi di bawah jalur tabel untuk mendapatkan tampilan sistem file. Saat Anda bekerja dengan kumpulan data besar, pengindeksan ini secara drastis mengurangi latensi yang seharusnya terjadi saat mendapatkan daftar file selama penulisan dan kueri. Ini juga menghindari kemacetan seperti pembatasan batas permintaan pada panggilan Amazon S3. LIST
catatan
Athena tidak mendukung lompatan data atau pengindeksan filter mekar saat ini.
Mengaktifkan tabel metadata Hudi
Daftar file berbasis tabel metadata dinonaktifkan secara default. Untuk mengaktifkan tabel metadata Hudi dan fungsionalitas daftar file terkait, atur properti hudi.metadata-listing-enabled
tabel ke. TRUE
Contoh
ALTER TABLE SET TBLPROPERTIES
Contoh berikut memungkinkan tabel metadata pada tabel contohpartition_cow
.
ALTER TABLE partition_cow SET TBLPROPERTIES('hudi.metadata-listing-enabled'='TRUE')
Pertimbangan dan batasan
-
Pertanyaan tambahan - Athena tidak mendukung kueri tambahan.
-
CTASAthena tidak mendukung CTASatau INSERT INTO pada data Hudi. Jika Anda ingin dukungan Athena untuk menulis set data Hudi, kirim umpan balik ke
<athena-feedback@amazon.com>
.Untuk informasi selengkapnya tentang penulisan data Hudi, lihat sumber daya berikut:
-
Bekerja dengan kumpulan data Hudi di Panduan EMRRilis Amazon.
-
Menulis Data
dalam dokumentasi Apache Hudi.
-
-
MSCKREPAIRTABLE— Menggunakan tabel MSCK REPAIR TABLE Hudi di Athena tidak didukung. Jika Anda perlu memuat tabel Hudi yang tidak dibuat AWS Glue, gunakanALTER TABLE ADD PARTITION.
-
Melewatkan objek S3 Glacier tidak didukung - Jika objek di tabel Apache Hudi berada dalam kelas penyimpanan Amazon S3 Glacier, menyetel properti tabel agar tidak berpengaruh.
read_restored_glacier_objects
false
Misalnya, Anda mengeluarkan perintah berikut:
ALTER TABLE
table_name
SET TBLPROPERTIES ('read_restored_glacier_objects' = 'false')Untuk tabel Iceberg dan Delta Lake, perintah menghasilkan kesalahan Kunci
properti tabel Tidak didukung
: read_restored_glacier_objects. Untuk tabel Hudi,ALTER TABLE
perintah tidak menghasilkan kesalahan, tetapi objek Amazon S3 Glacier masih belum dilewati. MenjalankanSELECT
kueri setelahALTER TABLE
perintah terus mengembalikan semua objek. -
Kueri stempel waktu — Saat ini, kueri yang mencoba membaca kolom stempel waktu dalam tabel waktu nyata Hudi gagal atau menghasilkan hasil kosong. Batasan ini hanya berlaku untuk kueri yang membaca kolom stempel waktu. Kueri yang hanya menyertakan kolom non-stempel waktu dari tabel yang sama berhasil.
Kueri yang gagal mengembalikan pesan yang mirip dengan berikut ini:
GENERIC_ INTERNAL _ERROR: kelas org.apache.hadoop.io. ArrayWritabletidak dapat dilemparkan ke kelas org.apache.hadoop.hive.serde2.io. TimestampWritableV2 (org.apache.hadoop.io. ArrayWritable dan org.apache.hadoop.hive.serde2.io. TimestampWritableV2 berada dalam modul loader io.trino.server yang tidak disebutkan namanya. PluginClassLoader @75c67992)
Sumber daya tambahan
Untuk sumber daya tambahan tentang penggunaan Apache Hudi dengan Athena, lihat sumber daya berikut.
Video
Video berikut menunjukkan bagaimana Anda dapat menggunakan Amazon Athena untuk mengkueri set data Apache dioptimalkan baca dalam danau data berbasis Amazon S3 Anda.
Unggahan blog
Posting Blog AWS Big Data berikut mencakup deskripsi tentang bagaimana Anda dapat menggunakan Apache Hudi dengan Athena.
Membuat tabel Hudi
Bagian ini memberikan contoh CREATE TABLE pernyataan di Athena untuk tabel data Hudi yang dipartisi dan tidak dipartisi.
Jika Anda memiliki tabel Hudi yang sudah dibuat AWS Glue, Anda dapat menanyakannya langsung di Athena. Saat Anda membuat tabel Hudi yang dipartisi di Athena, Anda harus menjalankan ALTER TABLE
ADD PARTITION
untuk memuat data Hudi sebelum Anda dapat menanyakannya.
Copy on write (CoW) buat contoh tabel
Tabel CoW yang tidak dipartisi
Contoh berikut membuat tabel CoW tidak dipartisi di Athena.
CREATE EXTERNAL TABLE `non_partition_cow`( `_hoodie_commit_time` string, `_hoodie_commit_seqno` string, `_hoodie_record_key` string, `_hoodie_partition_path` string, `_hoodie_file_name` string, `event_id` string, `event_time` string, `event_name` string, `event_guests` int, `event_type` string) ROW FORMAT SERDE 'org.apache.hadoop.hive.ql.io.parquet.serde.ParquetHiveSerDe' STORED AS INPUTFORMAT 'org.apache.hudi.hadoop.HoodieParquetInputFormat' OUTPUTFORMAT 'org.apache.hadoop.hive.ql.io.parquet.MapredParquetOutputFormat' LOCATION 's3://DOC-EXAMPLE-BUCKET/
folder
/non_partition_cow/'
Tabel CoW yang dipartisi
Contoh berikut membuat tabel CoW dipartisi di Athena.
CREATE EXTERNAL TABLE `partition_cow`( `_hoodie_commit_time` string, `_hoodie_commit_seqno` string, `_hoodie_record_key` string, `_hoodie_partition_path` string, `_hoodie_file_name` string, `event_id` string, `event_time` string, `event_name` string, `event_guests` int) PARTITIONED BY ( `event_type` string) ROW FORMAT SERDE 'org.apache.hadoop.hive.ql.io.parquet.serde.ParquetHiveSerDe' STORED AS INPUTFORMAT 'org.apache.hudi.hadoop.HoodieParquetInputFormat' OUTPUTFORMAT 'org.apache.hadoop.hive.ql.io.parquet.MapredParquetOutputFormat' LOCATION 's3://DOC-EXAMPLE-BUCKET/
folder
/partition_cow/'
Contoh ALTER TABLE ADD PARTITION
berikut menambahkan dua partisi ke contoh tabel partition_cow
.
ALTER TABLE partition_cow ADD PARTITION (event_type = 'one') LOCATION 's3://DOC-EXAMPLE-BUCKET/
folder
/partition_cow/one/' PARTITION (event_type = 'two') LOCATION 's3://DOC-EXAMPLE-BUCKET/folder
/partition_cow/two/'
Gabungkan pada read (MoR) buat contoh tabel
Hudi membuat dua tabel di metastore untuk MoR: tabel untuk mengkueri snapshot, dan tabel untuk mengkueri dioptimalkan baca. Kedua tabel dapat dikueri. Dalam versi Hudi sebelum 0.5.1, tabel untuk mengkueri dioptimalkan baca memilini nama yang Anda tentukan saat Anda membuat tabel. Mulai versi Hudi 0.5.1, nama tabel diakhiri dengan _ro
secara default. Nama tabel untuk mengkueri snapshot adalah nama yang Anda tentukan ditambah _rt
.
Penggabungan yang tidak dipartisi pada tabel baca (MoR)
Contoh berikut membuat tabel MoR tidak dipartisi di Athena kueri yang dioptimalkan baca. Perhatikan bahwa dioptimalkan baca menggunakan format input HoodieParquetInputFormat
.
CREATE EXTERNAL TABLE `nonpartition_mor`( `_hoodie_commit_time` string, `_hoodie_commit_seqno` string, `_hoodie_record_key` string, `_hoodie_partition_path` string, `_hoodie_file_name` string, `event_id` string, `event_time` string, `event_name` string, `event_guests` int, `event_type` string) ROW FORMAT SERDE 'org.apache.hadoop.hive.ql.io.parquet.serde.ParquetHiveSerDe' STORED AS INPUTFORMAT 'org.apache.hudi.hadoop.HoodieParquetInputFormat' OUTPUTFORMAT 'org.apache.hadoop.hive.ql.io.parquet.MapredParquetOutputFormat' LOCATION 's3://DOC-EXAMPLE-BUCKET/
folder
/nonpartition_mor/'
Contoh berikut membuat tabel MoR tidak dipartisi di Athena untuk mengkueri snapshot. Untuk kueri snapshot, gunakan format input HoodieParquetRealtimeInputFormat
.
CREATE EXTERNAL TABLE `nonpartition_mor_rt`( `_hoodie_commit_time` string, `_hoodie_commit_seqno` string, `_hoodie_record_key` string, `_hoodie_partition_path` string, `_hoodie_file_name` string, `event_id` string, `event_time` string, `event_name` string, `event_guests` int, `event_type` string) ROW FORMAT SERDE 'org.apache.hadoop.hive.ql.io.parquet.serde.ParquetHiveSerDe' STORED AS INPUTFORMAT 'org.apache.hudi.hadoop.realtime.HoodieParquetRealtimeInputFormat' OUTPUTFORMAT 'org.apache.hadoop.hive.ql.io.parquet.MapredParquetOutputFormat' LOCATION 's3://DOC-EXAMPLE-BUCKET/
folder
/nonpartition_mor/'
Penggabungan yang dipartisi pada tabel baca (MoR)
Contoh berikut membuat tabel MoR dipartisi di Athena untuk mengkueri dioptimalkan baca.
CREATE EXTERNAL TABLE `partition_mor`( `_hoodie_commit_time` string, `_hoodie_commit_seqno` string, `_hoodie_record_key` string, `_hoodie_partition_path` string, `_hoodie_file_name` string, `event_id` string, `event_time` string, `event_name` string, `event_guests` int) PARTITIONED BY ( `event_type` string) ROW FORMAT SERDE 'org.apache.hadoop.hive.ql.io.parquet.serde.ParquetHiveSerDe' STORED AS INPUTFORMAT 'org.apache.hudi.hadoop.HoodieParquetInputFormat' OUTPUTFORMAT 'org.apache.hadoop.hive.ql.io.parquet.MapredParquetOutputFormat' LOCATION 's3://DOC-EXAMPLE-BUCKET/
folder
/partition_mor/'
Contoh ALTER TABLE ADD PARTITION
berikut menambahkan dua partisi ke contoh tabel partition_mor
.
ALTER TABLE partition_mor ADD PARTITION (event_type = 'one') LOCATION 's3://DOC-EXAMPLE-BUCKET/
folder
/partition_mor/one/' PARTITION (event_type = 'two') LOCATION 's3://DOC-EXAMPLE-BUCKET/folder
/partition_mor/two/'
Contoh berikut membuat tabel MoR dipartisi di Athena untuk mengkueri snapshot.
CREATE EXTERNAL TABLE `partition_mor_rt`( `_hoodie_commit_time` string, `_hoodie_commit_seqno` string, `_hoodie_record_key` string, `_hoodie_partition_path` string, `_hoodie_file_name` string, `event_id` string, `event_time` string, `event_name` string, `event_guests` int) PARTITIONED BY ( `event_type` string) ROW FORMAT SERDE 'org.apache.hadoop.hive.ql.io.parquet.serde.ParquetHiveSerDe' STORED AS INPUTFORMAT 'org.apache.hudi.hadoop.realtime.HoodieParquetRealtimeInputFormat' OUTPUTFORMAT 'org.apache.hadoop.hive.ql.io.parquet.MapredParquetOutputFormat' LOCATION 's3://DOC-EXAMPLE-BUCKET/
folder
/partition_mor/'
Demikian pula, contoh berikut ALTER TABLE ADD PARTITION
menambahkan dua partisi ke tabel partition_mor_rt
contoh.
ALTER TABLE partition_mor_rt ADD PARTITION (event_type = 'one') LOCATION 's3://DOC-EXAMPLE-BUCKET/
folder
/partition_mor/one/' PARTITION (event_type = 'two') LOCATION 's3://DOC-EXAMPLE-BUCKET/folder
/partition_mor/two/'
Sumber daya tambahan
-
Untuk informasi tentang penggunaan konektor AWS Glue kustom dan AWS Glue 2.0 pekerjaan untuk membuat tabel Apache Hudi yang dapat Anda kueri dengan Athena, lihat Menulis ke tabel Apache Hudi menggunakan konektor AWS Glue khusus di Blog Big
Data. AWS -
Untuk artikel tentang menggunakan Apache Hudi, AWS Glue, dan Amazon Athena untuk membangun kerangka pemrosesan data untuk data lake, lihat Menyederhanakan pemrosesan data operasional di danau data AWS Glue menggunakan dan Apache Hudi di Blog Big Data
. AWS