Menggunakan format JSON 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.

Menggunakan format JSON di AWS Glue

AWS Glue mengambil data dari sumber dan menulis data ke target yang disimpan dan diangkut dalam berbagai format data. Jika data Anda disimpan atau diangkut dalam format data JSON, dokumen ini memperkenalkan Anda ke fitur yang tersedia untuk menggunakan data Anda di Glue. AWS

AWS Glue mendukung menggunakan format JSON. Format ini mewakili struktur data dengan bentuk yang konsisten tetapi konten fleksibel, yang tidak berbasis baris atau kolom. JSON didefinisikan oleh standar paralel yang dikeluarkan oleh beberapa otoritas, salah satunya adalah ECMA-404. Untuk pengenalan format oleh sumber yang sering direferensikan, lihat Memperkenalkan JSON.

Anda dapat menggunakan AWS Glue untuk membaca file JSON dari Amazon S3, bzip serta file JSON gzip terkompresi. Anda mengonfigurasi perilaku kompresi pada Parameter koneksi S3 alih-alih dalam konfigurasi yang dibahas di halaman ini.

Baca Tulis Streaming dibaca Kelompokkan file kecil Bookmark tugas
Didukung Didukung Didukung Didukung Didukung

Contoh: Baca file atau folder JSON dari S3

Prasyarat: Anda akan memerlukan jalur S3 (s3path) ke file atau folder JSON yang ingin Anda baca.

Konfigurasi: Dalam opsi fungsi Anda, tentukanformat="json". Dalam Andaconnection_options, gunakan paths kunci untuk menentukan Andas3path. Anda dapat lebih lanjut mengubah bagaimana operasi baca Anda akan melintasi s3 dalam opsi koneksi, berkonsultasi untuk detailnya. Referensi opsi koneksi Amazon S3 Anda dapat mengonfigurasi bagaimana pembaca menafsirkan file JSON di file Anda. format_options Untuk detailnya, lihat Referensi Konfigurasi JSON.

Berikut skrip AWS Glue ETL menunjukkan proses membaca file JSON atau folder dari S3:

Python

Untuk contoh ini, gunakan metode create_dynamic_frame.from_options.

# Example: Read JSON from S3 # For show, we handle a nested JSON file that we can limit with the JsonPath parameter # For show, we also handle a JSON where a single entry spans multiple lines # Consider whether optimizePerformance is right for your workflow. from pyspark.context import SparkContext from awsglue.context import GlueContext sc = SparkContext.getOrCreate() glueContext = GlueContext(sc) spark = glueContext.spark_session dynamicFrame = glueContext.create_dynamic_frame.from_options( connection_type="s3", connection_options={"paths": ["s3://s3path"]}, format="json", format_options={ "jsonPath": "$.id", "multiline": True, # "optimizePerformance": True, -> not compatible with jsonPath, multiline } )

Anda juga dapat menggunakan DataFrames dalam script (pyspark.sql.DataFrame).

dataFrame = spark.read\ .option("multiLine", "true")\ .json("s3://s3path")
Scala

Untuk contoh ini, gunakan operasi getSourceWithFormat.

// Example: Read JSON from S3 // For show, we handle a nested JSON file that we can limit with the JsonPath parameter // For show, we also handle a JSON where a single entry spans multiple lines // Consider whether optimizePerformance is right for your workflow. import com.amazonaws.services.glue.util.JsonOptions import com.amazonaws.services.glue.{DynamicFrame, GlueContext} import org.apache.spark.SparkContext object GlueApp { def main(sysArgs: Array[String]): Unit = { val spark: SparkContext = new SparkContext() val glueContext: GlueContext = new GlueContext(spark) val dynamicFrame = glueContext.getSourceWithFormat( formatOptions=JsonOptions("""{"jsonPath": "$.id", "multiline": true, "optimizePerformance":false}"""), connectionType="s3", format="json", options=JsonOptions("""{"paths": ["s3://s3path"], "recurse": true}""") ).getDynamicFrame() } }

Anda juga dapat menggunakan DataFrames dalam script (pyspark.sql.DataFrame).

val dataFrame = spark.read .option("multiLine", "true") .json("s3://s3path")

Contoh: Tulis file dan folder JSON ke S3

Prasyarat: Anda akan memerlukan initialized DataFrame () atau ()dataFrame. DynamicFrame dynamicFrame Anda juga akan membutuhkan jalur output S3 yang Anda harapkan,s3path.

Konfigurasi: Dalam opsi fungsi Anda, tentukanformat="json". Dalam Andaconnection_options, gunakan paths kunci untuk menentukans3path. Anda selanjutnya dapat mengubah cara penulis berinteraksi dengan S3 di. connection_options Untuk detailnya, lihat Opsi format data untuk input dan output ETL di Glue AWS :. Referensi opsi koneksi Amazon S3 Anda dapat mengonfigurasi bagaimana penulis menafsirkan file JSON di file Anda. format_options Untuk detailnya, lihat Referensi Konfigurasi JSON.

