All Products
Search
Document Center

MaxCompute:Tabel eksternal JSON

Last Updated:Sep 19, 2026

Topik ini menjelaskan cara membuat, membaca dari, dan menulis ke tabel eksternal JSON di OSS.

Lingkup

Deskripsi izin

  • Saat mengakses tabel eksternal OSS, data diakses melalui role yang ditentukan dalam parameter odps.properties.rolearn, terlepas dari apakah Anda menggunakan Akun Alibaba Cloud, Pengguna RAM, atau Peran RAM. Oleh karena itu, Anda harus membuat Peran RAM dan memberikan izin untuk mengakses bucket OSS target, lalu mengonfigurasi ARN role tersebut dalam parameter odps.properties.rolearn. Untuk informasi selengkapnya, lihat Parameter.

  • Anda dapat mengotorisasi akses lintas akun atau dalam akun yang sama sesuai kebutuhan bisnis Anda. Kami merekomendasikan penggunaan kebijakan otorisasi kustom untuk kontrol akses yang lebih detail halus. Untuk informasi selengkapnya, lihat Otorisasi untuk sumber data eksternal.

Buat tabel eksternal

Sintaksis

Jika file JSON memiliki kolom lebih sedikit daripada definisi tabel eksternal, MaxCompute mengisi kolom yang hilang dengan NULL. Jika file memiliki kolom lebih banyak, MaxCompute mengabaikan kolom tambahan tersebut.

Sintaksis ringkas

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 selengkapnya, lihat Parameter sintaksis umum.

Parameter eksklusif

Parameter Tblproperties

Parameter

Kasus penggunaan

Deskripsi

Nilai

Bawaan

mcfed.mapreduce.output.fileoutputformat.compress

Untuk menulis data TEXTFILE ke OSS dalam format terkompresi.

Properti kompresi TEXTFILE. Jika diatur ke True, MaxCompute mengompresi data TEXTFILE saat menulis ke OSS.

  • True

  • False

False

mcfed.mapreduce.output.fileoutputformat.compress.codec

Untuk menulis data TEXTFILE ke OSS dalam format terkompresi.

Properti kompresi TEXTFILE. Menetapkan kodek kompresi untuk file data TEXTFILE. Secara bawaan, file dikompresi menggunakan kodek .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

  • 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.odps.ZstandardCodec

org.apache.hadoop.io.compress.DeflateCodec

odps.external.data.output.prefix

(kompatibel mundur dengan odps.external.data.prefix)

Untuk menambahkan awalan kustom ke nama file output.

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

  • Panjang awalan harus antara 1 hingga 10 karakter.

Kombinasi karakter valid, seperti mc_.

Tidak ada

odps.external.data.enable.extension

Untuk menambahkan ekstensi file ke nama file output.

Jika diatur ke True, ekstensi file ditambahkan ke nama file output. Jika tidak, tidak ada ekstensi file yang ditambahkan.

  • True

  • False

False

odps.external.data.output.suffix

Untuk menambahkan akhiran kustom ke nama file output.

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

String valid, seperti '_hangzhou'.

Tidak ada

odps.external.data.output.explicit.extension

Untuk menambahkan ekstensi file kustom ke nama file output.

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

  • Panjang ekstensi file harus antara 1 hingga 10 karakter.

  • Menggantikan parameter odps.external.data.enable.extension.

Kombinasi karakter valid, seperti jsonl.

Tidak ada

odps.ext.column.mapping

Tambahkan properti ini ketika nama bidang dalam file data OSS mengandung karakter khusus.

Properti ini mendefinisikan pemetaan nama kolom kustom. Misalnya, jika bidang file OSS adalah id BIGINT, $_test DOUBLE, dan =name STRING, atur nilai parameter menjadi t_test:$_test,t_name:=_name saat membuat tabel eksternal. Anda hanya perlu menentukan pemetaan untuk bidang yang mengandung karakter khusus.

Tidak ada nilai tetap

Tidak ada

odps.ext.column.mapping.delimiters

(Gunakan hanya ketika karakter dalam nama kolom bertentangan dengan pembatas bawaan dalam pemetaan nama kolom. Umumnya tidak disarankan.)

Tambahkan properti ini ketika nama kolom mengandung karakter khusus : atau ,

