Terjemahan disediakan oleh mesin penerjemah. Jika konten terjemahan yang diberikan bertentangan dengan versi bahasa Inggris aslinya, utamakan versi bahasa Inggris.
Tugas extract, transform, and load (ETL) Anda mungkin membuat partisi tabel baru di penyimpanan data target. Skema dataset Anda dapat berkembang dan menyimpang dari AWS Glue Skema Katalog Data dari waktu ke waktu. AWS Glue Tugas ETL sekarang menyediakan beberapa fitur yang dapat Anda gunakan dalam skrip ETL Anda untuk memperbarui skema dan partisi dalam Katalog Data. Fitur ini memungkinkan Anda untuk melihat hasil tugas ETL Anda di Katalog Data, tanpa harus menjalankan kembali crawler.
Partisi baru
Jika Anda ingin melihat partisi baru di AWS Glue Data Catalog, Anda dapat melakukan salah satu hal berikut:
-
Setelah tugas selesai, jalankan kembali crawler, dan lihat partisi baru di konsol tersebut saat crawler selesai.
-
Setelah tugas selesai, segera lihat partisi baru di konsol tersebut, tanpa harus menjalankan ulang crawler. Anda dapat mengaktifkan fitur ini dengan menambahkan beberapa baris kode pada skrip ETL Anda, seperti yang ditunjukkan dalam contoh berikut. Kode menggunakan argumen
enableUpdateCatalog
untuk menunjukkan bahwa Katalog Data akan diperbarui selama eksekusi tugas saat partisi baru dibuat.
- Metode 1
-
Berikan
enableUpdateCatalog
danpartitionKeys
dalam sebuah argumen pilihan.additionalOptions = {"enableUpdateCatalog": True} additionalOptions["partitionKeys"] = ["region", "year", "month", "day"] sink = glueContext.write_dynamic_frame_from_catalog(frame=last_transform, database=
<target_db_name>
, table_name=<target_table_name>
, transformation_ctx="write_sink", additional_options=additionalOptions) - Metode 2
-
Berikan
enableUpdateCatalog
danpartitionKeys
dalamgetSink()
, dan panggilsetCatalogInfo()
di objekDataSink
.sink = glueContext.getSink( connection_type="s3", path="
<S3_output_path>
", enableUpdateCatalog=True, partitionKeys=["region", "year", "month", "day"]) sink.setFormat("json") sink.setCatalogInfo(catalogDatabase=<target_db_name>
, catalogTableName=<target_table_name>
) sink.writeFrame(last_transform)
Sekarang, Anda dapat membuat tabel katalog baru, memperbarui tabel yang ada dengan skema yang dimodifikasi, dan menambahkan partisi tabel baru di Katalog Data menggunakan AWS Glue ETL bekerja sendiri, tanpa perlu menjalankan kembali crawler.
Memperbarui skema tabel
Jika Anda ingin menimpa skema tabel Katalog Data Anda, Anda dapat melakukan salah satu hal berikut:
Setelah tugas selesai, jalankan kembali crawler dan pastikan crawler dikonfigurasi untuk memperbarui definisi tabel juga. Lihat partisi baru di konsol tersebut beserta pembaruan skema apa pun, saat crawler selesai. Untuk informasi selengkapnya, lihat Mengkonfigurasi Crawler Menggunakan API.
Setelah tugas selesai, segera lihat skema yang sudah dimodifikasi di konsol tersebut, tanpa harus menjalankan ulang crawler. Anda dapat mengaktifkan fitur ini dengan menambahkan beberapa baris kode pada skrip ETL Anda, seperti yang ditunjukkan dalam contoh berikut. Kode menggunakan
enableUpdateCatalog
yang diatur ke BETUL, dan jugaupdateBehavior
yang diatur keUPDATE_IN_DATABASE
, yang menunjukkan untuk menimpa skema dan menambahkan partisi baru dalam Katalog Data selama eksekusi tugas.
additionalOptions = { "enableUpdateCatalog": True, "updateBehavior": "UPDATE_IN_DATABASE"} additionalOptions["partitionKeys"] = ["partition_key0", "partition_key1"] sink = glueContext.write_dynamic_frame_from_catalog(frame=last_transform, database=
<dst_db_name>
, table_name=<dst_tbl_name>
, transformation_ctx="write_sink", additional_options=additionalOptions) job.commit()
Anda juga dapat mengatur nilai updateBehavior
ke LOG
jika Anda ingin mencegah skema tabel Anda agar tidak ditimpa, tapi masih ingin menambahkan partisi baru. Nilai default dari updateBehavior
adalah UPDATE_IN_DATABASE
, jadi jika Anda tidak secara eksplisit mendefinisikannya, maka skema tabel akan ditimpa.
Jika enableUpdateCatalog
tidak diatur ke BETUL, terlepas dari mana pilihan yang dipilih untuk updateBehavior
, tugas ETL tidak akan memperbarui tabel di Katalog Data.
Membuat tabel baru
Anda juga dapat menggunakan opsi yang sama untuk membuat sebuah tabel baru di Katalog Data. Anda dapat menentukan basis data dan nama tabel baru dengan menggunakan setCatalogInfo
.
sink = glueContext.getSink(connection_type="s3", path="s3://path/to/data", enableUpdateCatalog=True, updateBehavior="UPDATE_IN_DATABASE", partitionKeys=["partition_key0", "partition_key1"]) sink.setFormat("<format>") sink.setCatalogInfo(catalogDatabase=
<dst_db_name>
, catalogTableName=<dst_tbl_name>
) sink.writeFrame(last_transform)
Pembatasan
Perhatikan pembatasan-pembatasan berikut ini:
-
Hanya target Amazon Simple Storage Service (Amazon S3) saja yang didukung.
-
enableUpdateCatalog
Fitur ini tidak didukung untuk tabel yang diatur. -
Hanya format berikut ini didukung:
json
,csv
,avro
, danparquet
. -
Untuk membuat atau memperbarui tabel dengan
parquet
klasifikasi, Anda harus menggunakan AWS Glue penulis parket yang dioptimalkan untuk DynamicFrames. Ini dapat dicapai dengan salah satu dari yang berikut:-
Jika Anda memperbarui tabel yang ada dalam katalog dengan
parquet
klasifikasi, tabel harus memiliki properti"useGlueParquetWriter"
tabel yang disetel ketrue
sebelum Anda memperbaruinya. Anda dapat mengatur properti ini melalui AWS Glue APIs /SDK, melalui konsol atau melalui pernyataan Athena DDL.Setelah properti tabel katalog diatur, Anda dapat menggunakan cuplikan kode berikut untuk memperbarui tabel katalog dengan data baru:
glueContext.write_dynamic_frame.from_catalog( frame=
frameToWrite
, database="dbName
", table_name="tableName
", additional_options={ "enableUpdateCatalog": True, "updateBehavior": "UPDATE_IN_DATABASE" } ) -
Jika tabel belum ada dalam katalog, Anda dapat menggunakan
getSink()
metode dalam skrip Andaconnection_type="s3"
untuk menambahkan tabel dan partisi ke katalog, bersama dengan menulis data ke Amazon S3. Berikan yang sesuaipartitionKeys
dancompression
untuk alur kerja Anda.s3sink = glueContext.getSink( path="s3://
bucket/folder/
", connection_type="s3", updateBehavior="UPDATE_IN_DATABASE", partitionKeys=[], compression="snappy", enableUpdateCatalog=True ) s3sink.setCatalogInfo( catalogDatabase="dbName
", catalogTableName="tableName
" ) s3sink.setFormat("parquet", useGlueParquetWriter=True) s3sink.writeFrame(frameToWrite
) -
Nilai
glueparquet
format adalah metode warisan yang memungkinkan penulis AWS Glue parket.
-
-
Saat
updateBehavior
diatur keLOG
, partisi baru akan ditambahkan hanya jika skemaDynamicFrame
setara dengan atau berisi sebuah subset dari kolom yang didefinisikan dalam skema tabel Katalog Data. -
Pembaruan skema tidak didukung untuk tabel non-partisi (tidak menggunakan opsi “PartitionKeys”).
-
PartitionKeys Anda harus setara, dan dalam urutan yang sama, antara parameter Anda yang diberikan dalam skrip ETL dan PartitionKeys dalam skema tabel Katalog Data Anda.
-
Fitur ini saat ini belum men-support pembaruan/pembuatan tabel di mana skema yang memperbarui bersarang (misalnya, array dalam struct).
Untuk informasi selengkapnya, lihat Pemrograman skrip Spark.