全部产品
Search
文档中心

MaxCompute:Tipe Data JSON

更新时间:Sep 16, 2025

MaxCompute mendukung tipe data JSON, yang membantu meningkatkan kinerja komputasi dan analitik tabel yang menyimpan data bertipe JSON. Topik ini menjelaskan cara menggunakan tipe data JSON di MaxCompute.

Pengenalan Tipe Data JSON

Informasi Latar Belakang

Data semi-terstruktur merupakan gabungan antara data terstruktur dan tidak terstruktur. Data ini memiliki skema fleksibel tanpa batasan ketat, sering kali bersifat deskriptif diri sendiri. Data JSON adalah contoh khas dari data semi-terstruktur. Untuk memperkuat dukungan terhadap data semi-terstruktur dalam SQL MaxCompute, MaxCompute menyediakan fitur seperti evolusi skema, tipe JSON STRING, fungsi tipe kompleks bawaan, dan ekspresi Lambda. Namun, Anda harus memproses data semi-terstruktur secara standar sebelum mengimpornya ke tabel dengan skema tetap untuk data terstruktur. Jika skema bisnis Anda berubah, gunakan fitur evolusi skema untuk mengeksekusi pernyataan DDL guna memodifikasi skema tabel.image.png

Mode sebelumnya memiliki batasan kuat pada skema, sehingga sulit untuk mengimpor data semi-terstruktur dengan cepat. Data yang tidak sesuai dengan spesifikasi skema akan dibuang selama impor. Untuk mengatasi masalah ini, tim pengembangan MaxCompute merancang tipe data JSON. Tipe data ini cocok untuk data semi-terstruktur tanpa batasan ketat pada skema dan memungkinkan pemanfaatan penuh mode penyimpanan berorientasi kolom, sehingga memenuhi kebutuhan fleksibilitas tinggi dan kinerja tinggi.

Prinsip Dasar

Tipe data JSON adalah tipe baru yang diperkenalkan di MaxCompute. Anda dapat menggunakannya seperti tipe data lainnya. Dukungan untuk tipe data JSON membebaskan Anda dari pengelolaan skema. Setelah memasukkan data JSON ke tabel MaxCompute, sistem secara otomatis mengekstrak dan mengoptimalkan skema publik. Untuk meningkatkan kinerja, disarankan menyimpan data JSON dalam mode penyimpanan berorientasi kolom. Berikut adalah contohnya:

CREATE TABLE json_table
(
    json_val  json
);

CREATE TABLE string_table
(
    string_val  STRING
);

INSERT INTO string_table VALUES
        ('{"a":1, "b":2}')
        ,('{"a":"key", "b":2}')
        ,('{"c":3}');

INSERT INTO json_table
SELECT  json_parse(string_val)
FROM    string_table;

Saat memasukkan data ke tabel MaxCompute, sistem secara otomatis mengekstrak skema publik <"a":binary, "b":bigint, "c":bigint>. Saat mengambil data, MaxCompute dapat memangkas kolom berdasarkan skema publik, mengurangi jumlah data yang dibaca dan meningkatkan efisiensi kueri. Berikut adalah contoh kueri:

SELECT  json_val["b"]
        ,json_val["c"]
FROM    json_table
;  
-- Saat Anda mengambil data dari tabel, MaxCompute melakukan operasi pemangkasan kolom dan hanya menyimpan variabel b dan c.
+-----+-----+
| _c0 | _c1 |
+-----+-----+
| 2   | NULL |
| 2   | NULL |
| NULL | 3   |
+-----+-----+

MaxCompute menyimpan data yang tidak termasuk dalam skema publik menggunakan tipe BINARY alih-alih tipe STRING asli, sehingga mengurangi ruang penyimpanan yang diperlukan. Dibandingkan dengan fungsi yang ditentukan pengguna (UDF), tipe data JSON meningkatkan efisiensi konversi antara tipe STRING dan tipe data JSON.

Menggunakan Tipe Data JSON

Catatan