Properti ini menyesuaikan pembatas intra-grup dan antar-grup untuk pasangan kunci-nilai. Nilainya harus terdiri tepat dua karakter: karakter pertama berfungsi sebagai pembatas kunci-nilai, dan karakter kedua berfungsi sebagai pembatas antar pasangan kunci-nilai yang berbeda.

Tidak ada nilai tetap. Contoh: =|.

Nilai bawaan: ':,'

  • Secara bawaan, ':' digunakan sebagai pembatas antara kunci dan nilai.

  • Koma ',' digunakan sebagai pembatas antara pasangan kunci-nilai yang berbeda.

  • Spasi awal dan akhir pada kunci dan nilai dipangkas selama penguraian.

odps.text.option.bad.row.skipping

Untuk melewati data rusak dalam file data OSS.

Menentukan apakah akan melewati data rusak saat MaxCompute membaca dari file OSS.

  • rigid: Menerapkan logika pelewat baris secara paksa. Pengaturan ini tidak dapat diganti oleh konfigurasi tingkat sesi atau tingkat proyek.

  • flexible: Mengaktifkan pelewat fleksibel di lapisan data. Pengaturan ini dapat diganti oleh konfigurasi tingkat sesi atau tingkat proyek.

Saat membuat tabel eksternal untuk JSON dengan objek bersarang (structs), jangan definisikan tipe data bidang objek sebagai STRING atau JSON. Jika tidak, MaxCompute tidak dapat mengurai subfield-nya.

Dua pendekatan berikut direkomendasikan. Untuk langkah-langkah terperinci, lihat contoh dalam topik ini:

  • Definisikan bidang sebagai STRING dan gunakan fungsi seperti get_json_object dalam kueri Anda untuk mengekstrak konten subfield internal sesuai kebutuhan.

  • Gunakan tipe STRUCT untuk mendefinisikan bidang secara struktural, memetakan setiap subfield objek JSON ke sub-kolom terpisah. Hal ini memungkinkan Anda mengakses data internal secara langsung menggunakan sintaksis field_name.subfield_name.

Daftar putih dan blacklist

Tabel eksternal OSS MaxCompute mendukung penyaringan daftar putih dan blacklist. Dengan mengatur parameter daftar putih dan blacklist dalam tblproperties, Anda dapat menyaring file mana saja yang akan dibaca dari suatu direktori. Untuk detailnya, lihat Daftar putih dan blacklist.

Menulis data

Untuk informasi tentang sintaksis penulisan data dari MaxCompute ke OSS, lihat Menulis data ke OSS.

Kueri data

BadRowSkipping

Fitur BadRowSkipping memungkinkan Anda melewati baris yang berisi data rusak atau menyebabkan error parsing. Fitur ini tidak mengubah cara format data dasar diinterpretasikan.

Parameter

  • Parameter tingkat tabel: odps.text.option.bad.row.skipping

    • rigid: Memaksa pelewat. Pengaturan ini tidak dapat diganti oleh konfigurasi tingkat sesi atau tingkat proyek.

    • flexible: Mengaktifkan pelewat. Pengaturan ini fleksibel, sehingga dapat diganti oleh konfigurasi tingkat sesi atau tingkat proyek.

  • Parameter tingkat sesi/proyek

    • Parameter odps.sql.unstructured.text.bad.row.skipping dapat mengganti parameter tingkat tabel flexible, tetapi tidak dapat mengganti yang rigid.

      • on: Mengaktifkan fitur. Jika fitur tidak dikonfigurasi untuk tabel, fitur ini diaktifkan secara bawaan.

      • off: Menonaktifkan fitur. Jika tabel dikonfigurasi sebagai flexible, fitur dinonaktifkan. Jika tidak, pengaturan parameter tabel yang digunakan.

      • <null> atau input tidak valid: Konfigurasi tingkat tabel yang digunakan.

    • odps.sql.unstructured.text.bad.row.skipping.debug.num: Menentukan jumlah hasil error yang dicetak ke stdout di Logview.

      • Nilai maksimum adalah 1000.

      • Jika nilainya <=0, fitur ini dinonaktifkan.

      • Jika nilainya tidak valid, fitur ini dinonaktifkan.

  • Interaksi antara parameter tingkat sesi dan properti tabel

    properti tbl

    flag sesi

    hasil

    rigid

    on

    On, Dipaksa aktif

    off

    <null>, nilai tidak valid, atau parameter tidak dikonfigurasi

    flexible

    on

    On

    off

    Off, Dinonaktifkan oleh sesi

    <null>, nilai tidak valid, atau parameter tidak dikonfigurasi

    On

    Tidak dikonfigurasi

    on

    On, Diaktifkan oleh sesi

    off

    Off

    <null>, nilai tidak valid, atau parameter tidak dikonfigurasi

