

Terjemahan disediakan oleh mesin penerjemah. Jika konten terjemahan yang diberikan bertentangan dengan versi bahasa Inggris aslinya, utamakan versi bahasa Inggris.

# Perpustakaan JSON SerDe
<a name="json-serde"></a>

Di Athena, Anda dapat menggunakan SerDe pustaka untuk deserialisasi data JSON. Deserialisasi mengubah data JSON sehingga dapat diserialisasi (ditulis) ke dalam format yang berbeda seperti Parket atau ORC.
+ [Sarang JSON SerDe](hive-json-serde.md)
+ [OpenX JSON SerDe](openx-json-serde.md) 
+ [Sarang Ion Amazon SerDe](ion-serde.md)

**catatan**  
Pustaka Hive dan OpenX mengharapkan data JSON berada pada satu baris (tidak diformat), dengan catatan dipisahkan oleh karakter baris baru.

Karena Amazon Ion adalah superset JSON, Anda dapat menggunakan Amazon Ion Hive SerDe untuk menanyakan kumpulan data JSON non-Amazon Ion. Berbeda dengan pustaka Hive dan OpenX SerDe JSON, SerDe Amazon Ion tidak mengharapkan setiap baris data berada pada satu baris. Fitur ini berguna jika Anda ingin menanyakan kumpulan data JSON yang dalam format “cetak cantik” atau memecah bidang berturut-turut dengan karakter baris baru.

## Nama perpustakaan
<a name="library-names"></a>

