

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
<a name="aws-glue-programming-etl-format-csv-home"></a>

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

 AWS Glue mendukung penggunaan format comma-separated value (CSV). Format ini adalah format data berbasis baris minimal. CSVs sering tidak sepenuhnya sesuai dengan standar, tetapi Anda dapat merujuk ke [RFC 4180 dan RFC](https://tools.ietf.org/html/rfc4180) [7111](https://tools.ietf.org/html/rfc7111) untuk informasi lebih lanjut. 

Anda dapat menggunakan AWS Glue untuk membaca CSVs dari Amazon S3 dan dari sumber streaming serta menulis CSVs 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](aws-glue-programming-etl-connect-s3-home.md#aws-glue-programming-etl-connect-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
<a name="aws-glue-programming-etl-format-csv-read"></a>

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

 **Konfigurasi:** Dalam opsi fungsi Anda, tentukan`format="csv"`. Dalam Anda`connection_options`, gunakan `paths` kunci untuk menentukan`s3path`. 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](aws-glue-programming-etl-connect-s3-home.md#aws-glue-programming-etl-connect-s3). Anda dapat mengonfigurasi bagaimana pembaca menafsirkan file CSV di file Anda. `format_options` Untuk detailnya, lihat [Referensi Konfigurasi CSV](#aws-glue-programming-etl-format-csv-reference). 

Berikut skrip AWS Glue ETL menunjukkan proses membaca file CSV atau folder dari S3.

 Kami menyediakan pembaca CSV khusus dengan pengoptimalan kinerja untuk alur kerja umum melalui kunci konfigurasi. `optimizePerformance` Untuk menentukan apakah pembaca ini tepat untuk beban kerja Anda, lihat[Optimalkan kinerja baca dengan pembaca SIMD CSV vektor](#aws-glue-programming-etl-format-simd-csv-reader). 

------
#### [ Python ]

Untuk contoh ini, gunakan metode [create\$1dynamic\$1frame.from\$1options](aws-glue-api-crawler-pyspark-extensions-glue-context.md#aws-glue-api-crawler-pyspark-extensions-glue-context-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](glue-etl-scala-apis-glue-gluecontext.md#glue-etl-scala-apis-glue-gluecontext-defs-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
<a name="aws-glue-programming-etl-format-csv-write"></a>

 **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, tentukan`format="csv"`. Dalam Anda`connection_options`, gunakan `paths` kunci untuk menentukan`s3path`. 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](aws-glue-programming-etl-connect-s3-home.md#aws-glue-programming-etl-connect-s3). Anda dapat mengonfigurasi bagaimana operasi Anda menulis konten file Anda`format_options`. Untuk detailnya, lihat [Referensi Konfigurasi CSV](#aws-glue-programming-etl-format-csv-reference). Skrip AWS Glue ETL berikut menunjukkan proses penulisan file CSV dan folder ke S3. 

------
#### [ Python ]

Untuk contoh ini, gunakan metode [write\$1dynamic\$1frame.from\$1options](aws-glue-api-crawler-pyspark-extensions-glue-context.md#aws-glue-api-crawler-pyspark-extensions-glue-context-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](glue-etl-scala-apis-glue-gluecontext.md#glue-etl-scala-apis-glue-gluecontext-defs-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
<a name="aws-glue-programming-etl-format-csv-reference"></a>

Anda dapat menggunakan yang berikut ini di `format_options` mana pun pustaka AWS Glue menentukan`format="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\$1.
  + **Jenis:** Boolean, **Default**: `false`
+ `strictCheckForQuoting`— Saat menulis CSVs, Glue dapat menambahkan tanda kutip ke nilai yang ditafsirkan sebagai string. Hal 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\$1.
  + **Jenis:** Boolean, **Default**: `false`

## Optimalkan kinerja baca dengan pembaca SIMD CSV vektor
<a name="aws-glue-programming-etl-format-simd-csv-reader"></a>

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 diatur, AWS Glue secara otomatis kembali menggunakan pembaca CSV berbasis baris.
+ Itu tidak mendukung pembuatan DynamicFrame dengan [ChoiceType](https://docs.aws.amazon.com/glue/latest/dg/aws-glue-api-crawler-pyspark-extensions-types.html#aws-glue-api-crawler-pyspark-extensions-types-awsglue-choicetype). 
+ Itu tidak mendukung pembuatan [catatan kesalahan DynamicFrame ](https://docs.aws.amazon.com/glue/latest/dg/glue-etl-scala-apis-glue-dynamicframe-class.html#glue-etl-scala-apis-glue-dynamicframe-class-defs-errorsAsDynamicFrame) dengan.
+ Itu tidak mendukung membaca file CSV dengan karakter multibyte seperti karakter Jepang atau China.