Menggunakan format CSV 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 CSV di AWS Glue

AWSGlue 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 CSV, dokumen ini memperkenalkan fitur yang tersedia untuk menggunakan data Anda di Glue. AWS

AWSGlue mendukung penggunaan format comma-separated value (CSV). Format ini adalah format data berbasis baris minimal. CSV sering tidak sepenuhnya sesuai dengan standar, tetapi Anda dapat merujuk ke RFC 4180 dan RFC 7111 untuk informasi lebih lanjut.

Anda dapat menggunakan AWS Glue untuk membaca CSV dari Amazon S3 dan dari sumber streaming serta menulis CSV ke Amazon S3. Anda dapat membaca dan menulis bzip dan gzip mengarsipkan yang berisi file CSV dari S3. Anda mengonfigurasi perilaku kompresi pada Parameter koneksi S3 alih-alih dalam konfigurasi yang dibahas di halaman ini.

Tabel berikut menunjukkan fitur AWS Glue umum mana yang mendukung opsi format CSV.

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

Contoh: Baca file CSV atau folder dari S3

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

Konfigurasi: Dalam opsi fungsi Anda, tentukanformat="csv". Dalam Andaconnection_options, gunakan paths kunci untuk menentukans3path. Anda dapat mengonfigurasi bagaimana pembaca berinteraksi dengan S3 di. connection_options Untuk detailnya, lihat Jenis dan opsi koneksi untuk ETL di AWS Glue:Parameter koneksi S3. Anda dapat mengonfigurasi bagaimana pembaca menafsirkan file CSV di file Anda. format_options Untuk detailnya, lihat Referensi Konfigurasi CSV.

Skrip AWS Glue ETL berikut menunjukkan proses membaca file CSV atau folder dari S3.

Kami menyediakan pembaca CSV kustom dengan pengoptimalan kinerja untuk alur kerja umum melalui kunci konfigurasi. optimizePerformance Untuk menentukan apakah pembaca ini tepat untuk beban kerja Anda, lihatOptimalkan kinerja baca dengan pembaca SIMD CSV vektor.

Python

Untuk contoh ini, gunakan metode create_dynamic_frame.from_options.

# Example: Read CSV from S3 # For show, we handle a CSV with a header row. Set the withHeader option. # 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="csv", format_options={ "withHeader": True, # "optimizePerformance": True, }, )

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

dataFrame = spark.read\ .format("csv")\ .option("header", "true")\ .load("s3://s3path")
Scala

Untuk contoh ini, gunakan operasi getSourceWithFormat.

// Example: Read CSV from S3 // For show, we handle a CSV with a header row. Set the withHeader option. // 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("""{"withHeader": true}"""), connectionType="s3", format="csv", options=JsonOptions("""{"paths": ["s3://s3path"], "recurse": true}""") ).getDynamicFrame() } }

Anda juga dapat menggunakan DataFrames dalam script (org.apache.spark.sql.DataFrame).

