全部产品
Search
文档中心

MaxCompute:Tabel Eksternal JSON

更新时间:Oct 01, 2025

Topik ini menjelaskan cara membuat, membaca dari, dan menulis ke tabel eksternal berformat JSON di Object Storage Service (OSS).

Prasyarat

  • Akun Alibaba Cloud, Pengguna RAM, atau Peran RAM Anda harus memiliki izin yang diperlukan untuk mengakses tabel eksternal OSS. Untuk informasi lebih lanjut tentang otorisasi, lihat Otorisasi STS untuk OSS.

  • (Opsional) Anda telah membuat Bucket OSS, direktori OSS, dan file data OSS. Untuk informasi lebih lanjut, lihat Buat Bucket, Kelola Direktori, dan Unggah Sederhana.

    MaxCompute dapat secara otomatis membuat direktori di OSS. Anda dapat menggunakan satu Pernyataan SQL untuk melakukan operasi baca dan tulis yang melibatkan tabel eksternal dan UDF. Pembuatan direktori manual tidak lagi diperlukan, tetapi metode lama masih didukung.
  • Anda telah membuat proyek MaxCompute. Untuk informasi lebih lanjut, lihat Buat Proyek MaxCompute.

    MaxCompute hanya tersedia di wilayah tertentu. Untuk mencegah masalah konektivitas data lintas wilayah, gunakan bucket di wilayah yang sama dengan proyek MaxCompute Anda.
  • Akun Alibaba Cloud atau Pengguna RAM Anda memiliki izin CreateTable pada proyek Anda. Untuk informasi lebih lanjut tentang izin operasi tabel, lihat Izin MaxCompute.

Batasan

  • Properti kluster tidak didukung untuk tabel eksternal OSS.

  • Satu file tidak boleh melebihi 3 GB. Jika sebuah file lebih besar dari 3 GB, Anda harus membaginya.

Catatan penggunaan

Jika file tersebut berisi lebih banyak kolom daripada tabel eksternal, kolom tambahan akan dibuang.

Dukungan tipe data

Untuk informasi lebih lanjut tentang tipe data MaxCompute, lihat Tipe Data (V1.0) dan Tipe Data (V2.0).

Tipe data

Didukung

Tipe data

Didukung

TINYINT

Didukung

STRING

Didukung

SMALLINT

Didukung

DATE

Didukung

INT

Didukung

DATETIME

Didukung

BIGINT

Didukung

TIMESTAMP

Tidak didukung

BINARY

Tidak didukung

TIMESTAMP_NTZ

Didukung

FLOAT

Didukung

BOOLEAN

Didukung

DOUBLE

Didukung

ARRAY

Tidak didukung

DECIMAL(presisi,skala)

Didukung

MAP

Tidak didukung

VARCHAR(n)

Didukung

STRUCT

Didukung

CHAR(n)

Didukung

JSON

Tidak didukung

Buat tabel eksternal

Sintaksis

Sintaksis sederhana

CREATE EXTERNAL TABLE <mc_oss_extable_name>
(
  <col_name> <data_type>,
  ...
)
[COMMENT <table_comment>]
[PARTITIONED BY (<col_name> <data_type>, ...)]
ROW FORMAT SERDE 'org.apache.hive.hcatalog.data.JsonSerDe'
STORED AS textfile
LOCATION '<oss_location>';

Sintaksis lengkap

CREATE EXTERNAL TABLE <mc_oss_extable_name>
(
  <col_name> <data_type>,
  ...
)
[COMMENT <table_comment>]
[PARTITIONED BY (<col_name> <data_type>, ...)]
ROW FORMAT SERDE 'org.apache.hive.hcatalog.data.JsonSerDe'
  [WITH serdeproperties (
    ['<property_name>'='<property_value>',...])
  ]
STORED AS textfile
LOCATION '<oss_location>'
[tblproperties ('<tbproperty_name>'='<tbproperty_value>',...)];

Parameter umum

Untuk informasi lebih lanjut, lihat Parameter Sintaksis Dasar.

Parameter unik

Parameter tblproperties

property_name

Skenario

Deskripsi

property_value

Nilai default

mcfed.mapreduce.output.fileoutputformat.compress

Menentukan apakah akan menekan data TEXTFILE saat menulis ke OSS.