Contoh

  1. Siapkan data

    Unggah data uji json_bad_row_skipping.json, yang berisi beberapa data rusak, ke direktori oss-mc-test/badrow/ di OSS.

  2. Buat tabel eksternal JSON

    Perilaku berbeda berdasarkan properti tingkat tabel dan flag tingkat sesi. Tiga kasus berikut mungkin terjadi:

    • Parameter tabel: odps.text.option.bad.row.skipping = flexible/rigid/<tidak ditentukan>

    • Flag sesi: odps.sql.unstructured.text.bad.row.skipping = on/off/<tidak diatur>

    Tidak ada properti tingkat tabel

    -- Tidak ada properti tingkat tabel yang diatur. Error ditangani berdasarkan flag tingkat sesi.
    CREATE EXTERNAL TABLE test_json_bad_data_skipping_flag
    (
      a INT,
      b INT
    )
    row format serde 'org.apache.hive.hcatalog.data.JsonSerDe'
    stored AS textfile
    location '<oss://databucketpath>';

    Pelewat fleksibel

    -- Properti tingkat tabel melewat baris error, tetapi flag tingkat sesi dapat menonaktifkan perilaku ini.
    CREATE EXTERNAL TABLE test_json_bad_data_skipping_flexible
    (
      a INT,
      b INT
    )
    row format serde 'org.apache.hive.hcatalog.data.JsonSerDe'
    stored AS textfile
    location '<oss://databucketpath>'
    tblproperties (
      'odps.text.option.bad.row.skipping' = 'flexible'   -- Mode fleksibel, dapat dinonaktifkan di tingkat sesi.
    );

    Pelewat rigid

    -- Properti tingkat tabel memaksa pelewat error. Perilaku ini tidak dapat dinonaktifkan di tingkat sesi.
    CREATE EXTERNAL TABLE test_json_bad_data_skipping_rigid
    (
      a INT,
      b INT
    )
    row format serde 'org.apache.hive.hcatalog.data.JsonSerDe'
    stored AS textfile
    location '<oss://databucketpath>'
    tblproperties (
      'odps.text.option.bad.row.skipping' = 'rigid'  -- Dipaksa aktif.
    );
  3. Verifikasi hasil kueri

    Tidak ada properti tingkat tabel

    -- Aktifkan di tingkat sesi.
    SET odps.sql.unstructured.text.bad.row.skipping=on;
    
    -- Nonaktifkan di tingkat sesi. Jika properti tabel 'flexible', fitur akan dinonaktifkan. Jika properti tabel 'rigid', pengaturan ini tidak berpengaruh.
    SET odps.sql.unstructured.text.bad.row.skipping=off;
    
    -- Cetak baris bermasalah. Maksimum 1.000. Jika nilainya kurang dari atau sama dengan 0, pencetakan dinonaktifkan.
    SET odps.sql.unstructured.text.bad.row.skipping.debug.num=10;
    
    SELECT * FROM test_json_bad_data_skipping_flag;

    Jika pelewat error dinonaktifkan di tingkat sesi (SET odps.sql.unstructured.text.bad.row.skipping=off), kueri gagal dengan error berikut: FAILED: ODPS-0123131:User defined function exception

    Pelewat fleksibel

    -- Aktifkan di tingkat sesi.
    SET odps.sql.unstructured.text.bad.row.skipping=on;
    
    -- Nonaktifkan di tingkat sesi. Jika properti tabel 'flexible', fitur akan dinonaktifkan. Jika properti tabel 'rigid', pengaturan ini tidak berpengaruh.
    SET odps.sql.unstructured.text.bad.row.skipping=off;
    
    -- Cetak baris bermasalah. Maksimum 1.000. Jika nilainya kurang dari atau sama dengan 0, pencetakan dinonaktifkan.
    SET odps.sql.unstructured.text.bad.row.skipping.debug.num=10;
    
    SELECT * FROM test_json_bad_data_skipping_flexible;

    Jika pelewat error dinonaktifkan di tingkat sesi (SET odps.sql.unstructured.text.bad.row.skipping=off), kueri gagal dengan error berikut: FAILED: ODPS-0123131:User defined function exception

    Peloncatan Kaku

    -- Aktifkan di tingkat sesi.
    SET odps.sql.unstructured.text.bad.row.skipping=on;
    
    -- Nonaktifkan di tingkat sesi. Jika properti tabel 'flexible', fitur akan dinonaktifkan. Jika properti tabel 'rigid', pengaturan ini tidak berpengaruh.
    SET odps.sql.unstructured.text.bad.row.skipping=off;
    
    -- Cetak baris bermasalah. Maksimum 1.000. Jika nilainya kurang dari atau sama dengan 0, pencetakan dinonaktifkan.
    SET odps.sql.unstructured.text.bad.row.skipping.debug.num=10;
    
    SELECT * FROM test_json_bad_data_skipping_rigid;

    Hasil berikut dikembalikan:

    +------------+------------+
    | a          | b          | 
    +------------+------------+
    | 1          | 2          | 
    | 15         | 16         | 
    +------------+------------+

