Mengelola partisi untuk output ETL 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.

Mengelola partisi untuk output ETL di AWS Glue

Pemartisian merupakan teknik penting untuk mengatur set data sehingga mereka dapat di-kueri secara efisien. Ia mengatur data dalam sebuah struktur direktori hirarkis berdasarkan nilai-nilai yang berbeda dari satu atau beberapa kolom.

Misalnya, Anda dapat memutuskan untuk melakukan partisi pada log aplikasi Anda di Amazon Simple Storage Service (Amazon S3) berdasarkan tanggal, dirinci berdasarkan tahun, bulan, dan hari. File yang sesuai dengan data satu hari, kemudian ditempatkan dengan prefiks seperti s3://my_bucket/logs/year=2018/month=01/day=23/. Sistem seperti Amazon Athena, Amazon Redshift Spectrum, dan AWS Glue sekarang dapat menggunakan partisi ini untuk memfilter data berdasarkan nilai partisi tanpa harus membaca semua data yang mendasarinya dari Amazon S3.

Crawler tidak hanya menyimpulkan jenis file dan skema, crawler juga secara otomatis mengidentifikasi struktur partisi set data Anda ketika mereka mengisi Katalog Data Glue AWS. Kolom partisi yang dihasilkan tersedia untuk kueri dalam pekerjaan AWS Glue ETL atau mesin kueri seperti Amazon Athena.

Setelah melakukan perayapan pada tabel, Anda dapat melihat partisi yang dibuat crawler. Di AWS Glue konsol, pilih Tabel di panel navigasi kiri. Pilih tabel yang dibuat oleh crawler, lalu pilih Lihat partisi.

Untuk path yang dipartisi dengan gaya Apache Hive di key=val, crawler secara otomatis mengisi nama kolom menggunakan nama kunci. Jika tidak, ia menggunakan nama default seperti partition_0, partition_1, dan sebagainya. Anda dapat mengubah nama default di konsol. Untuk melakukannya, arahkan ke tabel. Periksa apakah indeks ada di bawah tab Indeks. Jika itu masalahnya, Anda perlu menghapusnya untuk melanjutkan (Anda dapat membuatnya kembali menggunakan nama kolom baru setelahnya). Kemudian, pilih Edit Skema, dan ubah nama kolom partisi di sana.

Dalam skrip ETL Anda, Anda kemudian dapat mem-filter pada kolom partisi. Karena informasi partisi disimpan dalam Katalog Data, gunakan panggilan API from_catalog untuk menyertakan kolom partisi di DynamicFrame. Misalnya, gunakan create_dynamic_frame.from_catalog sebagai ganti dari create_dynamic_frame.from_options.

Partisi adalah teknik optimasi yang mengurangi pemindaian data. Untuk informasi lebih lanjut tentang proses mengidentifikasi kapan teknik ini tepat, lihat Mengurangi jumlah pemindaian data dalam Panduan Pekerjaan AWS Glue for Apache Spark Praktik Terbaik untuk Penyetelan Kinerja di AWS Panduan Preskriptif.

Pra-penyaringan menggunakan predikat pushdown

Dalam banyak kasus, Anda dapat menggunakan predikat pushdown untuk mem-filter pada partisi tanpa harus mencantumkan dan membaca semua file dalam set data Anda. Alih-alih membaca seluruh kumpulan data dan kemudian memfilter di a DynamicFrame, Anda dapat menerapkan filter langsung pada metadata partisi di Katalog Data. Kemudian Anda hanya membuat daftar dan membaca apa yang sebenarnya Anda butuhkan ke dalam DynamicFrame.

Misalnya, dengan Python, Anda bisa menulis yang berikut ini.

glue_context.create_dynamic_frame.from_catalog( database = "my_S3_data_set", table_name = "catalog_data_table", push_down_predicate = my_partition_predicate)

Ini menciptakan sebuah DynamicFrame yang memuat hanya partisi dalam Katalog Data yang memenuhi ekspresi predikat. Tergantung pada seberapa kecil subset data yang Anda muat, hal ini dapat menghemat banyak waktu pemrosesan.

Ekspresi predikat dapat berupa ekspresi Boolean yang didukung oleh Spark SQL. Apa pun yang Anda bisa masukkan ke dalam klausul WHERE dalam kueri Spark SQL akan bisa digunakan. Misalnya, ekspresi predikat pushDownPredicate = "(year=='2017' and month=='04')" memuat hanya partisi dalam Katalog Data yang memiliki year sama dengan 2017 dan month sama dengan 04. Untuk informasi lebih lanjut, lihat dokumentasi Apache Spark SQL, dan khususnya, referensi fungsi Scala SQL.

Pemfilteran sisi server menggunakan predikat partisi katalog

push_down_predicateOpsi ini diterapkan setelah mencantumkan semua partisi dari katalog dan sebelum mencantumkan file dari Amazon S3 untuk partisi tersebut. Jika Anda memiliki banyak partisi untuk sebuah tabel, daftar partisi katalog masih dapat menimbulkan overhead waktu tambahan. Untuk mengatasi overhead ini, Anda dapat menggunakan pemangkasan partisi sisi server dengan catalogPartitionPredicate opsi yang menggunakan indeks partisi di Katalog Data Glue. AWS Ini membuat pemfilteran partisi jauh lebih cepat ketika Anda memiliki jutaan partisi dalam satu tabel. Anda dapat menggunakan keduanya push_down_predicate dan catalogPartitionPredicate additional_options bersama-sama jika Anda catalogPartitionPredicate memerlukan sintaks predikat yang belum didukung dengan indeks partisi katalog.

Python:

dynamic_frame = glueContext.create_dynamic_frame.from_catalog( database=dbname, table_name=tablename, transformation_ctx="datasource0", push_down_predicate="day>=10 and customer_id like '10%'", additional_options={"catalogPartitionPredicate":"year='2021' and month='06'"} )

Scala:

val dynamicFrame = glueContext.getCatalogSource( database = dbname, tableName = tablename, transformationContext = "datasource0", pushDownPredicate="day>=10 and customer_id like '10%'", additionalOptions = JsonOptions("""{ "catalogPartitionPredicate": "year='2021' and month='06'"}""") ).getDynamicFrame()
catatan

push_down_predicateDan catalogPartitionPredicate menggunakan sintaks yang berbeda. Yang pertama menggunakan sintaks standar Spark SQL dan yang kemudian menggunakan parser JSQL.

Menulis partisi

Secara default, a tidak DynamicFrame dipartisi saat ditulis. Semua file output ditulis di tingkat atas dari path output yang ditentukan. Sampai saat ini, satu-satunya cara untuk menulis DynamicFrame menjadi partisi adalah mengubahnya menjadi Spark SQL DataFrame sebelum menulis.

Namun, DynamicFrames sekarang mendukung partisi asli menggunakan urutan kunci, menggunakan partitionKeys opsi saat Anda membuat wastafel. Sebagai contoh, kode Python berikut menuliskan set data ke Amazon S3 dalam format Parquet, ke direktori yang dipartisi oleh bidang jenis. Dari sana, Anda dapat memproses partisi ini dengan menggunakan sistem lain, seperti Amazon Athena.

glue_context.write_dynamic_frame.from_options( frame = projectedEvents, connection_type = "s3", connection_options = {"path": "$outpath", "partitionKeys": ["type"]}, format = "parquet")