Properti kompresi TEXTFILE. Menentukan apakah akan menekan file data TEXTFILE saat menulis ke OSS. Jika Anda mengatur properti ini ke True, MaxCompute menulis file data TEXTFILE ke OSS dalam format terkompresi. Jika tidak, file tidak dikompresi.

  • True

  • False

False

mcfed.mapreduce.output.fileoutputformat.compress.codec

Menentukan apakah akan menekan data TEXTFILE saat menulis ke OSS.

Properti kompresi TEXTFILE. Menentukan metode kompresi untuk file data TEXTFILE. Secara default, file dikompresi dalam format .deflate.

Catatan: Hanya metode kompresi dalam property_value yang didukung.

  • com.hadoop.compression.lzo.LzoCodec

  • com.hadoop.compression.lzo.LzopCodec

  • org.apache.hadoop.io.compress.SnappyCodec

  • com.aliyun.odps.io.compress.SnappyRawCodec

  • org.apache.hadoop.io.compress.BZip2Codec

  • org.apache.hadoop.io.compress.Lz4Codec

  • org.apache.hadoop.io.compress.DeflateCodec

  • org.apache.hadoop.io.compress.GzipCodec

org.apache.hadoop.io.compress.DeflateCodec

odps.external.data.output.prefix

(Kompatibel dengan odps.external.data.prefix)

Menentukan awalan kustom untuk nama file keluaran.

  • Awalan hanya dapat berisi huruf (a-z dan A-Z), angka (0-9), dan garis bawah (_).

  • Awalan harus memiliki panjang 1 hingga 10 karakter.

String yang memenuhi persyaratan, seperti 'mc_'.

Tidak ada

odps.external.data.enable.extension

Menentukan apakah akan menampilkan ekstensi nama file keluaran.

Jika Anda mengatur properti ini ke True, ekstensi file keluaran ditampilkan. Jika tidak, ekstensi tidak ditampilkan.

  • True

  • False

False

odps.external.data.output.suffix

Menentukan akhiran kustom untuk nama file keluaran.

Akhiran hanya dapat berisi huruf (a-z dan A-Z), angka (0-9), dan garis bawah (_).

String yang memenuhi persyaratan, seperti '_hangzhou'.

Tidak ada

odps.external.data.output.explicit.extension

Menentukan ekstensi kustom untuk file keluaran.

  • Ekstensi hanya dapat berisi huruf (a-z dan A-Z), angka (0-9), dan garis bawah (_).

  • Ekstensi harus memiliki panjang 1 hingga 10 karakter.

  • Properti ini memiliki prioritas lebih tinggi daripada properti odps.external.data.enable.extension.

String yang memenuhi persyaratan, seperti "jsonl".

Tidak ada

Catatan penggunaan

Saat Anda membuat tabel eksternal JSON, jika suatu bidang berisi objek JSON bersarang (nilai bidang adalah struktur JSON), jangan mendefinisikan tipe data bidang ini sebagai STRING atau JSON. Jika tidak, sistem tidak dapat mengurai subbidang secara otomatis. Anda dapat menggunakan salah satu metode berikut:

  • Definisikan bidang sebagai STRING. Saat Anda mengkueri data, Anda dapat menggunakan fungsi seperti get_json_object untuk mengekstrak konten subbidang internal sesuai kebutuhan.

  • Anda dapat menggunakan tipe STRUCT untuk mendefinisikan struktur bidang. Ini memetakan subbidang objek JSON ke subkolom terpisah dalam tabel. Anda kemudian dapat langsung mengakses data internal menggunakan format field_name.subfield_name.

Untuk informasi lebih lanjut tentang operasi ini, lihat Contoh 2.

Tulis data

Untuk informasi lebih lanjut tentang sintaksis untuk menulis data dari MaxCompute ke OSS, lihat Tulis Data ke OSS.

Kueri dan analisis data

  • Untuk informasi lebih lanjut tentang sintaksis SELECT, lihat Baca Data dari OSS.

  • Untuk informasi lebih lanjut tentang optimasi rencana kueri, lihat Optimasi Kueri.

Contoh

Contoh 1: Buat, tulis ke, dan kueri tabel eksternal JSON