Contoh

Prasyarat

  1. Anda telah membuat proyek MaxCompute.

  2. Anda telah menyiapkan bucket dan direktori OSS. Untuk informasi selengkapnya, lihat Buat bucket dan Kelola direktori.

    Pastikan bucket Anda berada di wilayah yang sama dengan proyek MaxCompute Anda.
  3. Berikan izin.

    1. Anda memiliki izin untuk mengakses OSS. Anda dapat mengakses tabel eksternal OSS menggunakan Akun Alibaba Cloud, Pengguna RAM, atau Peran RAM. Untuk informasi selengkapnya tentang cara memberikan izin, lihat Otorisasi mode STS untuk OSS.

    2. Anda memiliki izin CreateTable di proyek MaxCompute. Untuk informasi selengkapnya tentang izin terkait tabel, lihat Izin MaxCompute.

Contoh 1: Buat, tulis, dan kueri tabel JSON

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

  1. Siapkan data.

    Login ke Konsol OSS dan unggah file data uji json2025.txt ke direktori external-table-test/json/dt=20250521/ di Bucket OSS. Untuk informasi selengkapnya, lihat Unggah file ke OSS.

  2. Buat tabel eksternal 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. Jika tabel eksternal OSS Anda adalah tabel partisi, Anda juga harus mengimpor data partisi. Untuk informasi selengkapnya, lihat Tabel eksternal OSS.

    -- Tambahkan 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 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 bidang JSON bersarang

Siapkan data

Buat file JSON events.json:

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