Untuk proyek MaxCompute baru, parameter odps.sql.type.json.enable diatur ke true secara default. Untuk proyek MaxCompute yang sudah ada, parameter odps.sql.type.json.enable diatur ke false secara default. Oleh karena itu, jika Anda ingin menggunakan tipe data JSON untuk proyek MaxCompute yang sudah ada, Anda harus menjalankan perintah set odps.sql.type.json.enable=true; untuk mengaktifkan fitur tipe data JSON. Anda dapat mengeksekusi kode setproject; untuk mengonfirmasi nilai parameter odps.sql.type.json.enable.

Batasan

  • Alat pengembangan yang didukung meliputi klien MaxCompute (odpscmd), MaxCompute Studio, dan DataWorks. Ekosistem eksternal seperti Dataphin tidak didukung. Jika Anda ingin menggunakan tipe data JSON yang didukung oleh MaxCompute di ekosistem eksternal, pastikan ekosistem tersebut mendukung tipe data JSON. Tabel berikut menjelaskan item yang perlu diperhatikan saat menggunakan klien MaxCompute (odpscmd) atau MaxCompute Studio sebagai alat pengembangan untuk data bertipe JSON.

    Klien MaxCompute (odpscmd)

    MaxCompute Studio

    • Anda harus meningkatkan klien MaxCompute ke V0.46.5 atau versi lebih baru. Jika tidak, Anda tidak dapat mengeksekusi pernyataan desc json_table atau mengunduh data bertipe JSON menggunakan Tunnel.

    • Anda harus mengatur parameter use_instance_tunnel ke false. Parameter ini termasuk dalam file odps_config.ini di folder conf di jalur instalasi klien. Jika tidak, kesalahan akan dilaporkan saat Anda melakukan kueri.

    MaxCompute Studio memungkinkan Anda untuk mengkueri data JSON. MaxCompute Studio tidak memungkinkan Anda untuk mengunggah atau mengunduh data JSON.

  • Jika Anda ingin menggunakan mesin lain, seperti Hologres, untuk membaca data dari tabel MaxCompute, data JSON di tabel tidak dapat dibaca.

  • Kolom bertipe JSON tidak dapat ditambahkan ke tabel MaxCompute.

  • Anda tidak diizinkan membandingkan data bertipe JSON dengan data bertipe lain, mengeksekusi pernyataan SQL yang berisi klausa ORDER BY atau GROUP BY pada data bertipe JSON, atau menggunakan kolom bertipe JSON sebagai kunci join.

  • Untuk data bertipe JSON NUMBER, bagian integer disimpan menggunakan tipe BIGINT, dan bagian desimal disimpan menggunakan tipe DOUBLE. Jika bagian integer melebihi rentang yang didukung oleh tipe BIGINT, terjadi overflow integer. Saat bagian desimal dikonversi menjadi tipe DOUBLE, terjadi kehilangan presisi.

  • String yang digunakan untuk menghasilkan data JSON tidak boleh berisi \u0000, yaitu karakter null dalam Unicode.

  • Java UDF dan Python UDF tidak mendukung tipe data JSON.

  • Tabel terkluster tidak dapat menyimpan data JSON.

  • SDK untuk Java dalam versi sebelum V0.44.0 dan PyODPS dalam versi sebelum V0.11.4.1 tidak mendukung tipe data JSON.

  • Tabel Delta tidak mendukung tipe data JSON.

  • Tipe data JSON dapat digunakan secara bertingkat, mendukung hingga 20 tingkat bertingkat.

Konstanta Literal

Tipe data JSON didefinisikan berdasarkan standar JSON dan mencakup BOOLEAN, NUMBER, STRING, NULL, ARRAY, dan OBJECT. Untuk data bertipe JSON NUMBER, bagian yang berbeda disimpan secara terpisah menggunakan tipe BIGINT dan DOUBLE. Jika bagian data bertipe JSON NUMBER melebihi rentang yang ditentukan, terjadi kehilangan presisi. JSON 'null' berbeda dari SQL null.

JSON 'null'
JSON '123'
JSON '123.34'
JSON 'true'
JSON '{"id":123,"name":"MaxCompute"}'
JSON '[12, 34]'

