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.
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 parameterodps.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 |
| 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 Catatan: Hanya metode kompresi dalam |
| 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. |
| Kombinasi karakter valid, seperti | Tidak ada |
odps.external.data.enable.extension | Untuk menambahkan ekstensi file ke nama file output. | Jika diatur ke |
| 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. |
| Kombinasi karakter valid, seperti | 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 | 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:
|
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. |
|
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_objectdalam kueri Anda untuk mengekstrak konten subfield internal sesuai kebutuhan.Gunakan tipe
STRUCTuntuk mendefinisikan bidang secara struktural, memetakan setiap subfield objek JSON ke sub-kolom terpisah. Hal ini memungkinkan Anda mengakses data internal secara langsung menggunakan sintaksisfield_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
Untuk informasi tentang sintaksis SELECT, lihat Membaca data dari OSS.
Untuk informasi tentang cara mengoptimalkan rencana kueri, lihat Optimasi kueri.
Untuk informasi selengkapnya tentang BadRowSkipping, lihat BadRowSkipping.
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.skippingrigid: 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/proyekParameter
odps.sql.unstructured.text.bad.row.skippingdapat mengganti parameter tingkat tabelflexible, tetapi tidak dapat mengganti yangrigid.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
Siapkan data
Unggah data uji json_bad_row_skipping.json, yang berisi beberapa data rusak, ke direktori
oss-mc-test/badrow/di OSS.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. );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 exceptionPelewat 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 exceptionPeloncatan 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
Anda telah membuat proyek MaxCompute.
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.
Berikan izin.
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.
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.
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.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/';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;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 | +------------+------------+------------+Tulis data ke tabel eksternal JSON.
INSERT INTO mc_oss_extable_name_json PARTITION (dt='20250526') VALUES ('test','1627273823');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
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"} | +------------------------------------+Gunakan fungsi
get_json_objectuntuk membaca bidangadanid: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 | +-------------------+-----+Baca bidang bersarang
x,y, danid: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
Buat tabel eksternal berformat JSON dan gunakan tipe
STRUCTuntuk 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/';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 | +----------+-----+Anda juga dapat menggunakan fungsi
get_json_objectdanTO_JSONuntuk membaca bidangxdany: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
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.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');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');Untuk menyesuaikan ekstensi file menjadi
jsonluntuk 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.Untuk file yang ditulis ke OSS, atur awalan menjadi
mc_, akhiran menjadi_beijing, dan ekstensi file menjadijsonl. 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 mana20250905073013526adalah 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_0Penyebab
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 | STRING | ||
SMALLINT | DATE | ||
INT | DATETIME | ||
BIGINT | TIMESTAMP | ||
BINARY | TIMESTAMP_NTZ | ||
FLOAT | BOOLEAN | ||
DOUBLE | ARRAY | ||
DECIMAL(precision, scale) | MAP | ||
VARCHAR(n) | STRUCT | ||
CHAR(n) | JSON |
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 | ||
BZip2 | ||
Deflate | ||
ZSTD | ||
SNAPPY(SnappyRawCodec) | ||
SNAPPY(SnappyCodec) |
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 |
|
| |
Hapus kolom | Tabel eksternal JSON memetakan kolom berdasarkan nama. | Kompatibel | |
Ubah urutan kolom | Tabel eksternal JSON memetakan kolom berdasarkan nama. | Kompatibel | |
Ubah tipe data kolom | Untuk informasi tentang konversi tipe data yang didukung, lihat Ubah tipe data kolom. | Kompatibel | |
Ubah nama kolom | 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. |
| |
Ubah komentar kolom | Komentar harus berupa string valid dengan panjang maksimal 1.024 byte. Jika tidak, error akan dilaporkan. | Kompatibel | |
Ubah properti non-null kolom | Operasi ini tidak didukung. Kolom bersifat nullable secara bawaan. | Tidak berlaku |