Contoh ini menunjukkan cara membuat tabel eksternal berformat JSON menggunakan parser data open-source bawaan, menulis data ke OSS, dan mengkueri data tersebut.

  1. Siapkan data.

    Masuk ke Konsol OSS dan unggah file data uji json2025.txt ke folder external-table-test/json/dt=20250521/ di dalam Bucket OSS. Untuk informasi lebih lanjut, lihat Unggah File.

  2. Buat tabel eksternal berformat JSON.

    CREATE EXTERNAL TABLE mc_oss_extable_name_json
    (
      action STRING,
      time STRING
    )
    PARTITIONED BY (dt STRING)
    ROW FORMAT SERDE 'org.apache.hive.hcatalog.data.JsonSerDe'
    WITH serdeproperties (
      'odps.properties.rolearn'='acs:ram::<uid>:role/aliyunodpsdefaultrole'
    )
    STORED AS textfile
    LOCATION 'oss://oss-cn-hangzhou-internal.aliyuncs.com/external-table-test/json/';
  3. Temukan dan daftarkan partisi. Jika tabel eksternal OSS yang Anda buat adalah tabel partisi, Anda harus menjalankan perintah tambahan untuk mendaftarkan partisi dari direktori OSS Anda. Untuk informasi lebih lanjut, lihat Sintaksis untuk Menambahkan Data Partisi ke Tabel Eksternal OSS.

    -- Temukan dan daftarkan partisi.
    MSCK REPAIR TABLE mc_oss_extable_name_json ADD PARTITIONS;
  4. Baca data dari tabel eksternal JSON.

    SELECT * FROM mc_oss_extable_name_json WHERE dt=20250526;

    Hasil berikut dikembalikan:

    +------------+------------+------------+
    | action     | time       | dt         |
    +------------+------------+------------+
    | Close      | 1469679568 | 20250526   |
    | Close      | 1469679568 | 20250526   |
    +------------+------------+------------+
  5. Tulis data ke tabel eksternal JSON.

    INSERT INTO mc_oss_extable_name_json PARTITION (dt='20250526') VALUES ('test','1627273823');
  6. Lihat data yang telah ditulis.

    SELECT * FROM mc_oss_extable_name_json WHERE dt=20250526;

    Hasil berikut dikembalikan:

    +------------+------------+------------+
    | action     | time       | dt         |
    +------------+------------+------------+
    | test       | 1627273823 | 20250526   |
    | Close      | 1469679568 | 20250526   |
    | Close      | 1469679568 | 20250526   |
    +------------+------------+------------+

Contoh 2: Baca nilai dari bidang berformat JSON

Siapkan Data

Buat file data JSON events.json:

{"a":{"x":1, "y":2}, "id":"123"}
{"a":{"x":3, "y":4}, "id":"345"}

Masuk ke Konsol OSS dan unggah data uji ke folder external-table-test/json-struct/ di dalam Bucket OSS. Untuk informasi lebih lanjut, lihat Unggah File.

Metode 1: Buat tabel eksternal TEXTFILE dan gunakan fungsi get_json_object untuk membaca nilai bidang

  1. Buat tabel eksternal TEXTFILE yang hanya berisi satu kolom bertipe string:

    CREATE EXTERNAL TABLE extable_json_test01 (
      col STRING
    )
    ROW FORMAT DELIMITED FIELDS TERMINATED BY '\n'
    STORED AS textfile
    LOCATION 'oss://oss-cn-hangzhou-internal.aliyuncs.com/external-table-test/json_struct/';  
    
    SELECT * FROM extable_json_test01;      

    Hasil berikut dikembalikan:

    +------------------------------------+
    |               col                  |
    +------------------------------------+
    | {"a": {"x": 1, "y": 2},"id":"123"} |
    | {"a": {"x": 3, "y": 4},"id":"345"} |
    +------------------------------------+
  2. Anda dapat menggunakan fungsi get_json_object untuk membaca bidang a dan id:

    SELECT 
        get_json_object(col, '$.a') AS a,
        get_json_object(col, '$.id') AS id
    FROM extable_json_test01;         

    Hasil berikut dikembalikan:

    +-------------------+-----+
    |        a          | id  |
    +-------------------+-----+
    | {"x":1,"y":2}     | 123 |
    | {"x":3,"y":4}     | 345 |
    +-------------------+-----+
  3. Anda dapat membaca bidang bersarang x, y, dan id:

    SELECT 
        get_json_object(get_json_object(col,'$.a'),'$.x') AS x,
        get_json_object(get_json_object(col,'$.a'),'$.y') AS y,
        get_json_object(col,'$.id') AS id
    FROM extable_json_test01;          

    Hasil berikut dikembalikan:

    +---+---+-----+
    | x | y | id  |
    +---+---+-----+
    | 1 | 2 |123  |
    | 3 | 4 |345  |
    +---+---+-----+       