Konstanta yang Anda gunakan harus sesuai dengan standar JSON. Sebagai contoh, JSON '{id:123,"name":"MaxCompute"}' adalah string JSON yang tidak valid karena id harus diapit dengan tanda kutip ganda (").

Menentukan Tipe Data JSON

Anda dapat membuat tabel yang berisi data bertipe JSON seperti halnya membuat tabel yang berisi data bertipe dasar. Tidak perlu menentukan skema.

CREATE TABLE mf_json_table (json_val JSON);

Menghasilkan Data JSON

Anda dapat menggunakan salah satu metode berikut untuk menghasilkan data JSON:

  • Literal JSON

    insert into mf_json_table values (json '123');
  • Fungsi JSON

    -- json_object dan json_array adalah fungsi bawaan MaxCompute.
    insert into mf_json_table select json_object("key",123, "value", "abc");
    
    select * from mf_json_table;
    
    -- Hasil berikut dikembalikan:
    +----------+
    | json_val |
    +----------+
    | 123      |
    | {"key":123,"value":"abc"} |
    +----------+
    
    
    insert into mf_json_table select json_array("key",234, "value", "abc");
    
    select * from mf_json_table;
    
    -- Hasil berikut dikembalikan:
    +----------+
    | json_val |
    +----------+
    | 123      |
    | ["key",234,"value","abc"] |
    | {"key":123,"value":"abc"} |
    +----------+
  • Konversi Tipe

    Perhatikan perbedaan antara fungsi cast dan fungsi json_parse. Untuk informasi lebih lanjut, lihat Fungsi Tipe Kompleks.

    insert into mf_json_table select cast("abc" as json);
    select * from mf_json_table;
    -- Hasil berikut dikembalikan:
    +----------+
    | json_val |
    +----------+
    | 123      |
    | "abc"    |
    | ["key",234,"value","abc"] |
    | {"key":123,"value":"abc"} |
    +----------+

Mengakses Data JSON

Anda dapat menggunakan metode pengindeksan, fungsi json_extract, atau fungsi get_json_object untuk mengakses data JSON. Hasil yang dikembalikan bertipe JSON.

Metode Pengindeksan

Akses ke data JSON berada dalam mode strict. Metode pengindeksan mendukung akses berdasarkan indeks tertentu dan akses berdasarkan nama bidang. Jika jalur JSON tidak sesuai dengan jalur aktual data JSON, NULL dikembalikan.

json_val['a'][0][1] setara dengan json_extract(json_val, 'strict $.a[0][1]').

-- 123 dikembalikan.
SELECT v['id'] 
  FROM VALUES (JSON '{"id":123}') as t(v);
  
-- 12 dikembalikan.
SELECT v[0] 
  FROM VALUES (JSON '[12, 34]') as t(v);
  
-- 1 dikembalikan.
select v['x']['a']  from values (json '{"x": {"a": 1, "b": 2}}') as t(v);

-- NULL dikembalikan.
SELECT v[0] 
FROM VALUES (JSON '{"id":123}') as t(v);

-- NULL dikembalikan.
SELECT v['not_exists'] 
FROM VALUES (JSON '{"id":123}') as t(v);

Fungsi JSON

Dalam contoh ini, fungsi json_extract atau get_json_object digunakan untuk mengakses data JSON.

-- Akses data JSON menggunakan fungsi get_json_object. MaxCompute dikembalikan.
SELECT GET_JSON_OBJECT(v, '$.x.name')
  FROM VALUES (JSON '{"x": {"id": 1001, "name": "MaxCompute"}}') as t(v);
  
-- Hasil berikut dikembalikan:
+-----+
| _c0 |
+-----+
| MaxCompute |
+-----+

-- Akses data JSON menggunakan fungsi json_extract. "MaxCompute" bertipe JSON dikembalikan.
SELECT JSON_EXTRACT(v, '$.x.name') 
  FROM VALUES (JSON '{"x": {"id": 1001, "name": "MaxCompute"}}') as t(v);
  
-- Hasil berikut dikembalikan:
+-----+
| _c0 |
+-----+
| "MaxCompute" |
+-----+
Catatan

Tipe data JSON yang dirancang baru menggunakan metode yang lebih standar untuk mengurai jalur JSON, berbeda dari penguraian menggunakan fungsi get_json_object MaxCompute. Kedua metode mungkin tidak kompatibel satu sama lain. Kami merekomendasikan penggunaan fungsi json_extract untuk penguraian. Untuk fungsi bawaan lainnya yang didukung oleh SQL MaxCompute, lihat Fungsi Tipe Kompleks.

Spesifikasi untuk Jalur JSON

Jalur JSON menentukan posisi node dalam data JSON dan membantu Anda menemukan node yang diinginkan serta memperoleh data dengan mudah. Jalur JSON digunakan sebagai parameter fungsi JSON. Pengurai jalur JSON yang digunakan untuk tipe data JSON sama dengan pengurai jalur JSON yang digunakan di PostgreSQL dan merupakan subset dari PostgreSQL. Berikut adalah contohnya:

  • Data JSON sampel:

    { "name": "Molly",
      "phones": [ 
        { "phonetype": "work",
        "phone#": "650-506-7000" 
        },
        { "phonetype": "cell",
          "phone#": "650-555-5555" 
        }
      ]
    }
  • Jalur JSON sampel: Hasil penguraian yang diperoleh berdasarkan $.phones[1]."phone#' adalah "650-555-5555".

Tabel berikut menjelaskan spesifikasi untuk jalur JSON berdasarkan data JSON sebelumnya.

Variabel

Operator

pengakses

  • pengakses anggota: $.phone. Karakter khusus seperti $."sf*" didukung.

  • pengakses anggota wildcard: $.*.

  • pengakses elemen: $[1, 2, 4 to 7].

  • pengakses elemen wildcard: $[*].

mode

Nilai yang valid: lax dan strict. Nilai default: lax.

  • lax: Mode lax mencakup proses pembungkusan dan pembukaan bungkusan. Contoh jalur JSON dalam mode lax: 'lax $.phones.phonetype'.

    Hasil ekspresi berikut dikembalikan berdasarkan data JSON sebelumnya:

    • $[0]: wrap object [{....}] menunjukkan bahwa data dengan indeks 0 diakses dan {....} dikembalikan.

    • $[1]: wrap object [{....}] menunjukkan bahwa data dengan indeks 1 diakses dan NULL dikembalikan.

    • $.name.*: Nilai parameter name adalah Molly, dan nilai bertipe OBJECT diharapkan dikembalikan. NULL dikembalikan.

    • $.name[*]: Nilai parameter name adalah Molly, dan nilai bertipe ARRAY diharapkan dikembalikan. Nilai Molly dibungkus menjadi ["Molly"], dan ["Molly"] dikembalikan.

    • $.phones.phonetype: Nilai parameter phones adalah bertipe ARRAY. Nilai tersebut dibuka bungkusnya menjadi dua nilai bertipe OBJECT. Sistem melanjutkan untuk mendapatkan nilai parameter phonetype dalam dua nilai bertipe OBJECT dan akhirnya mengembalikan ["work","cell"].

    • $.phones[*].phonetype: Nilai parameter phonetype langsung diperoleh, dan ["work","cell"] dikembalikan.

  • strict: Mode strict mengharuskan jalur JSON sama dengan jalur aktual data JSON yang akan diakses. Jika jalurnya berbeda, NULL dikembalikan. Contoh jalur JSON dalam mode strict: 'strict $.phones.phonetype'.

    Hasil ekspresi berikut dikembalikan berdasarkan data JSON sebelumnya:

    • strict $.phones.phonetype: Nilai subnode parameter phones adalah bertipe ARRAY, dan nilai bertipe OBJECT diharapkan dikembalikan. NULL dikembalikan.

    • strict $.address: Variabel address tidak ada. Oleh karena itu, NULL dikembalikan.

Penting

Mode lax tidak mendukung pemangkasan kolom. Mode strict mendukung pemangkasan kolom.

Contoh

-- Jika parameter odps.sql.type.json.enable diatur ke false untuk proyek Anda, Anda harus mengeksekusi pernyataan berikut:
set odps.sql.type.json.enable=true;
create table json_table(json_val json);

create table mf_string_table(string_val string);
insert into mf_string_table values('{"a":1, "b":2}');

insert into json_table select json_parse(string_val) 
                         from mf_string_table 
                         where json_valid(string_val);


select * from json_table where json_val is not null;
-- Hasil berikut dikembalikan:
+----------+
| json_val |
+----------+
| {"a":1,"b":2} |
+----------+

select json_val['b'] from json_table where json_val is not null;
-- Hasil berikut dikembalikan:
+-----+
| _c0 |
+-----+
| 2   |
+-----+