MaxCompute menyediakan fitur tabel objek yang memungkinkan Mesin komputasi gudang data untuk mengakses data tidak terstruktur beserta metadata-nya dalam penyimpanan data lake. Topik ini menjelaskan sintaks perintah dan memberikan contoh penggunaan tabel objek.
Latar Belakang
Dalam banyak Alur kerja AI, pengembang gudang data yang memahami data dan logika bisnis perlu melakukan pra-pemrosesan atau pemrosesan data tidak terstruktur untuk model besar. Tugas-tugas ini memanfaatkan daya komputasi skala besar dengan biaya rendah dari platform data besar. Proses dan hasilnya kemudian berinteraksi dengan data di gudang data atau data lake.
Penggunaan SQL untuk memproses data tidak terstruktur menghadirkan tantangan berikut:
Mesin SQL data besar tidak mengetahui ukuran objek saat membaca file dari penyimpanan objek. Hal ini menyulitkan optimalisasi rencana eksekusi, pengendalian konkurensi, atau peluncuran otomatis jumlah task konkuren yang sesuai. Selain itu, tanpa penurunan predikat yang efektif, daya komputasi tidak dapat dimanfaatkan secara maksimal, terutama jika terjadi kesenjangan data.
Membaca metadata dari penyimpanan objek menyebabkan latensi tinggi karena setiap kueri memerlukan panggilan remote ke layanan penyimpanan.
Daftar file dari penyimpanan objek hanya dapat diambil secara serial dalam Fungsi tabel yang didefinisikan pengguna (UDTF) proses tunggal, sehingga mengakibatkan kinerja pembacaan data yang buruk.
Anda harus mengimplementasikan logika otorisasi dan konektivitas jaringan dalam user-defined function (UDF) untuk terhubung ke layanan penyimpanan.
UDF memiliki kemampuan terbatas dalam memproses data tidak terstruktur. Gudang data tradisional kekurangan fitur untuk mengunggah gambar kustom secara fleksibel dan aman, serta tidak menyediakan lingkungan eksekusi yang aman untuk UDF. Selain itu, panggilan remote memerlukan integrasi konkurensi yang kompleks dengan layanan komputasi terdistribusi.
Fitur
Fitur tabel objek menyediakan kemampuan berikut:
Menyediakan akses berbentuk tabel ke metadata file Object Storage Service (OSS).
Menyimpan cache metadata berversi dari file OSS dalam tabel metadata, yang digunakan oleh mesin SQL untuk optimalisasi kueri seperti penyaringan data dan penurunan predikat.
Menyediakan fungsi dokumen bawaan untuk membaca konten file data tidak terstruktur dalam berbagai cara.
Memungkinkan mesin SQL MaxCompute untuk membuat Pemisahan konkuren dari metadata tabel objek, sehingga mendukung komputasi terdistribusi skala besar untuk pembacaan dan pemrosesan data yang lebih efisien.
Memungkinkan Anda mengunggah gambar kustom untuk membangun UDF guna memproses data tidak terstruktur.
Mendukung pemrosesan data tidak terstruktur untuk menghasilkan hasil terstruktur dan menuliskannya ke Tabel internal atau tabel eksternal di gudang data. Versi mendatang juga akan mendukung pembuatan hasil tidak terstruktur dan penulisan kembali ke Object Storage Service (OSS) melalui tabel objek.
Mendukung mesin Maxframe dari ekosistem Python.
Batasan
Anda harus mengaktifkan fitur skema untuk Proyek MaxCompute Anda. Untuk informasi selengkapnya, lihat Mengaktifkan fitur skema.
MaxCompute harus mendukung Type System 2.0.
Tabel objek saat ini tidak mendukung partisi.
Penagihan
Anda dikenakan biaya untuk metadata yang disimpan dalam tabel objek. Untuk informasi selengkapnya, lihat Harga penyimpanan. Meskipun MaxCompute tidak mengenakan biaya untuk menyimpan file OSS yang sebenarnya, biaya standar OSS untuk penyimpanan data dan akses tetap berlaku. Untuk informasi selengkapnya, lihat Harga penyimpanan OSS.
Untuk task yang mengekstrak dan me-refresh metadata OSS,
inputsizeuntuk setiap file yang dipindai didasarkan pada ukuran metadata-nya, bukan ukuran file sebenarnya. Oleh karena itu, total biaya Pekerjaan refresh bergantung pada jumlah file, bukan ukuran sebenarnya. Untuk informasi selengkapnya, lihat Penagihan SQL untuk tabel eksternal.Biaya komputasi berlaku saat Anda menggunakan tabel objek untuk menganalisis dan mengekstrak data tidak terstruktur dari OSS.
Dengan penagihan bayar sesuai penggunaan, analisis metadata tabel objek dikenakan tagihan yang sama seperti Tabel internal. Untuk informasi selengkapnya, lihat Penagihan SQL Standar. Pemrosesan konten data tidak terstruktur dari OSS ditagih sebagai tabel eksternal. Untuk informasi selengkapnya, lihat Penagihan SQL untuk tabel eksternal.
Dalam model subscription, komputasi menggunakan resource prabayar Anda. Untuk informasi selengkapnya, lihat Biaya komputasi (subscription).
Membuat tabel objek
Sintaks
CREATE OBJECT TABLE [IF NOT EXISTS] <objecttable_name>
WITH SERDEPROPERTIES ('<key>' = '<value>')
LOCATION '<location>'
[TBLPROPERTIES ('<key>' = '<value>')]
[COMMENT '<comment>']
;Tabel objek hanya dapat digunakan dalam Proyek tempat fitur skema diaktifkan. Anda juga harus mengaktifkan sintaks skema.
Anda tidak perlu mendefinisikan kolom untuk tabel objek karena kolom metadata-nya disediakan oleh sistem.
Parameter
Parameter | Wajib | Deskripsi |
objecttable_name | Ya | Nama tabel. |
SERDEPROPERTIES ('<key>'='<value>') | Ya |
Role |
location | Ya |
|
TBLPROPERTIES ('<key>'='<value>') | Tidak |
|
comment | Tidak | Komentar untuk tabel. |
Contoh
SET odps.namespace.schema=true;
CREATE OBJECT TABLE ot_demo_day
WITH serdeproperties (
'odps.properties.rolearn'='acs:ram::xxxxxx:role/aliyunodpsdefaultrole')
LOCATION 'oss://oss-cn-hangzhou-internal.aliyuncs.com/odps-external-****/ottest/';Melihat properti tabel objek
Sintaks
DESC <object_table_name>Parameter
object_table_name: Wajib. Nama tabel.
Contoh
SET odps.namespace.schema=true;
DESC ot_demo_day; Hasil berikut dikembalikan:
+------------------------------------------------------------------------------------+
| Owner: ALIYUN$****@test.aliyunid.com |
| Project: test_objecttable |
| Schema: default |
| TableComment: |
+------------------------------------------------------------------------------------+
| CreateTime: 2024-09-02 20:01:56 |
| LastDDLTime: 2024-09-02 20:01:56 |
| LastModifiedTime: 2024-09-02 20:01:56 |
+------------------------------------------------------------------------------------+
| InternalTable: YES | Size: 0 |
+------------------------------------------------------------------------------------+
| Native Columns: |
+------------------------------------------------------------------------------------+
| Field | Type | Label | Comment |
+------------------------------------------------------------------------------------+
| key | varchar(2048) | | The name of the object. |
| size | bigint | | The size of the returned object in bytes. |
| type | varchar(32) | | The type of the object and valid values: Normal, Multipart, Appendable, and Symlink. |
| last_modified | timestamp | | The last modified time of the object. |
| storage_class | varchar(32) | | The storage class of the object. |
| etag | varchar(64) | | The entity tag (ETag). When an object is created, an ETag is created to identify the content of the object. |
| restore_info | varchar(256) | | The restoration status of the object. |
| owner_id | bigint | | The ID of the bucket owner. |
| owner_display_name | varchar(256) | | The display name of the bucket owner. |
+------------------------------------------------------------------------------------+Tabel berikut menjelaskan kolom-kolom utama dalam hasil.
Nama kolom | Tipe | Null diperbolehkan | Deskripsi |
key | VARCHAR(2048) Panjang kunci bisa mencapai 1.023 karakter. Untuk informasi selengkapnya, lihat Aturan dan contoh penamaan objek OSS. | False | Path relatif objek dalam tabel objek. |
size | BIGINT | False | Ukuran objek dalam byte. |
type | VARCHAR(32) | False | Jenis objek dalam OSS: Normal, Multipart, Appendable, atau Symlink. |
last_modified | TIMESTAMP_NTZ | False | Waktu terakhir kali data objek diubah di OSS. |
storage_class | VARCHAR(32) | False | Kelas penyimpanan objek di OSS. Untuk informasi selengkapnya, lihat Kelas penyimpanan. |
etag | VARCHAR(64) | False | ETag (entity tag) dibuat saat objek dihasilkan. Ini digunakan untuk mengidentifikasi apakah konten objek telah berubah antar pembaruan, tetapi bukan merupakan pengenal unik. |
restore_info | VARCHAR(256) | True | Informasi tentang status pemulihan objek dari penyimpanan dingin. |
owner_id | BIGINT | True | ID pemilik objek. |
owner_display_name | VARCHAR(256) | True | Nama tampilan pemilik objek. |
Melihat pernyataan CREATE TABLE
Sintaks
SHOW CREATE TABLE <object_table_name>;Parameter
object_table_name: Wajib. Nama tabel.
Contoh
SET odps.namespace.schema=true;
SHOW CREATE TABLE ot_demo_day; Hasil berikut dikembalikan:
CREATE OBJECT TABLE IF NOT EXISTS yunqi_object_****.`default`.ot_demo_day
WITH SERDEPROPERTIES (
'serialization.format'='1',
'odps.properties.rolearn'='acs:ram::139699392458****:role/aliyunodpsdefaultrole')
LOCATION
'oss://oss-cn-hangzhou-internal.aliyuncs.com/odps-external-****/ottest/'
TBLPROPERTIES (
'last_modified_time'='1731478307',
'transient_lastDdlTime'='1731478307',
'metadata.cache.mode'='manual',
'metadata.staleness.seconds'='3600');Me-refresh metadata tabel objek
Data aktual untuk tabel objek disimpan di OSS. MaxCompute menyimpan cache metadata objek-objek ini dan menggunakan metadata yang di-cache tersebut untuk kueri dan komputasi. Oleh karena itu, Anda harus me-refresh cache sebelum menggunakan tabel objek. Anda dapat me-refresh metadata secara manual atau mengonfigurasi refresh berkala saat membuat tabel.
Baik refresh manual maupun berkala merupakan Pembaruan penuh.
Penyegaran Manual
Setiap refresh melakukan sinkronisasi penuh terhadap metadata. Anda dapat mengontrol waktu dan frekuensi refresh ini.
Sintaks
ALTER TABLE <objecttable_name> REFRESH METADATA;Parameter
objecttable_name: Wajib. Nama tabel.
Contoh
SET odps.namespace.schema=true; ALTER TABLE ot_demo_day REFRESH METADATA;
Refresh berkala
Jika file dalam direktori OSS yang dipetakan ke tabel objek sering berubah, Anda dapat mengonfigurasi refresh metadata berkala. Untuk mengurangi biaya maintenance, tentukan parameter refresh saat Anda membuat tabel.
Sintaks
SET odps.namespace.schema=true; SET odps.sql.type.system.odps2 = true; CREATE OBJECT TABLE ot_demo_day WITH serdeproperties ( 'odps.properties.rolearn'='acs:ram::xxxxxx:role/aliyunodpsdefaultrole' ) location 'oss://oss-cn-hangzhou-internal.aliyuncs.com/odps-external-****/ottest/' tblproperties ( 'metadata.cache.mode' = 'periodic', 'metadata.staleness.seconds' = '3600' );Parameter
metadata.staleness.seconds: Interval refresh. Parameter ini wajib untuk modeperiodic. Nilai harus berada dalam rentang[1, 604800], yang merepresentasikan rentang dari 1 detik hingga 1 minggu.metadata.cache.mode: Mode refresh. Pilih salah satu opsi berikut:periodic: Memicu refresh secara berkala.crontab: Memicu refresh berdasarkan jadwal.manual: Memicu refresh secara manual (default). Anda dapat mengontrol waktu pemicuan.
Refresh terjadwal
Jika file dalam direktori OSS yang dipetakan ke tabel objek sering berubah, Anda dapat menjadwalkan refresh metadata. Untuk mengurangi biaya maintenance, tentukan parameter penjadwalan saat Anda membuat tabel.
Sintaks
SET odps.namespace.schema=true; SET odps.sql.type.system.odps2 = true; CREATE OBJECT TABLE ot_demo_day WITH SERDEPROPERTIES ( 'odps.properties.rolearn'='acs:ram::xxxxxx:role/aliyunodpsdefaultrole' ) LOCATION 'oss://oss-cn-region-internal.aliyuncs.com/odps-external-****/ottest/' TBLPROPERTIES ( 'metadata.cache.mode' = 'crontab', 'metadata.crontab.expression' = 'your_timed_expression' );Parameter
metadata.crontab.expression: Ekspresi cron untuk Tugas terjadwal. Misalnya, untuk memicu task sekali pada pukul 14:00 setiap hari, Anda dapat mengatur ekspresi menjadi0 0 14 * * ?, yang berarti0detik,0menit, jam ke-14(14:00),*untuk setiap hari,*untuk setiap bulan, dan?untuk hari dalam minggu yang tidak ditentukan (saling eksklusif dengan bidang hari dalam bulan untuk menghindari konflik).metadata.cache.mode: Mode refresh. Pilih salah satu opsi berikut:crontab: Memicu refresh berdasarkan jadwal.periodic: Memicu refresh secara berkala.manual: Memicu refresh secara manual (default). Anda dapat mengontrol waktu pemicuan.
Lihat Tugas Penyegaran
Anda dapat menjalankan perintah berikut untuk melihat riwayat task refresh.
SHOW refresh task history FOR object TABLE <object_table_name>;Parameter
<object_table_name> harus berupa tabel objek.
Nilai kembalian: ID instans (
InstanceId), waktu pembuatan (CreateTime), waktu berakhir (EndTime), dan status eksekusi (Status) dari task refresh.Saat Status bernilai Failed, Anda dapat menjalankan
wait InstanceId;untuk mencetak tampilan log dan memeriksa detail error.
Contoh
-- Melihat riwayat task refresh untuk tabel objek. SET odps.namespace.schema=true; SHOW refresh task history for object table ot_demo_day04; -- Hasil berikut dikembalikan. ID = 20260105*******f +---------------------------------------------------------------------------------------------------+ | Project: test_project | | Schema: default | | Task: *** | +---------------------------------------------------------------------------------------------------+ | History: | +---------------------------------------------------------------------------------------------------+ | InstanceId | CreateTime | EndTime | Status | +---------------------------------------------------------------------------------------------------+ | 20260105******************ks | 2026-01-05 14:12:00 | 2026-01-05 14:12:04 | Terminated | | 20260105******************y3 | 2026-01-05 14:10:00 | 2026-01-05 14:10:03 | Terminated | +---------------------------------------------------------------------------------------------------+ OK
Melakukan kueri pada tabel objek
Setelah tabel objek mengambil metadata file dari direktori OSS, Anda dapat melakukan kueri pada tabel untuk menelusuri metadata ini. Anda juga dapat menggunakan Pernyataan SQL untuk melakukan perhitungan pada metadata, seperti agregasi, join, Fungsi jendela, ORDER BY, dan LIMIT.
Sintaks
SELECT * FROM <object_table_name>;Parameter
object_table_name: Wajib. Nama tabel.
Contoh
-- Melakukan kueri pada data yang diunggah ke direktori OSS yang ditentukan. Jika jumlah data besar, Anda dapat membatasi hasil hingga lima baris.
SET odps.namespace.schema=true;
SELECT * FROM ot_demo_day [limit 5];Melakukan kueri pada data biner objek menggunakan Pseudo Column
Pseudo column dihasilkan secara otomatis oleh sistem dan tidak perlu didefinisikan saat tabel objek dibuat. Data biner objek dapat dikueri secara langsung melalui pseudo column dengan tiga cara berikut:
Kolom _data
Kolom _data mengembalikan data biner lengkap dari sebuah objek, seperti aliran biner gambar. Tipe data-nya adalah BINARY.
Data biner dari satu objek sebaiknya tidak terlalu besar karena hal ini dapat menyebabkan error kehabisan memori.
Kolom _data sederhana digunakan dan berfungsi dengan banyak fungsi yang ada.
Penggunaan:
SET odps.namespace.schema=true; SELECT _data FROM test_ot1;Kolom _blob
Kolom _blob mengembalikan tautan Referensi untuk mengunduh data biner, bukan data biner itu sendiri. Ini menunda pembacaan data aktual untuk mengontrol konsumsi memori saat melewati Operator SQL. Tipe data-nya adalah Blob. Untuk informasi selengkapnya, lihat Tipe data Blob dan penyimpanan multimodal.
Dibandingkan dengan kolom _data, kolom _blob menawarkan keunggulan dalam stabilitas komputasi dan konsumsi resource.
Untuk objek yang lebih kecil (rata-rata kurang dari 1 MB), kolom _data direkomendasikan.
Untuk objek yang lebih besar, kolom _blob direkomendasikan. Kolom _blob mendukung konsumsi tertunda dan menggunakan lebih sedikit memori saat data melewati Operator SQL. Data dikonsumsi sebagai aliran hanya ketika mencapai Operator atau fungsi yang dapat memproses tipe BLOB, memungkinkan konsumsi tertunda dan Penggunaan memori yang terkendali.
Penggunaan:
SET odps.namespace.schema=true; SELECT _blob FROM test_ot1;Kolom _signed_url
Kolom _signed_url menyediakan URL untuk mengunggah atau mengunduh data biner tanpa perlu masuk. Kolom _signed_url direkomendasikan untuk akses lintas sistem, program, atau lingkungan heterogen.
Penggunaan:
SET odps.namespace.schema=true; SELECT _signed_url FROM test_ot1;
Contoh
Kolom _data
Unduh file uji dan unggah ke OSS: ot_test.txt.
Buat tabel objek.
SET odps.namespace.schema=true; SET odps.sql.type.system.odps2=true; SET odps.mcqa.disable=TRUE; DROP TABLE IF EXISTS test_ot1; CREATE OBJECT TABLE test_ot1 LOCATION 'oss://oss-cn-<region>-internal.aliyuncs.com/<bucket name>/<file path>/'; -- Me-refresh cache tabel. ALTER TABLE test_ot1 REFRESH METADATA; SET odps.mcqa.disable=TRUE; SET odps.namespace.schema=true; SELECT * FROM test_ot1; -- Hasil berikut dikembalikan: +------+------------+------+---------------+---------------+------+--------------+------------+--------------------+ | key | size | type | last_modified | storage_class | etag | restore_info | owner_id | owner_display_name | +------+------------+------+---------------+---------------+------+--------------+------------+--------------------+ | ot_test.txt | 286 |Normal|2026-07-21 06:49:59| Standard | 3*01 | NONE | 1***279014 | 1***279014 | +------+------------+------+---------------+---------------+------+--------------+------------+--------------------+Baca kolom _data.
SET odps.namespace.schema=true; SELECT _data FROM test_ot1; -- Hasil berikut dikembalikan: +-------+ | _data | +-------+ | {=0A=20=20"id":=20**1,=0A=20=20"title":=20"Hello=20World",=0A=20=20"description":=20"=E8=BF**E4=BE=8B=20JSON=20=**82",=0A=20=20"tags":=20[=0A*=20"=E7**=8B",=0A=20=20=20=20"JSON",=0A=20=20=20=20"Example"=0A=20=20],=0A=20=20"metadata":=20{=0A=20=20=20=20"author":=20"AI=20Assistant",=0A=20=20=20=20"created_at":=20"2023-10-01T12:00:00Z",=0A=20=20=20=20"is_active":=20true=0A=20=20}=0A} |Lihat konten teks.
SET odps.namespace.schema=true; SELECT CAST(_data AS STRING) FROM test_ot1; -- Hasil berikut dikembalikan: +-----+ | _c0 | +-----+ | { "id": 1001, "title": "Hello World", "description": "这是一个包含中英文的示例 JSON 数据。", "tags": [ "编程", "JSON", "Example" ], "metadata": { "author": "AI Assistant", "created_at": "2023-10-01T12:00:00Z", "is_active": true } } | +-----+
Kolom _blob
Unduh file uji dan unggah ke OSS: ot_test.txt.
Buat tabel objek.
SET odps.namespace.schema=true; SET odps.sql.type.system.odps2=true; SET odps.mcqa.disable=TRUE; DROP TABLE IF EXISTS test_ot1; CREATE OBJECT TABLE test_ot1 LOCATION 'oss://oss-cn-<region>-internal.aliyuncs.com/<bucket name>/<file path>/'; -- Me-refresh cache tabel. ALTER TABLE test_ot1 REFRESH METADATA; SET odps.mcqa.disable=TRUE; SET odps.namespace.schema=true; SELECT * FROM test_ot1; -- Hasil berikut dikembalikan: +------+------------+------+---------------+---------------+------+--------------+------------+--------------------+ | key | size | type | last_modified | storage_class | etag | restore_info | owner_id | owner_display_name | +------+------------+------+---------------+---------------+------+--------------+------------+--------------------+ | ot_test.txt | 286 |Normal|2026-07-21 06:49:59| Standard | 3*01 | NONE | 1***279014 | 1***279014 | +------+------------+------+---------------+---------------+------+--------------+------------+--------------------+Baca kolom _blob.
SET odps.namespace.schema=true; SELECT _blob FROM test_ot1; -- Hasil berikut dikembalikan: +-------+ | _blob | +-------+ | CAEQAxruAgEAAAANA**AAEb2svMjAy3CIAKhR5WVBc/0S4GmxSm4psPJ5CV3k4STIeCgl***FyYTQ1ZXEx | +-------+Lihat konten teks.
SET odps.namespace.schema=true; SELECT CAST(read_blob(_blob) AS STRING) FROM test_ot1; -- Hasil berikut dikembalikan: +-----+ | _c0 | +-----+ | { "id": 1001, "title": "Hello World", "description": "这是一个包含中英文的示例 JSON 数据。", "tags": [ "编程", "JSON", "Example" ], "metadata": { "author": "AI Assistant", "created_at": "2023-10-01T12:00:00Z", "is_active": true } } | +-----+
Menghapus tabel objek
Tabel objek menyimpan cache metadata file yang mengonsumsi penyimpanan dan menimbulkan biaya. Jika Anda tidak lagi memerlukan data yang di-cache, hapus tabel objek. Anda dapat membuatnya kembali nanti jika diperlukan.
Sintaks
DROP TABLE [IF EXISTS] <object_table_name>; Parameter
object_table_name: Wajib. Nama tabel.
Contoh
SET odps.namespace.schema=true;
DROP TABLE IF EXISTS ot_demo_day;FAQ
ODPS-0010000:System internal error
Gejala
Anda menerima pesan error berikut:
ODPS-0010000:System internal error - ActionHandler job failed with failinfo storage service worker error occured: common/io/oss/oss_file_system_cppsdk.cpp(919): OSSRequestException: Status: -50, RequestId: , ErrorCode: ClientError:-50, Message: E_HTTP_ERROR_CONN_REFUSEDPenyebab
Anda menggunakan Titik akhir publik untuk OSS saat membuat tabel objek.
Solusi
Saat membuat tabel objek,
oss_endpointdalam parameterlocationharus berupa Titik akhir internal. Untuk informasi tentang cara mendapatkan Titik akhir internal, lihat Parameter. Jika error tetap ada setelah Anda beralih ke Titik akhir internal, hubungi tim dukungan teknis MaxCompute dengan mengirimkan Tiket.
Refresh berkala gagal
Gejala
Anda telah menetapkan parameter refresh berkala saat membuat tabel objek. Namun, refresh tidak berjalan pada interval yang ditentukan.
Solusi
Pastikan bahwa parameter location yang Anda konfigurasikan saat membuat tabel objek menentukan Titik akhir internal OSS. Untuk informasi selengkapnya tentang cara membuat tabel objek, lihat Parameter.