All Products
Search
Document Center

MaxCompute:Tabel Objek

Last Updated:Mar 26, 2026

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_OSS di 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.

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

ParameterWajibDeskripsi
objecttable_nameYaNama tabel.
SERDEPROPERTIESYaMenentukan 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.
locationYaPath 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.modeTidakMode pemicu refresh. Lihat Pilih mode refresh. Default: manual.
metadata.staleness.secondsTidakInterval 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.expressionTidakEkspresi cron untuk mode crontab. Contohnya, 0 0 14 * * ? menjalankan refresh setiap hari pukul 14.00. Wajib ditentukan jika metadata.cache.mode bernilai crontab.
commentTidakKomentar 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:

KolomTipeDapat bernilai nullDeskripsi
keyVARCHAR(2048) — batas panjang asli: 1.023 karakterTidakPath relatif objek dalam Tabel Objek. Lihat Konvensi penamaan objek OSS.
sizeBIGINTTidakUkuran objek dalam byte.
typeVARCHAR(32)TidakTipe objek OSS: Normal, Multipart, Appendable, atau Symlink.
last_modifiedTIMESTAMP_NTZTidakWaktu objek terakhir dimodifikasi di OSS.
storage_classVARCHAR(32)TidakKelas penyimpanan OSS. Lihat Kelas penyimpanan.
etagVARCHAR(64)TidakTag entitas yang dihasilkan saat objek dibuat. Mengidentifikasi apakah konten objek berubah antar pembaruan, tetapi bukan pengenal unik.
restore_infoVARCHAR(256)YaStatus restorasi untuk objek arsip. Diisi hanya selama proses restorasi sedang berlangsung.
owner_idBIGINTYaID pemilik objek.
owner_display_nameVARCHAR(256)YaNama 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).

ModePemicuGunakan saatParameter wajib
manual (default)ALTER TABLE ... REFRESH METADATAPerubahan jarang terjadi atau Anda memerlukan kontrol penuh atas waktu eksekusi
periodicOtomatis, pada interval tetapFile sering berubah dan Anda menginginkan pemeliharaan minimalmetadata.staleness.seconds
crontabOtomatis, sesuai jadwal cronAnda memerlukan refresh pada waktu tertentu dalam sehari atau seminggumetadata.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   |
+---------------------------------------------------------------------------------------------------+

OK

Output 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>]
)
ParameterWajibTipeDefaultDeskripsi
full_object_table_nameYaSTRINGPath lengkap tiga tingkat ke Tabel Objek: project.schema.object_table. Digunakan untuk menghasilkan token STS untuk akses OSS saat otentikasi role RAM (RoleARN) dikonfigurasi.
keyYaSTRINGNilai key dari baris Tabel Objek — path relatif objek yang akan dibaca.
offsetTidakBIGINT0Offset byte tempat pembacaan dimulai. Harus >= 0.
lengthTidakBIGINT-1 (tanpa batas)Jumlah byte yang akan dibaca.
object_not_found_policyTidakSTRINGOUTPUT_NULLTindakan 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_OSS mengembalikan data biner. Bungkus dengan STRING() 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:

ObjekUkuran
a0000.jpg – a1023.jpg (1.024 file)10 MB per file
b.avi10 GB

Dengan dua pekerja dan pemisahan berbasis baris, mesin mungkin membuat split1 (a0000.jpga0511.jpg, unduhan 5 GB) dan split2 (a0512.jpga1023.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_REFUSED

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