val dataFrame = spark.read .option("header","true") .format("csv") .load("s3://s3path“)

Contoh: Tulis file dan folder CSV ke S3

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

Konfigurasi: Dalam opsi fungsi Anda, tentukanformat="csv". Dalam Andaconnection_options, gunakan paths kunci untuk menentukans3path. Anda dapat mengonfigurasi bagaimana penulis berinteraksi dengan S3 di. connection_options Untuk detailnya, lihat Jenis dan opsi koneksi untuk ETL di AWS Glue:Parameter koneksi S3. Anda dapat mengonfigurasi bagaimana operasi Anda menulis konten file Andaformat_options. Untuk detailnya, lihat Referensi Konfigurasi CSV. Skrip AWS Glue ETL berikut menunjukkan proses penulisan file CSV dan folder ke S3.

Python

Untuk contoh ini, gunakan metode write_dynamic_frame.from_options.

# Example: Write CSV to S3 # For show, customize how we write string type values. Set quoteChar to -1 so our values are not quoted. 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="csv", format_options={ "quoteChar": -1, }, )

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

dataFrame.write\ .format("csv")\ .option("quote", None)\ .mode("append")\ .save("s3://s3path")
Scala

Untuk contoh ini, gunakan metode getSinkWithFormat.

// Example: Write CSV to S3 // For show, customize how we write string type values. Set quoteChar to -1 so our values are not quoted. 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="csv" ).writeDynamicFrame(dynamicFrame) } }

Anda juga dapat menggunakan DataFrames dalam script (org.apache.spark.sql.DataFrame).

dataFrame.write .format("csv") .option("quote", null) .mode("Append") .save("s3://s3path")

Referensi konfigurasi CSV

Anda dapat menggunakan yang berikut ini di format_options mana pun pustaka AWS Glue menentukanformat="csv":

  • separator—Menentukan karakter pembatas. Defaultnya adalah koma, tetapi karakter lain dapat ditentukan.

    • Jenis: Teks, Default: ","

  • escaper- Menentukan karakter yang akan digunakan untuk melarikan diri. Opsi ini hanya digunakan saat membaca file CSV, bukan menulis. Jika diaktifkan, karakter yang segera mengikuti digunakan apa adanya, kecuali untuk satu set kecil pelarian terkenal (\n,, \r\t, dan\0).

    • Jenis: Teks, Default: tidak ada

  • quoteChar- Menentukan karakter yang akan digunakan untuk mengutip. Defaultnya adalah kutipan ganda. Atur ini ke -1 untuk menonaktifkan pengutipan seluruhnya.

    • Jenis: Teks, Default: '"'

  • multiLine- Menentukan apakah catatan tunggal dapat menjangkau 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. Mengaktifkan multiLine dapat menurunkan kinerja karena membutuhkan pemisahan file yang lebih hati-hati saat mengurai.

    • Jenis: Boolean, Default: false

  • withHeader- Menentukan apakah untuk memperlakukan baris pertama sebagai header. Opsi ini dapat digunakan dalam kelas DynamicFrameReader.

    • Jenis: Boolean, Default: false

  • writeHeader- Menentukan apakah akan menulis header untuk output. Opsi ini dapat digunakan dalam kelas DynamicFrameWriter.

    • Jenis: Boolean, Default: true

  • skipFirst- Menentukan apakah akan melewati baris data pertama.

    • Jenis: Boolean, Default: false

  • optimizePerformance— Menentukan apakah akan menggunakan pembaca CSV SIMD canggih bersama dengan format memori kolumnar berbasis Apache Arrow. Hanya tersedia dalam AWS Glue 3.0+.

    • Jenis: Boolean, Default: false

  • strictCheckForQuoting— Saat menulis CSV, Glue dapat menambahkan tanda kutip ke nilai yang ditafsirkan sebagai string. Ini dilakukan untuk mencegah ambiguitas dalam apa yang tertulis. Untuk menghemat waktu ketika memutuskan apa yang akan ditulis, Glue dapat mengutip dalam situasi tertentu di mana kutipan tidak diperlukan. Mengaktifkan pemeriksaan ketat akan melakukan perhitungan yang lebih intensif dan hanya akan mengutip jika benar-benar diperlukan. Hanya tersedia dalam AWS Glue 3.0+.

    • Jenis: Boolean, Default: false

Optimalkan kinerja baca dengan pembaca SIMD CSV vektor

AWS Glueversi 3.0 menambahkan pembaca CSV yang dioptimalkan yang secara signifikan dapat mempercepat kinerja pekerjaan secara keseluruhan dibandingkan dengan pembaca CSV berbasis baris.

Pembaca yang dioptimalkan:

  • Menggunakan instruksi CPU SIMD untuk membaca dari disk

  • Segera menulis catatan ke memori dalam format kolom (Apache Arrow)

  • Membagi catatan menjadi batch

Ini menghemat waktu pemrosesan ketika catatan akan di-batch atau dikonversi ke format kolumnar nanti. Beberapa contoh adalah ketika mengubah skema atau mengambil data berdasarkan kolom.

Untuk menggunakan pembaca yang dioptimalkan, atur "optimizePerformance" ke true dalam properti format_options or table.

glueContext.create_dynamic_frame.from_options( frame = datasource1, connection_type = "s3", connection_options = {"paths": ["s3://s3path"]}, format = "csv", format_options={ "optimizePerformance": True, "separator": "," }, transformation_ctx = "datasink2")
Keterbatasan untuk pembaca CSV vektor

Perhatikan batasan berikut dari pembaca CSV vektor:

  • Itu tidak mendukung opsi multiLine dan escaper format. Ini menggunakan default escaper karakter kutipan ganda. '"' Ketika opsi ini disetel, AWS Glue secara otomatis kembali menggunakan pembaca CSV berbasis baris.

  • Itu tidak mendukung pembuatan DynamicFrame dengan ChoiceType.

  • Itu tidak mendukung pembuatan catatan kesalahan DynamicFrame dengan.

  • Itu tidak mendukung membaca file CSV dengan karakter multibyte seperti karakter Jepang atau China.