OpenX JSON SerDe - Amazon Athena

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

OpenX JSON SerDe

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

Pertimbangan dan batasan

  • 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, gunakanSarang JSON SerDe, atau tulis ulang data ke jenis format file lain.

  • SerDe Mengharapkan setiap JSON dokumen berada pada satu baris teks tanpa karakter penghentian baris yang memisahkan bidang dalam catatan. Jika JSON teks dalam format cetak yang cantik, Anda mungkin menerima pesan kesalahan seperti HIVE_ CURSOR _ERROR: Baris bukan JSON Objek yang valid atau HIVE_ CURSOR _ERROR: JsonParseException: Tidak terduga end-of-input: penanda tutup yang diharapkan OBJECT saat Anda mencoba menanyakan tabel setelah Anda membuatnya.

    Untuk informasi selengkapnya, lihat File JSON Data dalam SerDe dokumentasi OpenX pada. GitHub

Properti opsional

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

abaikan.malformed.json

Tidak wajib. Ketika diatur keTRUE, memungkinkan Anda melewati JSON sintaks cacat. Default-nya adalah FALSE.

dots.in.keys

Tidak wajib. Default-nya adalah FALSE. Ketika diatur keTRUE, memungkinkan SerDe untuk mengganti titik-titik dalam nama kunci dengan garis bawah. Misalnya, jika JSON kumpulan data berisi kunci dengan nama"a.b", Anda dapat menggunakan properti ini untuk menentukan nama kolom "a_b" di Athena. Secara default (tanpa ini SerDe), Athena tidak mengizinkan titik dalam nama kolom.

kasus.tidak sensitif

Tidak wajib. Default-nya adalah TRUE. Ketika diatur keTRUE, 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_ CURSOR _ERROR: Baris bukan JSON Objek yang valid -JSONException: Kunci duplikat “url”

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 JSON kunci yang tidak identik dengan nama kolom. mappingParameter ini berguna ketika JSON data berisi kunci yang merupakan kata kunci. Misalnya, jika Anda memiliki JSON kunci bernamatimestamp, gunakan sintaks berikut untuk memetakan kunci ke kolom bernamats:

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 dalamstruct, Anda dapat menggunakan mapping properti untuk memetakan bidang ke nama yang kompatibel dengan HIVE. Misalnya, jika definisi jenis kolom Anda berisimy:struct:field:string, Anda dapat memetakan definisi tersebut my_struct_field:string dengan menyertakan entri berikut diWITH 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

DDLPernyataan contoh berikut menggunakan OpenX JSON SerDe 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 bersarang JSON

Anda dapat menggunakan JSON SerDes untuk mengurai data JSON -encoded 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 JSON data 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 JSON record 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 TABLEPernyataan berikut menggunakan Openx- JsonSerDe 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 orders bidang), Anda dapat menggunakan UNNEST fungsi. UNNESTFungsi meratakan array ke dalam tabel sementara (dalam hal ini disebuto). Ini memungkinkan Anda menggunakan notasi titik seperti yang Anda lakukan dengan struct untuk mengakses elemen array yang tidak bersarang (misalnya,). o.itemid Namatemp_table, yang digunakan dalam contoh untuk tujuan ilustrasi, sering disingkat sebagai. t

Tabel berikut menunjukkan hasil query.

# Nama Alamat Kota Item_id Pesanan_tanggal
1 Carlos 123 Utama St. Kota Anytown 6789 11/11/2022
2 Carlos 123 Utama St. Kota Anytown 4352 12/12/2022