Metode 2: Buat tabel eksternal JSON dan gunakan tipe STRUCT untuk mendefinisikan struktur data

  1. Buat tabel eksternal berformat JSON dan gunakan tipe STRUCT untuk mendefinisikan bidang bersarang:

    CREATE EXTERNAL TABLE extable_json_test02
    (
      a STRUCT<x: BIGINT, y: BIGINT>,
      id STRING
    )
    ROW FORMAT SERDE 'org.apache.hive.hcatalog.data.JsonSerDe'
    STORED AS textfile
    LOCATION 'oss://oss-cn-hangzhou-internal.aliyuncs.com/external-table-test/json_struct/';          
  2. Anda dapat langsung mengkueri isi tabel:

    SELECT * FROM extable_json_test02;

    Hasil berikut dikembalikan:

    +----------+-----+
    |    a     | id  |
    +----------+-----+
    | {x:1, y:2}|123 |
    | {x:3, y:4}|345 |
    +----------+-----+
  3. Anda juga dapat menggunakan fungsi get_json_object dan TO_JSON untuk membaca bidang x dan y:

    SELECT 
        get_json_object(TO_JSON(a), '$.x') AS x,
        get_json_object(TO_JSON(a), '$.y') AS y,
        id
    FROM extable_json_test02;         

    Hasil berikut dikembalikan:

    +---+---+-----+
    | x | y | id  |
    +---+---+-----+
    | 1 | 2 |123  |
    | 3 | 4 |345  |
    +---+---+-----+       

