All Products
Search
Document Center

MaxCompute:Tabel eksternal JSON

Last Updated:Mar 29, 2026

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

Lingkup

  • Tabel eksternal OSS tidak mendukung properti cluster.

  • Ukuran satu file tidak boleh melebihi 2 GB. Anda harus membagi file yang lebih besar dari 2 GB.

  • MaxCompute dan OSS harus berada di wilayah yang sama.

  • Tipe data yang didukung.

  • Dukungan evolusi skema.

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 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 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

  • 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 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.text.option.bad.row.skipping

Untuk melewati data kotor dalam file data OSS.

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

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

  • flexible: Mengaktifkan pelewat fleksibel pada 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 detailnya, 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 subkolom terpisah. Hal ini memungkinkan Anda mengakses data internal secara langsung menggunakan sintaksis field_name.subfield_name.

Tulis data

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

Kueri data

BadRowSkipping

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

Contoh

  1. Siapkan data

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

  2. Buat tabel eksternal JSON

    Perilaku berbeda tergantung pada 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 melewatkan 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 pada tingkat sesi.
    );

    Pelewat kaku

    -- Properti tingkat tabel memaksa pelewat error. Perilaku ini tidak dapat dinonaktifkan pada 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 pada tingkat sesi.
    SET odps.sql.unstructured.text.bad.row.skipping=on;
    
    -- Nonaktifkan pada tingkat sesi. Jika properti tabel adalah 'flexible', perilaku ini akan dinonaktifkan. Jika properti tabel adalah '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 pada 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 pada tingkat sesi.
    SET odps.sql.unstructured.text.bad.row.skipping=on;
    
    -- Nonaktifkan pada tingkat sesi. Jika properti tabel adalah 'flexible', perilaku ini akan dinonaktifkan. Jika properti tabel adalah '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 pada tingkat sesi (SET odps.sql.unstructured.text.bad.row.skipping=off), kueri gagal dengan error berikut: FAILED: ODPS-0123131:User defined function exception

    Pelewat kaku

    -- Aktifkan pada tingkat sesi.
    SET odps.sql.unstructured.text.bad.row.skipping=on;
    
    -- Nonaktifkan pada tingkat sesi. Jika properti tabel adalah 'flexible', perilaku ini akan dinonaktifkan. Jika properti tabel adalah '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. Proyek MaxCompute telah dibuat. Untuk informasi selengkapnya, lihat Buat proyek MaxCompute.

  2. Bucket dan direktori OSS telah disiapkan. Untuk informasi selengkapnya, lihat Buat bucket dan Kelola direktori.

    MaxCompute hanya tersedia di beberapa wilayah. Untuk menghindari potensi masalah konektivitas data lintas wilayah, kami merekomendasikan penggunaan bucket di wilayah yang sama dengan proyek MaxCompute Anda.
  3. Izin yang diperlukan telah diberikan:

    1. Izin untuk mengakses OSS. Akun Alibaba Cloud, Pengguna RAM, atau Peran RAM dapat digunakan untuk mengakses tabel eksternal OSS. Untuk informasi selengkapnya tentang otorisasi, lihat Otorisasi mode STS untuk OSS.

    2. Izin CreateTable dalam proyek MaxCompute Anda. Untuk informasi selengkapnya tentang izin operasi 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.

    Masuk ke Konsol OSS dan unggah file data uji json2025.txt ke direktori external-table-test/json/dt=20250521/ dalam 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 field JSON bersarang

Siapkan data

Buat file 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 direktori external-table-test/json-sturct/ dalam 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 field

  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 field 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 field 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 field 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 field 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 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 (
    -- 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');

    Gambar berikut menunjukkan file yang dihasilkan setelah operasi penulisan.

    image

  2. Untuk menyesuaikan akhiran file yang ditulis ke OSS menjadi _beijing, DDL-nya 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 (
    -- 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');

    Gambar berikut menunjukkan file yang dihasilkan setelah operasi penulisan.

    image

  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');

    Gambar berikut menunjukkan file yang dihasilkan setelah operasi penulisan.

  4. Untuk menyesuaikan ekstensi file menjadi jsonl untuk file yang ditulis ke OSS, DDL-nya 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 (
    -- 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');

    Gambar berikut menunjukkan file yang dihasilkan setelah operasi penulisan.

    image.png

  5. Untuk file yang ditulis ke OSS, atur awalan menjadi mc_, akhiran menjadi _beijing, dan ekstensi file menjadi jsonl. DDL-nya 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 (
        -- 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');

    Gambar berikut menunjukkan file yang dihasilkan setelah operasi penulisan.

    image.png

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 karena data JSON tidak valid, seperti file JSON Lines (JSONL). Error dipicu jika suatu record berisi karakter newline yang tidak di-escape, sehingga 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 pada 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>;

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

Tipe

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

Evolusi skema

Tabel eksternal JSON memetakan kolom tabel ke field 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 mengganti 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 mengganti nama kolom, jika kunci yang sesuai dalam file JSON tidak diganti 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