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
atauHIVE_ 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 ke
TRUE
, memungkinkan Anda melewati JSON sintaks cacat. Default-nya adalahFALSE
. - 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
danUrl
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 keFALSE
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.
mapping
Parameter 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 dalam
struct
, Anda dapat menggunakanmapping
properti untuk memetakan bidang ke nama yang kompatibel dengan HIVE. Misalnya, jika definisi jenis kolom Anda berisimy:struct:field:string
, Anda dapat memetakan definisi tersebutmy_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 TABLE
Pernyataan berikut menggunakan Openx- JsonSerDestruct
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. UNNEST
Fungsi 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 |