Login ke Konsol OSS dan unggah data uji ke direktori external-table-test/json_struct/ di bucket OSS. Untuk informasi selengkapnya, lihat Unggah file ke OSS.

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. Gunakan 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. Baca 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 menerima data

  1. Buat tabel eksternal berformat JSON dan gunakan tipe STRUCT untuk menerima 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. Kueri data dalam tabel secara langsung:

    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: Sesuaikan nama file output

  1. Atur awalan kustom untuk file yang ditulis ke OSS menjadi test06_. DDL-nya 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 (
    -- Tambahkan 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');

    Setelah menulis data, file yang dihasilkan di OSS diberi nama dengan awalan kustom test06_, misalnya, test06_202509101.

  2. Untuk menyesuaikan akhiran file yang ditulis ke OSS menjadi _beijing, DDL-nya 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 (
    -- Tambahkan 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');
  3. Untuk menghasilkan ekstensi file secara otomatis untuk file output, gunakan DDL 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 (
    -- Hasilkan ekstensi file secara otomatis.
        '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');
  4. Untuk menyesuaikan ekstensi file menjadi jsonl untuk file yang ditulis ke OSS, DDL-nya 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 (
    -- Tambahkan ekstensi file 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');

    Nama file yang dihasilkan adalah 20250905072538695g3mlopvxicr4_M1_1_0_0-0_TableSink1.jsonl, dengan ekstensi file kustom .jsonl.

  5. Untuk file yang ditulis ke OSS, atur awalan menjadi mc_, akhiran menjadi _beijing, dan ekstensi file menjadi jsonl. DDL-nya 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 (
        -- Tambahkan awalan kustom.
        'odps.external.data.output.prefix'='mc_', 
        -- Tambahkan akhiran kustom.
        'odps.external.data.output.suffix'='_beijing', 
        -- Tambahkan ekstensi file 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');

    Nama file yang dihasilkan adalah mc_20250905073013526gra1l214x6t6_M1_1_0_0-0_TableSink1_beijing.jsonl, di mana 20250905073013526 adalah timestamp yang dihasilkan sistem, dan bagian tengahnya adalah pengenal tugas.

FAQ

Error: Unexpected end-of-input: expected close marker for OBJECT

  • Pesan error

    ODPS-0123131:User defined function exception - Traceback:
    com.aliyun.odps.serde.SerDeException: org.apache.hadoop.hive.serde2.SerDeException: org.codehaus.jackson.JsonParseException: Unexpected end-of-input: expected close marker for OBJECT (from [Source: java.io.ByteArrayInputStream@5a021cb9; line: 1, column: 0])
     at [Source: java.io.ByteArrayInputStream@5a021cb9; line: 1, column: 3]
    	at com.aliyun.odps.hive.wrapper.HiveSerDeWrapper.deserialize(HiveSerDeWrapper.java:122)
    	at com.aliyun.odps.udf.HiveReaderHandler.next(HiveReaderHandler.java:152)
    	at com.aliyun.odps.udf.HiveReaderHandler5c9b68c118d14fb2b392e8d916ddea8c.next(Unknown Source)
  • Penyebab

    Error ini biasanya terjadi pada data JSON yang tidak valid, seperti file JSON Lines (JSONL). Error dipicu jika suatu record berisi karakter newline yang tidak di-escape, melanggar aturan satu-record-per-baris.

  • Solusi

    Escape karakter newline dalam file JSON, lalu baca datanya.

  • Pemecahan masalah

    Saat Anda mengaktifkan BadRowSkipping, detail tentang baris yang dilewati dicetak ke log stdout di Logview. Hal ini membantu Anda mendiagnosis error data. Gunakan pengaturan berikut untuk mengaktifkan fitur ini:

    -- Atur parameter BadRowSkipping ke on di tingkat sesi untuk melewati data error.
    SET odps.sql.unstructured.text.bad.row.skipping=on;
    
    -- Tentukan jumlah record error yang dapat dicetak ke stdout di Logview.
    SET odps.sql.unstructured.text.bad.row.skipping.debug.num=<number>;

Error parameter daftar putih saat membaca tabel eksternal JSON: Start token not found where expected

  • Pesan error

    FAILED: ODPS-0123131:User defined function exception - Traceback:
    com.aliyun.odps.serde.SerDeException: org.apache.hadoop.hive.serde2.SerDeException: java.io.IOException: Start token not found where expected
            at com.aliyun.odps.hive.wrapper.HiveSerDeWrapper.deserialize(HiveSerDeWrapper.java:122)
            at com.aliyun.odps.udf.HiveReaderHandler.next(HiveReaderHandler.java:152)
    Caused by: org.apache.hadoop.hive.serde2.SerDeException: java.io.IOException: Start token not found where expected
            at org.apache.hive.hcatalog.data.JsonSerDe.deserialize(JsonSerDe.java:190)
            at com.aliyun.odps.hive.wrapper.json.JsonEnhancedSerde.deserialize(JsonEnhancedSerde.java:50)
            at com.aliyun.odps.hive.wrapper.HiveSerDeWrapper.deserialize(HiveSerDeWrapper.java:120)
            ... 1 more
    Caused by: java.io.IOException: Start token not found where expected
            at org.apache.hive.hcatalog.data.JsonSerDe.deserialize(JsonSerDe.java:176)
            ... 3 more
     | fatalInstance: Odps/yyy_yueyi_dev_20251226063242326gd2yy12fi2h3_SQL_0_1_0_job_0/M1#0_0 
  • Penyebab

    Saat mencocokkan dengan parameter daftar putih, tidak ada file yang cocok.

  • Solusi

    Verifikasi bahwa pola regex dalam parameter daftar putih benar.

Tipe data yang didukung

Untuk informasi selengkapnya tentang tipe data MaxCompute, lihat Tipe data (Versi 1.0) dan Tipe data (Versi 2.0).

Tipe

Didukung

Type

Didukung

TINYINT

Ya

STRING

Ya

SMALLINT

Ya

DATE

Ya

INT

Ya

DATETIME

Tidak

BIGINT

Ya

TIMESTAMP

Tidak

BINARY

Tidak

TIMESTAMP_NTZ

Ya

FLOAT

Ya

BOOLEAN

Ya

DOUBLE

Ya

ARRAY

Ya

DECIMAL(precision, scale)

Ya

MAP

Ya

VARCHAR(n)

Ya

STRUCT

Ya

CHAR(n)

Ya

JSON

Tidak

Format kompresi yang didukung

Untuk menulis file terkompresi ke OSS, tambahkan klausa tblproperties dan konfigurasikan properti kompresi. Untuk informasi selengkapnya, lihat Parameter TBLPROPERTIES.

Properti kompresi

Baca

Tulis

Gzip

Ya

Ya

BZip2

Ya

Ya

Deflate

Ya

Ya

ZSTD

Ya

Ya

SNAPPY(SnappyRawCodec)

Ya

Tidak

SNAPPY(SnappyCodec)

Ya

Ya

Saat membaca file TEXTFILE terkompresi yang namanya berisi akhiran .bz2, .deflate, .snappy, .gz, atau .zstd, tidak diperlukan konfigurasi tambahan.

Evolusi skema yang didukung

Tabel eksternal JSON memetakan kolom tabel ke bidang JSON berdasarkan nama.

Dalam tabel berikut, Kompatibilitas data menunjukkan apakah tabel masih dapat membaca data historis dengan benar setelah perubahan skema.

Operasi

Didukung

Deskripsi

Kompatibilitas data

Tambah kolom

Ya

  • Anda tidak dapat menentukan urutan kolom baru. Kolom tersebut ditambahkan sebagai kolom terakhir secara bawaan.

  • Nilai bawaan untuk kolom reguler yang baru ditambahkan hanya berlaku untuk data yang ditulis oleh MaxCompute.

  • Data yang sesuai dengan skema yang dimodifikasi dapat dibaca dengan benar.

  • Data yang ada yang menggunakan skema lama dibaca berdasarkan skema baru.

    Contoh: Saat membaca data historis yang tidak memiliki kolom baru, MaxCompute mengisi kolom tersebut dengan NULL.

Hapus kolom

Ya

Tabel eksternal JSON memetakan kolom berdasarkan nama.

Kompatibel

Ubah urutan kolom

Ya

Tabel eksternal JSON memetakan kolom berdasarkan nama.

Kompatibel

Ubah tipe data kolom

Ya

Untuk informasi tentang konversi tipe data yang didukung, lihat Ubah tipe data kolom.

Kompatibel

Ubah nama kolom

Tidak

Operasi ini tidak disarankan. Tabel eksternal JSON memetakan kolom berdasarkan nama. Setelah Anda mengubah nama kolom, nama kolom dalam file JSON tidak lagi cocok dengan skema baru, yang dapat menyebabkan operasi baca gagal.

  • Data yang sesuai dengan skema yang dimodifikasi dapat dibaca dengan benar.

  • Data yang ada yang menggunakan skema lama dibaca berdasarkan skema baru.

    Contoh: Setelah Anda mengubah nama kolom, jika kunci yang sesuai dalam file JSON tidak diubah namanya, kolom tersebut mengembalikan NULL saat Anda membaca tabel.

Ubah komentar kolom

Ya

Komentar harus berupa string valid dengan panjang maksimal 1.024 byte. Jika tidak, error akan dilaporkan.

Kompatibel

Ubah properti non-null kolom

Tidak

Operasi ini tidak didukung. Kolom bersifat nullable secara bawaan.

Tidak berlaku