Berikut skrip AWS Glue ETL menunjukkan proses penulisan file JSON atau folder dari S3:

Python

Untuk contoh ini, gunakan metode write_dynamic_frame.from_options.

# Example: Write JSON to S3 from pyspark.context import SparkContext from awsglue.context import GlueContext sc = SparkContext.getOrCreate() glueContext = GlueContext(sc) glueContext.write_dynamic_frame.from_options( frame=dynamicFrame, connection_type="s3", connection_options={"path": "s3://s3path"}, format="json" )

Anda juga dapat menggunakan DataFrames dalam script (pyspark.sql.DataFrame).

df.write.json("s3://s3path/")
Scala

Untuk contoh ini, gunakan metode getSinkWithFormat.

// Example: Write JSON to S3 import com.amazonaws.services.glue.util.JsonOptions import com.amazonaws.services.glue.{DynamicFrame, GlueContext} import org.apache.spark.SparkContext object GlueApp { def main(sysArgs: Array[String]): Unit = { val spark: SparkContext = new SparkContext() val glueContext: GlueContext = new GlueContext(spark) glueContext.getSinkWithFormat( connectionType="s3", options=JsonOptions("""{"path": "s3://s3path"}"""), format="json" ).writeDynamicFrame(dynamicFrame) } }

Anda juga dapat menggunakan DataFrames dalam script (pyspark.sql.DataFrame).

df.write.json("s3://s3path")

Referensi konfigurasi Json

Anda dapat menggunakan nilai format_options berikut dengan format="json":

  • jsonPathJsonPathEkspresi yang mengidentifikasi objek yang akan dibaca ke dalam catatan. Hal ini sangat berguna ketika sebuah file berisi catatan bersarang di dalam array luar. Misalnya, JsonPath ekspresi berikut menargetkan id bidang objek JSON.

    format="json", format_options={"jsonPath": "$.id"}
  • multiLine — Nilai Boolean yang menentukan apakah satu catatan dapat memiliki panjang hingga beberapa baris. Hal ini dapat terjadi ketika bidang berisi karakter baris baru yang dikutip. Anda harus menetapkan opsi ini ke "true" jika ada catatan yang mencakup beberapa baris. Nilai default-nya adalah "false", yang memungkinkan untuk pemecahan file yang lebih agresif selama penguraian.

  • optimizePerformance— Nilai Boolean yang menentukan apakah akan menggunakan pembaca SIMD JSON tingkat lanjut bersama dengan format memori kolumnar berbasis Apache Arrow. Hanya tersedia di AWS Glue 3.0. Tidak kompatibel dengan multiLine ataujsonPath. Menyediakan salah satu dari opsi tersebut akan menginstruksikan AWS Glue untuk kembali ke pembaca standar.

  • withSchema— Nilai String yang menentukan skema tabel dalam format yang dijelaskan dalam. Tentukan skema XMLnya secara manual Hanya digunakan dengan optimizePerformance saat membaca dari koneksi non-Katalog.

Menggunakan pembaca SIMD JSON vektor dengan format kolom Apache Arrow

AWS Glueversi 3.0 menambahkan pembaca vektor untuk data JSON. Ini melakukan 2x lebih cepat dalam kondisi tertentu, dibandingkan dengan pembaca standar. Pembaca ini dilengkapi dengan batasan tertentu yang harus diperhatikan pengguna sebelum digunakan, didokumentasikan di bagian ini.

Untuk menggunakan pembaca yang dioptimalkan, atur "optimizePerformance" ke True di properti format_options or table. Anda juga perlu menyediakan withSchema kecuali membaca dari katalog. withSchemamengharapkan masukan seperti yang dijelaskan dalam Tentukan skema XMLnya secara manual

// Read from S3 data source glueContext.create_dynamic_frame.from_options( connection_type = "s3", connection_options = {"paths": ["s3://s3path"]}, format = "json", format_options={ "optimizePerformance": True, "withSchema": SchemaString }) // Read from catalog table glueContext.create_dynamic_frame.from_catalog( database = database, table_name = table, additional_options = { // The vectorized reader for JSON can read your schema from a catalog table property. "optimizePerformance": True, })

Untuk informasi lebih lanjut tentang bangunan a SchemaStringdi perpustakaan AWS Glue, lihatPySpark jenis ekstensi.

Keterbatasan untuk pembaca CSV vektor

Perhatikan batasan berikut:

  • Elemen JSON dengan objek bersarang atau nilai array tidak didukung. Jika disediakan, AWS Glue akan kembali ke pembaca standar.

  • Skema harus disediakan, baik dari Katalog atau denganwithSchema.

  • Tidak kompatibel dengan multiLine ataujsonPath. Menyediakan salah satu dari opsi tersebut akan menginstruksikan AWS Glue untuk kembali ke pembaca standar.

  • Menyediakan catatan masukan yang tidak sesuai dengan skema masukan akan menyebabkan pembaca gagal.

  • Catatan kesalahan tidak akan dibuat.

  • File JSON dengan karakter multi-byte (seperti karakter Jepang atau China) tidak didukung.