Contoh 3: Tetapkan awalan, akhiran, dan ekstensi untuk file OSS keluaran

  1. Tetapkan awalan kustom untuk file OSS keluaran menjadi test06_. Pernyataan DDL adalah sebagai berikut:

    CREATE EXTERNAL TABLE  <mc_oss_extable_name>
    (
      vehicleId INT,
      recordId INT,
      patientId INT,
      calls INT,
      locationLatitute DOUBLE,
      locationLongitude DOUBLE,
      recordTime STRING,
      direction STRING
    )
    ROW FORMAT SERDE 'org.apache.hive.hcatalog.data.JsonSerDe'
    WITH serdeproperties (
      'odps.properties.rolearn'='acs:ram::<uid>:role/aliyunodpsdefaultrole'
    ) 
    STORED AS textfile
    LOCATION 'oss://oss-cn-beijing-internal.aliyuncs.com/***/'
    TBLPROPERTIES (
    -- Tetapkan awalan kustom.
        'odps.external.data.output.prefix'='test06_') 
    ;
    
    -- Tulis data ke tabel eksternal.
    INSERT INTO  <mc_oss_extable_name> VALUES (1,32,76,1,63.32106,-92.08174,'9/14/2014 0:10','NW');

    Gambar berikut menunjukkan file yang dihasilkan.

    image

  2. Tetapkan akhiran kustom untuk file OSS keluaran menjadi _beijing. Pernyataan DDL adalah sebagai berikut:

    CREATE EXTERNAL TABLE <mc_oss_extable_name>
    (
      vehicleId INT,
      recordId INT,
      patientId INT,
      calls INT,
      locationLatitute DOUBLE,
      locationLongitude DOUBLE,
      recordTime STRING,
      direction STRING
    )
    ROW FORMAT SERDE 'org.apache.hive.hcatalog.data.JsonSerDe'
    WITH serdeproperties (
      'odps.properties.rolearn'='acs:ram::<uid>:role/aliyunodpsdefaultrole'
    ) 
    STORED AS textfile
    LOCATION 'oss://oss-cn-beijing-internal.aliyuncs.com/***/'
    TBLPROPERTIES (
    -- Tetapkan akhiran kustom.
        'odps.external.data.output.suffix'='_beijing') 
    ;
    
    -- Tulis data ke tabel eksternal.
    INSERT INTO <mc_oss_extable_name> VALUES (1,32,76,1,63.32106,-92.08174,'9/14/2014 0:10','NW');

    Gambar berikut menunjukkan file yang dihasilkan.

    image

  3. Ekstensi secara otomatis dibuat untuk file OSS keluaran. Pernyataan DDL adalah sebagai berikut:

    CREATE EXTERNAL TABLE <mc_oss_extable_name>
    (
      vehicleId INT,
      recordId INT,
      patientId INT,
      calls INT,
      locationLatitute DOUBLE,
      locationLongitude DOUBLE,
      recordTime STRING,
      direction STRING
    )
    ROW FORMAT SERDE 'org.apache.hive.hcatalog.data.JsonSerDe'
    WITH serdeproperties (
      'odps.properties.rolearn'='acs:ram::<uid>:role/aliyunodpsdefaultrole'
    ) 
    STORED AS textfile
    LOCATION 'oss://oss-cn-beijing-internal.aliyuncs.com/***/'
    TBLPROPERTIES (
    -- Secara otomatis hasilkan ekstensi.
        'odps.external.data.enable.extension'='true') 
    ;
    
    -- Tulis data ke tabel eksternal.
    INSERT INTO <mc_oss_extable_name> VALUES (1,32,76,1,63.32106,-92.08174,'9/14/2014 0:10','NW');

    Gambar di bawah ini menunjukkan file yang dihasilkan.

  4. Tetapkan ekstensi kustom untuk file OSS keluaran menjadi jsonl. Pernyataan DDL adalah sebagai berikut:

    CREATE EXTERNAL TABLE <mc_oss_extable_name>
    (
      vehicleId INT,
      recordId INT,
      patientId INT,
      calls INT,
      locationLatitute DOUBLE,
      locationLongitude DOUBLE,
      recordTime STRING,
      direction STRING
    )
    ROW FORMAT SERDE 'org.apache.hive.hcatalog.data.JsonSerDe'
    WITH serdeproperties (
      'odps.properties.rolearn'='acs:ram::<uid>:role/aliyunodpsdefaultrole'
    ) 
    STORED AS textfile
    LOCATION 'oss://oss-cn-beijing-internal.aliyuncs.com/***/'
    TBLPROPERTIES (
    -- Tetapkan ekstensi kustom.
       'odps.external.data.output.explicit.extension'='jsonl') 
    ;
    
    -- Tulis data ke tabel eksternal.
    INSERT INTO <mc_oss_extable_name> VALUES (1,32,76,1,63.32106,-92.08174,'9/14/2014 0:10','NW');

    Gambar berikut menunjukkan file yang dihasilkan.

    image.png

  5. Tetapkan awalan untuk file OSS keluaran menjadi mc_, akhirannya menjadi _beijing, dan ekstensinya menjadi jsonl. Pernyataan DDL adalah sebagai berikut:

    CREATE EXTERNAL TABLE <mc_oss_extable_name>
    (
      vehicleId INT,
      recordId INT,
      patientId INT,
      calls INT,
      locationLatitute DOUBLE,
      locationLongitude DOUBLE,
      recordTime STRING,
      direction STRING
    )
    ROW FORMAT SERDE 'org.apache.hive.hcatalog.data.JsonSerDe'
    WITH serdeproperties (
      'odps.properties.rolearn'='acs:ram::<uid>:role/aliyunodpsdefaultrole'
    ) 
    STORED AS textfile
    LOCATION 'oss://oss-cn-beijing-internal.aliyuncs.com/***/'
    TBLPROPERTIES (
        -- Tetapkan awalan kustom.
        'odps.external.data.output.prefix'='mc_', 
        -- Tetapkan akhiran kustom.
        'odps.external.data.output.suffix'='_beijing', 
        -- Tetapkan ekstensi kustom.
        'odps.external.data.output.explicit.extension'='jsonl') 
    ;  
    
    -- Tulis data ke tabel eksternal.
    INSERT INTO <mc_oss_extable_name> VALUES (1,32,76,1,63.32106,-92.08174,'9/14/2014 0:10','NW');

    Gambar berikut menunjukkan file yang dihasilkan.

    image.png