Praktik terbaik untuk membaca data JSON - Amazon Athena

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

Praktik terbaik untuk membaca data JSON

JavaScript Object Notation (JSON) adalah metode umum untuk encoding struktur data sebagai teks. Banyak aplikasi dan alat output data yang dikodekan JSON-.

Di Amazon Athena, Anda dapat membuat tabel dari data eksternal dan menyertakan data dikodekan JSON di dalamnya. Untuk tipe data sumber seperti itu, gunakan Athena bersama Perpustakaan JSON SerDe .

Gunakan kiat berikut untuk membaca data yang dikodekan JSON:

  • Pilih yang benar SerDe, JSON asli SerDeorg.apache.hive.hcatalog.data.JsonSerDe, atau SerDe org.openx.data.jsonserde.JsonSerDe OpenX,. Untuk informasi selengkapnya, lihat Perpustakaan JSON SerDe .

  • Pastikan bahwa setiap catatan yang disandikan JSON diwakili pada baris terpisah, tidak dicetak dengan cantik.

    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_CURSOR_ERROR: Row is not a valid JSON Object or HIVE_CURSOR_ERROR:: 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 di dokumentasi SerDe OpenX. GitHub

  • Hasilkan data yang dikodekan JSON Anda dalam kolom peka huruf.

  • Beri opsi untuk mengabaikan catatan dengan bentuk yang salah, seperti dalam contoh ini.

    CREATE EXTERNAL TABLE json_table ( column_a string, column_b int ) ROW FORMAT SERDE 'org.openx.data.jsonserde.JsonSerDe' WITH SERDEPROPERTIES ('ignore.malformed.json' = 'true') LOCATION 's3://DOC-EXAMPLE-BUCKET/path/';
  • Konversi bidang dalam data sumber yang memiliki skema yang belum ditentukan ke string yang dikodekan JSON di Athena.

Saat Athena membuat tabel yang didukung oleh data JSON, Athena akan menguraikan data berdasarkan skema yang ada dan yang ditentukan sebelumnya. Namun, tidak semua data Anda mungkin memiliki skema yang ditentukan sebelumnya. Untuk menyederhanakan manajemen skema dalam kasus tersebut, ini sering berguna untuk mengonversi bidang dalam sumber data yang memiliki skema yang belum ditentukan untuk string JSON di Athena, kemudian menggunakan Perpustakaan JSON SerDe .

Sebagai contoh, pertimbangkan sebuah aplikasi IOT yang mempublikasikan peristiwa dengan bidang umum dari sensor yang berbeda. Salah satu bidang tersebut harus menyimpan muatan kustom yang unik untuk sensor yang mengirim peristiwa. Dalam hal ini, karena Anda tidak tahu skema, kami sarankan Anda menyimpan informasi sebagai string dikodekan JSON. Untuk melakukan ini, konversi data dalam tabel Athena Anda ke JSON, seperti dalam contoh berikut. Anda juga dapat mengonversi data yang dikodekan JSON ke tipe data Athena.

Mengonversi tipe data Athena ke JSON

Untuk mengonversi tipe data Athena ke JSON, gunakan CAST.

WITH dataset AS ( SELECT CAST('HELLO ATHENA' AS JSON) AS hello_msg, CAST(12345 AS JSON) AS some_int, CAST(MAP(ARRAY['a', 'b'], ARRAY[1,2]) AS JSON) AS some_map ) SELECT * FROM dataset

Kueri ini menghasilkan:

+-------------------------------------------+ | hello_msg | some_int | some_map | +-------------------------------------------+ | "HELLO ATHENA" | 12345 | {"a":1,"b":2} | +-------------------------------------------+

Mengonversi tipe data JSON ke Athena

Untuk mengonversi tipe data JSON ke Athena, gunakan CAST.

catatan

Dalam contoh ini, untuk menunjukkan string sebagai dikodekan JSON, mulai dengan JSON dan gunakan tanda kutip tunggal, seperti JSON '12345'

WITH dataset AS ( SELECT CAST(JSON '"HELLO ATHENA"' AS VARCHAR) AS hello_msg, CAST(JSON '12345' AS INTEGER) AS some_int, CAST(JSON '{"a":1,"b":2}' AS MAP(VARCHAR, INTEGER)) AS some_map ) SELECT * FROM dataset

Kueri ini menghasilkan:

+-------------------------------------+ | hello_msg | some_int | some_map | +-------------------------------------+ | HELLO ATHENA | 12345 | {a:1,b:2} | +-------------------------------------+