Tabel Objek memetakan direktori OSS ke tabel metadata yang dapat dikueri di dalam MaxCompute. Fitur ini memungkinkan mesin SQL membaca, memfilter, dan memproses data tidak terstruktur—seperti gambar, video, PDF, dan file log—pada skala yang sama dengan data terstruktur, tanpa memindahkan file apa pun keluar dari OSS.
Dengan Tabel Objek, Anda dapat:
Query file metadata with SQL — daftar semua objek dalam direktori OSS dan filter berdasarkan nama, ukuran, tipe, atau waktu modifikasi terakhir menggunakan pernyataan SELECT standar.
Baca konten objek secara massal — gunakan fungsi bawaan
GET_DATA_FROM_OSSdi dalam kueri SQL untuk mengalirkan konten objek ke pekerja komputasi terdistribusi guna pemrosesan skala besar.Simpan metadata tetap mutakhir secara otomatis — cache metadata OSS di dalam MaxCompute dan konfigurasikan refresh manual, periodik, atau terjadwal agar tetap selaras dengan perubahan di OSS.
Proses data tidak terstruktur dengan logika kustom — unggah gambar kustom untuk membuat UDF (user-defined function) yang berjalan bersama mesin SQL dan menulis hasil ke tabel internal atau tabel eksternal. Tabel Objek juga akan mendukung penulisan hasil tidak terstruktur kembali ke OSS pada rilis mendatang.
Gunakan mesin Maxframe — Tabel Objek mendukung mesin Maxframe untuk ekosistem Python.
Membuat Tabel Objek tidak menyalin atau mengubah data OSS Anda. MaxCompute hanya menyimpan cache metadata objek. File sebenarnya tetap berada di OSS.
Prasyarat
Sebelum memulai, pastikan Anda telah memiliki:
Proyek MaxCompute dengan fitur Schema diaktifkan. Lihat Aktifkan fitur Schema.
Sistem tipe data MaxCompute 2.0 diaktifkan di proyek Anda.
Menyelesaikan otorisasi satu klik untuk
AliyunODPSDefaultRole, yang memberikan akses MaxCompute ke OSS melalui token Security Token Service (STS). Otorisasi satu klik hanya tersedia jika ProjectOwner proyek MaxCompute adalah Akun Alibaba Cloud yang sama dengan pemilik bucket OSS.
Batasan
Tabel Objek tidak mendukung partisi.
Refresh manual maupun periodik keduanya merupakan Pembaruan penuh.
Penagihan
Penyimpanan metadata: MaxCompute mengenakan biaya penyimpanan untuk metadata yang di-cache dalam Tabel Objek. Lihat Biaya penyimpanan. OSS secara terpisah mengenakan biaya untuk data aktual yang disimpan dan diakses di bucket. Lihat Biaya penyimpanan OSS.
Tugas refresh: inputsize untuk setiap file yang dipindai selama refresh didasarkan pada ukuran metadatanya, bukan ukuran file aktual. Biaya refresh meningkat seiring jumlah file, bukan ukurannya. Lihat Penagihan SQL untuk tabel eksternal.
Komputasi: Menjalankan kueri terhadap Tabel Objek menghasilkan biaya komputasi.
Pay-as-you-go: Kueri metadata ditagih sebagai kueri tabel internal. Lihat Penagihan SQL Standar. Kueri yang membaca konten objek OSS melalui
GET_DATA_FROM_OSSditagih sebagai kueri tabel eksternal. Lihat Penagihan SQL untuk tabel eksternal.Langganan: Sumber daya komputasi langganan dikonsumsi. Lihat Biaya komputasi (Langganan).
Buat Tabel Objek
Sintaks
CREATE OBJECT TABLE [IF NOT EXISTS] <objecttable_name>
WITH SERDEPROPERTIES ('<key>' = '<value>')
LOCATION '<location>'
[TBLPROPERTIES ('<key>' = '<value>')]
[COMMENT '<comment>'];Anda tidak perlu mendefinisikan kolom. MaxCompute menyediakan kolom metadata secara otomatis.
Parameter
| Parameter | Wajib | Deskripsi |
|---|---|---|
objecttable_name | Ya | Nama tabel. |
SERDEPROPERTIES | Ya | Menentukan role RAM untuk otentikasi. Kuncinya adalah odps.properties.rolearn dan nilainya adalah ARN role dalam format acs:ram::<uid>:role/aliyunodpsdefaultrole. Jika dihilangkan, AliyunODPSDefaultRole di bawah Akun Alibaba Cloud saat ini akan digunakan. Untuk mendapatkan UID akun, lihat Lihat informasi pengguna RAM. Untuk detail otorisasi mode STS, lihat Berikan izin ke role RAM umum dalam mode STS untuk OSS. |
location | Ya | Path OSS yang akan dipetakan. Format: oss://<oss_endpoint>/<bucket_name>/<oss_directory_name>/. Tabel Objek mengindeks semua objek dalam direktori tersebut. Gunakan titik akhir jaringan internal, bukan titik akhir publik — penggunaan titik akhir publik menyebabkan error koneksi. Untuk mendapatkan titik akhir internal: login ke Konsol OSS, pada halaman Buckets klik Bucket Name yang dituju untuk membuka halaman Objects, lalu di bagian Port pada halaman Overview dapatkan Endpoint untuk Access from ECS over the Classic Network (internal network). |
metadata.cache.mode | Tidak | Mode pemicu refresh. Lihat Pilih mode refresh. Default: manual. |
metadata.staleness.seconds | Tidak | Interval refresh dalam detik untuk mode periodic. Rentang: 1–604800 (1 detik hingga 1 minggu). Bukan jaminan ketat; penjadwal menggunakan nilai ini sebagai target. Wajib ditentukan jika metadata.cache.mode bernilai periodic. |
metadata.crontab.expression | Tidak | Ekspresi cron untuk mode crontab. Contohnya, 0 0 14 * * ? menjalankan refresh setiap hari pukul 14.00. Wajib ditentukan jika metadata.cache.mode bernilai crontab. |
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/';Lihat properti Object Table
DESC <object_table_name>;Contoh:
DESC ot_demo_day;Output mencantumkan pemilik tabel, proyek, Schema, timestamp, dan kolom metadata aslinya:
+------------------------------------------------------------------------------------+
| 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 object in bytes. |
| type | varchar(32) | | Object type: Normal, Multipart, Appendable, or 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 ETag of the object. |
| restore_info | varchar(256) | | Restoration status from cold storage. |
| owner_id | bigint | | The ID of the bucket owner. |
| owner_display_name | varchar(256) | | The display name of the bucket owner. |
+------------------------------------------------------------------------------------+Kolom asli menyediakan metadata berikut:
| Kolom | Tipe | Dapat bernilai null | Deskripsi |
|---|---|---|---|
key | VARCHAR(2048) — batas panjang asli: 1.023 karakter | Tidak | Path relatif objek dalam Tabel Objek. Lihat Konvensi penamaan objek OSS. |
size | BIGINT | Tidak | Ukuran objek dalam byte. |
type | VARCHAR(32) | Tidak | Tipe objek OSS: Normal, Multipart, Appendable, atau Symlink. |
last_modified | TIMESTAMP_NTZ | Tidak | Waktu objek terakhir dimodifikasi di OSS. |
storage_class | VARCHAR(32) | Tidak | Kelas penyimpanan OSS. Lihat Kelas penyimpanan. |
etag | VARCHAR(64) | Tidak | Tag entitas yang dihasilkan saat objek dibuat. Mengidentifikasi apakah konten objek berubah antar pembaruan, tetapi bukan pengenal unik. |
restore_info | VARCHAR(256) | Ya | Status restorasi untuk objek arsip. Diisi hanya selama proses restorasi sedang berlangsung. |
owner_id | BIGINT | Ya | ID pemilik objek. |
owner_display_name | VARCHAR(256) | Ya | Nama tampilan pemilik objek. |
Lihat pernyataan DDL Tabel Objek
SHOW CREATE TABLE <object_table_name>;Contoh:
SHOW CREATE TABLE ot_demo_day;Contoh output:
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');Refresh metadata Tabel Objek
MaxCompute menyimpan cache metadata objek OSS dan kueri dijalankan terhadap cache tersebut. Refresh cache sebelum menjalankan kueri untuk memastikan metadata mencerminkan kondisi terkini direktori OSS Anda.
Pilih mode refresh
Pilih mode refresh saat membuat tabel atau biarkan sebagai default (manual).
| Mode | Pemicu | Gunakan saat | Parameter wajib |
|---|---|---|---|
manual (default) | ALTER TABLE ... REFRESH METADATA | Perubahan jarang terjadi atau Anda memerlukan kontrol penuh atas waktu eksekusi | — |
periodic | Otomatis, pada interval tetap | File sering berubah dan Anda menginginkan pemeliharaan minimal | metadata.staleness.seconds |
crontab | Otomatis, sesuai jadwal cron | Anda memerlukan refresh pada waktu tertentu dalam sehari atau seminggu | metadata.crontab.expression |
Refresh manual
Jalankan perintah berikut untuk memicu refresh metadata penuh:
ALTER TABLE <objecttable_name> REFRESH METADATA;Contoh:
ALTER TABLE ot_demo_day REFRESH METADATA;Refresh periodik
Atur metadata.cache.mode ke periodic dan tentukan metadata.staleness.seconds saat membuat tabel. Penjadwal akan memicu refresh penuh kira-kira sesuai interval yang Anda tentukan.
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'
);metadata.staleness.seconds menerima nilai antara 1 dan 604800 (1 detik hingga 1 minggu). Nilai ini bukan jaminan ketat — penjadwal menggunakannya sebagai target.
Refresh terjadwal
Atur metadata.cache.mode ke crontab dan tentukan metadata.crontab.expression saat membuat tabel. Gunakan ekspresi cron standar untuk menentukan jadwal tepatnya.
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' = '0 0 14 * * ?'
);Ekspresi cron 0 0 14 * * ? menjalankan refresh setiap hari pukul 14.00: 0 (detik), 0 (menit), 14 (jam), * (hari dalam bulan apa pun), * (bulan apa pun), ? (hari dalam minggu — saling eksklusif dengan hari dalam bulan).
Lihat riwayat tugas refresh
Periksa status tugas refresh sebelumnya dengan:
SHOW refresh task history FOR object TABLE <object_table_name>;Contoh dan output:
-- View refresh task history for ot_demo_day04.
SHOW refresh task history FOR object TABLE ot_demo_day04;
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 |
+---------------------------------------------------------------------------------------------------+
OKOutput berisi satu baris per tugas: InstanceId, CreateTime, EndTime, dan Status. Jika suatu tugas menunjukkan Failed, jalankan wait <InstanceId>; dan periksa output Logview untuk detailnya.
Kueri Tabel Objek
Jalankan pernyataan SELECT standar untuk mengkueri metadata objek:
SELECT * FROM <object_table_name>;Contoh — pratinjau lima catatan pertama:
SELECT * FROM ot_demo_day LIMIT 5;Anda dapat menerapkan operasi SQL apa pun pada metadata: agregasi, join, fungsi jendela, ORDER BY, LIMIT, dan filter penurunan kondisi.
Baca konten objek
Mengkueri Tabel Objek hanya bekerja pada metadata yang di-cache — tidak ada konten objek yang dibaca dari OSS. Untuk memproses konten aktual objek, gunakan fungsi bawaan GET_DATA_FROM_OSS di dalam kueri SQL Anda.
GET_DATA_FROM_OSS
GET_DATA_FROM_OSS membaca sebagian atau seluruh objek dan mengembalikannya sebagai nilai biner. Semua contoh di bawah menggunakan path tiga tingkat project.schema.object_table untuk mengidentifikasi Tabel Objek.
BINARY GET_DATA_FROM_OSS (
STRING <full_object_table_name>,
STRING <key>
[, BIGINT <offset>]
[, BIGINT <length>]
[, STRING <object_not_found_policy>]
)| Parameter | Wajib | Tipe | Default | Deskripsi |
|---|---|---|---|---|
full_object_table_name | Ya | STRING | — | Path lengkap tiga tingkat ke Tabel Objek: project.schema.object_table. Digunakan untuk menghasilkan token STS untuk akses OSS saat otentikasi role RAM (RoleARN) dikonfigurasi. |
key | Ya | STRING | — | Nilai key dari baris Tabel Objek — path relatif objek yang akan dibaca. |
offset | Tidak | BIGINT | 0 | Offset byte tempat pembacaan dimulai. Harus >= 0. |
length | Tidak | BIGINT | -1 (tanpa batas) | Jumlah byte yang akan dibaca. |
object_not_found_policy | Tidak | STRING | OUTPUT_NULL | Tindakan saat kunci yang di-cache tidak lagi ada di OSS. OUTPUT_NULL: kembalikan NULL tanpa error. THROW_EXCEPTION: timbulkan error dan hentikan tugas. WARN_AND_NULL: kembalikan NULL dan catat peringatan — jika hal ini terjadi pada banyak objek, performa tugas secara keseluruhan mungkin menurun. |
GET_DATA_FROM_OSSmengembalikan data biner. Bungkus denganSTRING()untuk mendapatkan hasil string.
Contoh
Ubah hasil menjadi STRING:
SELECT STRING(
GET_DATA_FROM_OSS('<project_name>.default.ot_demo_day', key, 0, -1, 'OUTPUT_NULL')
)
FROM ot_demo_day;Panggilan ekuivalen — semua contoh berikut membaca konten penuh setiap objek dengan pengaturan default (offset=0, length=-1, policy=OUTPUT_NULL):
-- Full explicit form
SELECT GET_DATA_FROM_OSS('<project_name>.default.ot_demo_day', key, 0, -1, 'OUTPUT_NULL') FROM ot_demo_day;
-- Equivalent shorthand forms
SELECT GET_DATA_FROM_OSS('<project_name>.default.ot_demo_day', key) FROM ot_demo_day;
SELECT GET_DATA_FROM_OSS('<project_name>.default.ot_demo_day', key, 0) FROM ot_demo_day;
SELECT GET_DATA_FROM_OSS('<project_name>.default.ot_demo_day', key, 0, -1) FROM ot_demo_day;
SELECT GET_DATA_FROM_OSS('<project_name>.default.ot_demo_day', key, 'OUTPUT_NULL') FROM ot_demo_day;
SELECT GET_DATA_FROM_OSS('<project_name>.default.ot_demo_day', key, 0, 'OUTPUT_NULL') FROM ot_demo_day;Pertimbangan performa
Saat kueri SQL mengunduh konten objek OSS melalui GET_DATA_FROM_OSS, strategi chunking MaxCompute default (berdasarkan jumlah baris dan byte record) tidak optimal. Ukuran chunk ditentukan oleh volume metadata, bukan ukuran objek aktual — satu file besar bisa berada dalam chunk yang sama dengan ratusan file kecil, menyebabkan kesenjangan data parah dan masalah long-tail.
Contoh masalah:
| Objek | Ukuran |
|---|---|
| a0000.jpg – a1023.jpg (1.024 file) | 10 MB per file |
| b.avi | 10 GB |
Dengan dua pekerja dan pemisahan berbasis baris, mesin mungkin membuat split1 (a0000.jpg–a0511.jpg, unduhan 5 GB) dan split2 (a0512.jpg–a1023.jpg + b.avi, unduhan 15 GB). Ketimpangan 3x ini menyebabkan long tail.
Chunking Tabel Objek berdasarkan ukuran: MaxCompute secara otomatis membagi Tabel Objek berdasarkan ukuran objek aktual. Dengan unit split 10 GB, split1 mendapatkan semua 1.024 file JPEG (total 10 GB) dan split2 mendapatkan b.avi (10 GB) — kedua pekerja melakukan beban kerja yang sama.
Unit split default adalah 1 GB. Sesuaikan dengan workload Anda:
-- Split by GB (default: 1 GB)
SET odps.sql.object.table.split.unit.gb = 1;
SELECT GET_DATA_FROM_OSS('project.default.ot_demo_day', key) FROM ot_demo_day WHERE ...;
-- Split by MB (higher priority than GB)
SET odps.sql.object.table.split.unit.mb = 512;
SELECT GET_DATA_FROM_OSS('project.default.ot_demo_day', key) FROM ot_demo_day WHERE ...;
-- Split by KB (highest priority)
SET odps.sql.object.table.split.unit.kb = 512;
SELECT GET_DATA_FROM_OSS('project.default.ot_demo_day', key) FROM ot_demo_day WHERE ...;Urutan prioritas: KB > MB > GB.
Untuk menonaktifkan chunking berbasis ukuran sepenuhnya, atur:
SET odps.sql.object.table.split.by.object.size.enabled = false;Menonaktifkan chunking berbasis ukuran menyebabkan kueri dijalankan sebagai dua job terpisah. Job pertama melakukan pra-pemrosesan dan terlihat di Logview.
Operasi lainnya
Hapus metadata Tabel Objek
TRUNCATE TABLE menghapus semua metadata yang di-cache tetapi mempertahankan definisi tabel:
TRUNCATE TABLE <object_table_name>;Contoh:
TRUNCATE TABLE ot_demo_day;Ubah nama Tabel Objek
ALTER TABLE <object_table_name> RENAME TO <new_object_table_name>;Contoh:
ALTER TABLE ot_demo_day RENAME TO new_ot_demo_day;Hapus Tabel Objek
Menghapus Tabel Objek menghapus metadata yang di-cache dan menghentikan biaya penyimpanan. Data OSS aktual tidak terpengaruh. Buat ulang tabel kapan saja untuk melanjutkan penggunaan data.
DROP TABLE [IF EXISTS] <object_table_name>;Contoh:
DROP TABLE IF EXISTS ot_demo_day;FAQ
Error connection refused saat merefresh metadata
Anda melihat error seperti:
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_REFUSEDParameter location diatur ke titik akhir OSS publik. Tabel Objek memerlukan titik akhir jaringan internal. Perbarui parameter location agar menggunakan titik akhir internal — lihat deskripsi parameter location di Buat Tabel Objek.
Refresh periodik tidak terpicu sesuai jadwal
Periksa bahwa parameter location menggunakan nama domain jaringan internal OSS, bukan titik akhir publik. Lihat deskripsi parameter location di Buat Tabel Objek.
Tugas refresh periodik gagal dengan error internal
Anda melihat:
FAILED: ODPS-0010000:System internal error - ActionHandler job failed with failinfo
storage service worker error occured: common/io/oss/oss_file_system_cppsdk.cpp(877):
OSSRequestException: Status: -50, RequestId: , ErrorCode: ClientError:-50, Message:Ini adalah error sisi platform. Kirim tiket untuk menghubungi dukungan teknis MaxCompute.