

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
<a name="aws-glue-programming-etl-format-json-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 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](https://www.json.org/).

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](aws-glue-programming-etl-connect-s3-home.md#aws-glue-programming-etl-connect-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
<a name="aws-glue-programming-etl-format-json-read"></a>

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

**Konfigurasi:** Dalam opsi fungsi Anda, tentukan`format="json"`. Dalam Anda`connection_options`, gunakan `paths` kunci untuk menentukan Anda`s3path`. Anda dapat lebih lanjut mengubah bagaimana operasi baca Anda akan melintasi s3 dalam opsi koneksi, berkonsultasi untuk detailnya. [Referensi opsi koneksi Amazon S3](aws-glue-programming-etl-connect-s3-home.md#aws-glue-programming-etl-connect-s3) Anda dapat mengonfigurasi bagaimana pembaca menafsirkan file JSON di file Anda. `format_options` Untuk detailnya, lihat [Referensi Konfigurasi JSON](#aws-glue-programming-etl-format-json-reference). 

 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](aws-glue-api-crawler-pyspark-extensions-glue-context.md#aws-glue-api-crawler-pyspark-extensions-glue-context-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](glue-etl-scala-apis-glue-gluecontext.md#glue-etl-scala-apis-glue-gluecontext-defs-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
<a name="aws-glue-programming-etl-format-json-write"></a>

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

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](aws-glue-api-crawler-pyspark-extensions-glue-context.md#aws-glue-api-crawler-pyspark-extensions-glue-context-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](glue-etl-scala-apis-glue-gluecontext.md#glue-etl-scala-apis-glue-gluecontext-defs-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
<a name="aws-glue-programming-etl-format-json-reference"></a>

Anda dapat menggunakan nilai `format_options` berikut dengan `format="json"`:
+ `jsonPath`— [JsonPath](https://github.com/json-path/JsonPath)Ekspresi 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` atau`jsonPath`. 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](aws-glue-programming-etl-format-xml-home.md#aws-glue-programming-etl-format-xml-withschema) Hanya digunakan dengan `optimizePerformance` saat membaca dari koneksi non-Katalog.

## Menggunakan pembaca SIMD JSON vektor dengan format kolom Apache Arrow
<a name="aws-glue-programming-etl-format-simd-json-reader"></a>

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. `withSchema`mengharapkan masukan seperti yang dijelaskan dalam [Tentukan skema XMLnya secara manual](aws-glue-programming-etl-format-xml-home.md#aws-glue-programming-etl-format-xml-withschema)

```
// 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 {{SchemaString}} di perpustakaan AWS Glue, lihat[PySpark jenis ekstensi](aws-glue-api-crawler-pyspark-extensions-types.md).

**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 dengan`withSchema`.
+ Tidak kompatibel dengan `multiline` atau`jsonPath`. 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](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) tidak akan dibuat.
+ File JSON dengan karakter multi-byte (seperti karakter Jepang atau China) tidak didukung.