Gunakan salah satu langkah berikut:

 [org.apache.hive.hcatalog.data. JsonSerDe](https://cwiki.apache.org/confluence/display/Hive/LanguageManual+DDL#LanguageManualDDL-JSON) 

 [org.openx.data.jsonserde. JsonSerDe](https://github.com/rcongiu/Hive-JSON-Serde) 

[com.amazon.ionhiveserde. IonHiveSerDe](https://github.com/amzn/ion-hive-serde)

# Sarang JSON SerDe
<a name="hive-json-serde"></a>

Hive JSON biasanya SerDe digunakan untuk memproses data JSON seperti peristiwa. Peristiwa ini direpresentasikan sebagai string baris tunggal dari teks yang disandikan JSON yang dipisahkan oleh baris baru. Hive JSON SerDe tidak mengizinkan kunci duplikat dalam `map` atau `struct` nama kunci.

**catatan**  
 SerDe Mengharapkan setiap dokumen JSON berada pada satu baris teks tanpa karakter penghentian baris yang memisahkan bidang dalam catatan. Jika teks JSON dalam format cetak cantik, Anda mungkin menerima pesan kesalahan seperti HIVE\$1CURSOR\$1ERROR: Row is not a valid JSON Object or HIVE\$1CURSOR\$1ERROR:: Unexpected JsonParseException end-of-input: expected close marker for OBJECT saat Anda mencoba menanyakan tabel setelah Anda membuatnya. Untuk informasi selengkapnya, lihat [File Data JSON](https://github.com/rcongiu/Hive-JSON-Serde#json-data-files) dalam dokumentasi SerDe OpenX pada. GitHub 

Contoh pernyataan DDL berikut menggunakan Hive JSON SerDe untuk membuat tabel berdasarkan sampel data iklan online. Dalam `LOCATION` klausa, ganti *myregion* in `s3://amzn-s3-demo-bucket.elasticmapreduce/samples/hive-ads/tables/impressions` dengan pengenal wilayah tempat Anda menjalankan Athena (misalnya,). `s3://us-west-2.elasticmapreduce/samples/hive-ads/tables/impressions`

```
CREATE EXTERNAL TABLE impressions (
    requestbegintime string,
    adid string,
    impressionid string,
    referrer string,
    useragent string,
    usercookie string,
    ip string,
    number string,
    processid string,
    browsercookie string,
    requestendtime string,
    timers struct
                <
                 modellookup:string, 
                 requesttime:string
                >,
    threadid string, 
    hostname string,
    sessionid string
)   
PARTITIONED BY (dt string)
ROW FORMAT SERDE 'org.apache.hive.hcatalog.data.JsonSerDe'
LOCATION 's3://amzn-s3-demo-bucket.elasticmapreduce/samples/hive-ads/tables/impressions';
```

## Tentukan format stempel waktu dengan Hive JSON SerDe
<a name="hive-json-serde-timestamp-formats"></a>

Untuk mengurai nilai stempel waktu dari string, Anda dapat menambahkan `WITH SERDEPROPERTIES` subfield ke `ROW FORMAT SERDE` klausa dan menggunakannya untuk menentukan parameter. `timestamp.formats` Dalam parameter, tentukan daftar terpisah koma dari satu atau beberapa pola stempel waktu, seperti pada contoh berikut:

```
...
ROW FORMAT SERDE 'org.apache.hive.hcatalog.data.JsonSerDe'
WITH SERDEPROPERTIES ("timestamp.formats"="yyyy-MM-dd'T'HH:mm:ss.SSS'Z',yyyy-MM-dd'T'HH:mm:ss")
...
```

Untuk informasi selengkapnya, lihat [Stempel waktu](https://cwiki.apache.org/confluence/display/hive/languagemanual+types#LanguageManualTypes-TimestampstimestampTimestamps) dalam dokumentasi Apache Hive.

## Muat tabel untuk kueri
<a name="hive-json-serde-loading-the-table"></a>

Setelah Anda membuat tabel, jalankan [MSCK REPAIR TABLE](msck-repair-table.md) untuk memuat tabel dan membuatnya dapat ditanyakan dari Athena:

```
MSCK REPAIR TABLE impressions
```

## CloudTrail Log kueri
<a name="hive-json-serde-querying-cloud-trail-logs"></a>

Anda dapat menggunakan Hive JSON SerDe untuk query CloudTrail log. Untuk informasi lebih lanjut dan contoh `CREATE TABLE` pernyataan, lihat[AWS CloudTrail Log kueri](cloudtrail-logs.md).

# OpenX JSON SerDe
<a name="openx-json-serde"></a>

Seperti Hive JSON SerDe, Anda dapat menggunakan OpenX JSON untuk memproses data JSON. Data juga direpresentasikan sebagai string baris tunggal dari teks yang dikodekan JSON yang dipisahkan oleh baris baru. Seperti Hive JSON SerDe, OpenX JSON SerDe tidak mengizinkan kunci duplikat masuk atau nama kunci. `map` `struct` 

## Pertimbangan dan batasan
<a name="openx-json-serde-considerations-limitations"></a>
+ Saat menggunakan OpenX JSON SerDe, jumlah hasil dan nilainya bisa non-deterministik. Hasilnya dapat berisi lebih banyak baris dari yang diharapkan, lebih sedikit baris dari yang diharapkan, atau nilai nol yang tidak terduga ketika tidak ada yang ada dalam data yang mendasarinya. Untuk mengatasi masalah ini, gunakan[Sarang JSON SerDe](hive-json-serde.md), atau tulis ulang data ke jenis format file lain.
+  SerDe Mengharapkan setiap dokumen JSON berada pada satu baris teks tanpa karakter penghentian baris yang memisahkan bidang dalam catatan. Jika teks JSON dalam format cetak cantik, Anda mungkin menerima pesan kesalahan seperti HIVE\$1CURSOR\$1ERROR: Row is not a valid JSON Object or HIVE\$1CURSOR\$1ERROR:: Unexpected JsonParseException end-of-input: expected close marker for OBJECT saat Anda mencoba menanyakan tabel setelah Anda membuatnya. 

  Untuk informasi selengkapnya, lihat [File Data JSON](https://github.com/rcongiu/Hive-JSON-Serde#json-data-files) di dokumentasi SerDe OpenX. GitHub 

## Properti opsional
<a name="openx-json-serde-optional-properties"></a>

Berbeda dengan Hive JSON SerDe, OpenX JSON SerDe juga memiliki SerDe properti opsional berikut yang dapat berguna untuk mengatasi inkonsistensi dalam data.

**gunakan.null.for.invalid.data**  
Tidak wajib. Nilai default-nya `FALSE`. Ketika diatur ke`TRUE`, SerDe penggunaan `NULL` untuk nilai kolom yang gagal deserialisasi ke dalam tipe kolom yang ditentukan dari skema tabel.  
Pengaturan `use.null.for.invalid.data` ke `TRUE` dapat menyebabkan hasil yang salah atau tidak terduga karena `NULL` nilai menggantikan data yang tidak valid di kolom dengan ketidakcocokan skema. Kami menyarankan Anda memperbaiki data dalam file atau skema tabel Anda daripada mengaktifkan properti ini. Saat Anda mengaktifkan properti ini, kueri tidak akan gagal pada data yang tidak valid, yang dapat mencegah Anda menemukan masalah kualitas data.

**abaikan.malformed.json**  
Tidak wajib. Saat disetel ke`TRUE`, memungkinkan Anda melewati sintaks JSON yang salah bentuk. Nilai default-nya `FALSE`.

**dots.in.keys**  
Tidak wajib. Nilai default-nya `FALSE`. Ketika diatur ke`TRUE`, memungkinkan SerDe untuk mengganti titik-titik dalam nama kunci dengan garis bawah. Sebagai contoh, jika set data JSON berisi kunci dengan nama`"a.b"`, Anda dapat menggunakan properti ini untuk menentukan nama kolom menjadi`"a_b"`di Athena. Secara default (tanpa ini SerDe), Athena tidak mengizinkan titik dalam nama kolom.

**kasus.tidak sensitif**  
Tidak wajib. Nilai default-nya `TRUE`. Ketika diatur ke`TRUE`, SerDe mengubah semua kolom huruf besar menjadi huruf kecil.   
Untuk menggunakan nama kunci peka huruf besar/kecil dalam data Anda, gunakan. `WITH SERDEPROPERTIES ("case.insensitive"= FALSE;)` Kemudian, untuk setiap kunci yang belum semua huruf kecil, berikan pemetaan dari nama kolom ke nama properti menggunakan sintaks berikut:  

```
ROW FORMAT SERDE 'org.openx.data.jsonserde.JsonSerDe'
WITH SERDEPROPERTIES ("case.insensitive" = "FALSE", "mapping.userid" = "userId")
```
Jika Anda memiliki dua kunci seperti `URL` dan `Url` itu sama ketika mereka dalam huruf kecil, kesalahan seperti berikut dapat terjadi:  
HIVE\$1CURSOR\$1ERROR: Baris bukan Objek JSON yang valid -: Kunci duplikat “url” JSONException  
Untuk mengatasi hal ini, atur `case.insensitive` properti ke `FALSE` dan petakan kunci ke nama yang berbeda, seperti pada contoh berikut:  

```
ROW FORMAT SERDE 'org.openx.data.jsonserde.JsonSerDe'
WITH SERDEPROPERTIES ("case.insensitive" = "FALSE", "mapping.url1" = "URL", "mapping.url2" = "Url")
```

**pemetaan**  
Tidak wajib. Memetakan nama kolom ke kunci JSON yang tidak identik dengan nama kolom. `mapping`Parameter ini berguna ketika data JSON berisi kunci yang merupakan [kata kunci](reserved-words.md). Misalnya, jika Anda memiliki kunci JSON bernama`timestamp`, gunakan sintaks berikut untuk memetakan kunci ke kolom bernama: `ts`  

```
ROW FORMAT SERDE 'org.openx.data.jsonserde.JsonSerDe'
WITH SERDEPROPERTIES ("mapping.ts" = "timestamp")
```
**Memetakan nama bidang bersarang dengan titik dua ke nama yang kompatibel dengan HIVE**  
Jika Anda memiliki nama bidang dengan titik dua di dalam`struct`, Anda dapat menggunakan `mapping` properti untuk memetakan bidang ke nama yang kompatibel dengan HIVE. Misalnya, jika definisi jenis kolom Anda berisi`my:struct:field:string`, Anda dapat memetakan definisi tersebut `my_struct_field:string` dengan menyertakan entri berikut di`WITH SERDEPROPERTIES`:

```
("mapping.my_struct_field" = "my:struct:field")
```
Contoh berikut menunjukkan `CREATE TABLE` pernyataan yang sesuai.  

```
CREATE EXTERNAL TABLE colon_nested_field (
item struct<my_struct_field:string>)
ROW FORMAT SERDE 'org.openx.data.jsonserde.JsonSerDe'
WITH SERDEPROPERTIES ("mapping.my_struct_field" = "my:struct:field")
```

## Contoh: data iklan
<a name="openx-json-serde-ad-data-example"></a>

Contoh pernyataan DDL berikut menggunakan OpenX SerDe JSON untuk membuat tabel berdasarkan sampel data iklan online yang sama yang digunakan dalam contoh untuk Hive JSON. SerDe Dalam `LOCATION` klausa, ganti *myregion* dengan pengenal wilayah tempat Anda menjalankan Athena.

```
CREATE EXTERNAL TABLE impressions (
    requestbegintime string,
    adid string,
    impressionId string,
    referrer string,
    useragent string,
    usercookie string,
    ip string,
    number string,
    processid string,
    browsercokie string,
    requestendtime string,
    timers struct<
       modellookup:string, 
       requesttime:string>,
    threadid string, 
    hostname string,
    sessionid string
)   PARTITIONED BY (dt string)
ROW FORMAT SERDE 'org.openx.data.jsonserde.JsonSerDe'
LOCATION 's3://amzn-s3-demo-bucket.elasticmapreduce/samples/hive-ads/tables/impressions';
```

## Contoh: deserialisasi JSON bersarang
<a name="nested-json-serde-example"></a>

Anda dapat menggunakan JSON SerDes untuk mengurai data yang dikodekan JSON yang lebih kompleks. Ini membutuhkan penggunaan `CREATE TABLE` pernyataan yang menggunakan `struct` dan `array` elemen untuk mewakili struktur bersarang. 

Contoh berikut membuat tabel Athena dari data JSON yang memiliki struktur bersarang. Contohnya memiliki struktur sebagai berikut:

```
{
"DocId": "AWS",
"User": {
        "Id": 1234,
        "Username": "carlos_salazar", 
        "Name": "Carlos",
"ShippingAddress": {
"Address1": "123 Main St.",
"Address2": null,
"City": "Anytown",
"State": "CA"
   },
"Orders": [
   {
     "ItemId": 6789,
     "OrderDate": "11/11/2022" 
   },
   {
     "ItemId": 4352,
     "OrderDate": "12/12/2022"
   }
  ]
 }
}
```

Ingat bahwa OpenX SerDe mengharapkan setiap catatan JSON berada pada satu baris teks. Saat disimpan di Amazon S3, semua data dalam contoh sebelumnya harus dalam satu baris, seperti ini:

```
{"DocId":"AWS","User":{"Id":1234,"Username":"carlos_salazar","Name":"Carlos","ShippingAddress" ...
```

`CREATE TABLE`Pernyataan berikut menggunakan [Openx- JsonSerDe](https://github.com/rcongiu/Hive-JSON-Serde) dengan `struct` dan `array` mengumpulkan tipe data untuk menetapkan kelompok objek untuk data contoh. 

```
CREATE external TABLE complex_json (
   docid string,
   `user` struct<
               id:INT,
               username:string,
               name:string,
               shippingaddress:struct<
                                      address1:string,
                                      address2:string,
                                      city:string,
                                      state:string
                                      >,
               orders:array<
                            struct<
                                 itemid:INT,
                                  orderdate:string
                                  >
                              >
               >
   )
ROW FORMAT SERDE 'org.openx.data.jsonserde.JsonSerDe'
LOCATION 's3://amzn-s3-demo-bucket/myjsondata/';
```

Untuk menanyakan tabel, gunakan `SELECT` pernyataan seperti berikut ini.

```
SELECT 
 user.name as Name, 
 user.shippingaddress.address1 as Address, 
 user.shippingaddress.city as City, 
 o.itemid as Item_ID, o.orderdate as Order_date
FROM complex_json, UNNEST(user.orders) as temp_table (o)
```

Untuk mengakses bidang data di dalam struct, kueri sampel menggunakan notasi titik (misalnya,`user.name`). Untuk mengakses data di dalam array struct (seperti pada `orders` bidang), Anda dapat menggunakan `UNNEST` fungsi. `UNNEST`Fungsi meratakan array ke dalam tabel sementara (dalam hal ini disebut`o`). Ini memungkinkan Anda menggunakan notasi titik seperti yang Anda lakukan dengan struct untuk mengakses elemen array yang tidak bersarang (misalnya,). `o.itemid` Nama`temp_table`, yang digunakan dalam contoh untuk tujuan ilustrasi, sering disingkat sebagai. `t`

Tabel berikut menunjukkan hasil query.


****  

| \$1 | Nama | Alamat | Kota | Item\$1id | Pesanan\$1tanggal | 
| --- | --- | --- | --- | --- | --- | 
| 1 | Carlos | 123 Utama St. | Kota Anytown | 6789 | 11/11/2022 | 
| 2 | Carlos | 123 Utama St. | Kota Anytown | 4352 | 12/12/2022 | 

## Sumber daya tambahan
<a name="json-serdes-additional-resources"></a>

Untuk informasi selengkapnya tentang bekerja dengan JSON dan JSON bersarang di Athena, lihat sumber daya berikut:
+ [Buat tabel di Amazon Athena dari JSON bersarang dan pemetaan menggunakan JSONSer](https://aws.amazon.com/blogs/big-data/create-tables-in-amazon-athena-from-nested-json-and-mappings-using-jsonserde/) De (Big Data Blog)AWS 
+ [Saya mendapatkan kesalahan ketika saya mencoba membaca data JSON di Amazon](https://aws.amazon.com/premiumsupport/knowledge-center/error-json-athena/) Athena AWS (artikel Pusat Pengetahuan)
+ [hive-json-schema](https://github.com/quux00/hive-json-schema)(GitHub) — Alat yang ditulis dalam Java yang menghasilkan `CREATE TABLE` pernyataan dari contoh dokumen JSON. `CREATE TABLE`Pernyataan yang dihasilkan menggunakan OpenX JSON Serde.