MaxCompute memperkenalkan fitur Object Table yang memungkinkan mesin komputasi gudang data mengakses data tidak terstruktur beserta metadata-nya di penyimpanan data lake. Topik ini menjelaskan sintaks perintah untuk Object Table dan menyertakan contoh penggunaannya.
Informasi latar belakang
Banyak proses AI memerlukan pengembang gudang data yang memahami data dan operasi bisnis. Pengembang tersebut memanfaatkan daya komputasi skala besar berbiaya rendah dari platform data besar untuk melakukan pra-pemrosesan data bagi model besar atau menangani data tidak terstruktur. Proses-proses tersebut dan hasilnya 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 Object Storage Service (OSS). Hal ini menyulitkan optimalisasi rencana eksekusi, pengendalian konkurensi, atau penentuan jumlah tugas konkuren yang tepat secara otomatis. Selain itu, kondisi filter tidak dapat didorong ke bawah secara efektif, sehingga mencegah pemanfaatan penuh daya komputasi ketika terjadi kesenjangan data.
Membaca metadata dari Object Storage Service tidak efisien karena setiap kueri memerlukan akses remote ke layanan penyimpanan, yang menyebabkan latensi tinggi.
Daftar file dari Object Storage Service (OSS) hanya dapat diambil secara serial dalam satu proses di dalam user-defined table-valued function (UDTF), sehingga mengakibatkan performa baca data yang buruk.
Logika penanganan izin dan koneksi jaringan ke layanan penyimpanan harus diimplementasikan di dalam user-defined function (UDF).
UDF memiliki kemampuan terbatas untuk memproses data tidak terstruktur. Gudang data tradisional tidak menyediakan cara fleksibel dan aman untuk mengunggah gambar kustom, serta tidak memiliki lingkungan runtime yang aman untuk UDF. Selain itu, pemanggilan remote memerlukan integrasi konkuren dengan layanan komputasi terdistribusi.
Fitur
MaxCompute memperkenalkan fitur Object Table yang memungkinkan mesin komputasi gudang data mengakses data tidak terstruktur beserta metadata-nya di penyimpanan data lake. Fitur ini menyediakan kemampuan berikut:
Memungkinkan mesin membaca metadata objek OSS sebagai tabel.
Menyimpan cache berbagai jenis metadata objek OSS secara terverifikasi berdasarkan kemampuan Metadata Table. Mesin SQL kemudian dapat menggunakan Metadata Table untuk melakukan optimisasi kueri yang efektif, seperti penyaringan data dan penurunan kondisi.
Memungkinkan Anda membaca konten file data tidak terstruktur dengan berbagai cara menggunakan fungsi dokumen bawaan.
Mesin SQL MaxCompute menggunakan metadata Object Table untuk melakukan chunking konkuren, sehingga memungkinkan komputasi terdistribusi skala besar guna meningkatkan efisiensi pembacaan dan pemrosesan data.
Mendukung pengunggahan gambar kustom untuk membangun UDF dan memproses data tidak terstruktur yang dibaca oleh mesin.
Memungkinkan mesin memproses data tidak terstruktur, menghasilkan data terstruktur, dan menuliskannya ke tabel internal maupun tabel eksternal di gudang data. Fitur ini juga akan mendukung pembuatan hasil data tidak terstruktur dan menuliskannya kembali ke Object Storage Service melalui Object Table.
Mendukung mesin Maxframe untuk ekosistem Python.
Batasan
Proyek MaxCompute harus mendukung fitur Schema. Untuk informasi selengkapnya, lihat Aktifkan fitur Schema.
MaxCompute harus mendukung sistem tipe data 2.0.
Object Table tidak mendukung partisi.
Penagihan
Object Table merupakan kumpulan metadata objek dari OSS. Biaya penyimpanan dikenakan untuk metadata yang direfresh dan disimpan di Object Table. Untuk informasi selengkapnya, lihat Biaya penyimpanan. Karena file di OSS tidak disimpan dalam MaxCompute, MaxCompute tidak mengenakan biaya penyimpanan. OSS mengenakan biaya untuk penyimpanan dan akses data. Untuk informasi selengkapnya, lihat Biaya penyimpanan OSS.
Dalam tugas yang mengekstraksi dan merefresh metadata OSS,
inputsizeuntuk setiap file yang dipindai adalah nilai yang terkait dengan metadata, bukan ukuran file sebenarnya. Oleh karena itu, total biaya tugas refresh berkaitan dengan jumlah file, bukan ukuran sebenarnya di OSS. Untuk informasi selengkapnya, lihat Penagihan SQL untuk tabel eksternal.Biaya komputasi dikenakan saat Anda menggunakan Object Table dan metadata-nya untuk menganalisis, mengekstraksi, dan memproses data tidak terstruktur dari OSS.
Dalam mode bayar sesuai penggunaan, analisis metadata pada Object Table ditagih sebagai 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 mode langganan, sumber daya komputasi langganan digunakan. Untuk informasi selengkapnya, lihat Biaya komputasi (Langganan).
Buat OBJECT TABLE
Sintaks
CREATE OBJECT TABLE [IF NOT EXISTS] <objecttable_name>
WITH SERDEPROPERTIES ('<key>' = '<value>')
LOCATION '<location>'
[TBLPROPERTIES ('<key>' = '<value>')]
[COMMENT '<comment>']
;Object Table harus digunakan dalam proyek yang mendukung mode Schema, dan sakelar sintaks Schema harus diaktifkan.
Anda tidak perlu mendefinisikan kolom untuk Object Table. Sistem menyediakan kolom metadata.
Parameter
Parameter | Wajib | Deskripsi |
objecttable_name | Wajib. | Nama tabel. |
SERDEPROPERTIES ('<key>'='<value>') | Wajib. | Menentukan peran RAM untuk otentikasi. Jika parameter ini tidak ditentukan, peran RAM bernama Contoh: Sebelum menggunakan peran tersebut, pastikan Anda telah menyelesaikan otorisasi satu klik untuk
Catatan Otorisasi satu klik hanya dapat dilakukan jika ProjectOwner proyek MaxCompute adalah Akun Alibaba Cloud OSS. |
location | Wajib. |
|
TBLPROPERTIES ('<key>'='<value>') | Opsional. |
|
comment | Opsional. | Komentar 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
Sintaks
DESC <object_table_name>Parameter
object_table_name: Wajib. Nama tabel.
Contoh
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 beberapa kolom dalam hasil yang dikembalikan.
Nama Kolom | Deskripsi Tipe | NULL Diizinkan | Deskripsi |
key | VARCHAR(2048) Batas panjang asli adalah 1023. Untuk informasi selengkapnya, lihat Konvensi penamaan dan contoh objek OSS. | False | Nama jalur relatif objek di Object Table. |
size | BIGINT | False | Ukuran objek dalam byte. |
type | VARCHAR(32) | False | Tipe file objek di OSS: Normal, Multipart, Appendable, dan Symlink. |
last_modified | TIMESTAMP_NTZ | False | Waktu terakhir data objek dimodifikasi di OSS. |
storage_class | VARCHAR(32) | False | Kelas penyimpanan objek di OSS. Untuk informasi selengkapnya tentang tipe spesifik, lihat Kelas penyimpanan. |
etag | VARCHAR(64) | False | ETag adalah tag entitas yang dibuat saat setiap objek dihasilkan. Ini adalah tanda tangan yang digunakan untuk mengidentifikasi apakah konten objek berubah antara dua pembaruan, tetapi bukan pengenal unik. |
restore_info | VARCHAR(256) | True | Menjelaskan apakah objek telah dipulihkan dari penyimpanan dingin. Jika objek sedang dipulihkan, bidang ini berisi informasi tentang proses tersebut. |
owner_id | BIGINT | True | ID pemilik objek. |
owner_display_name | VARCHAR(256) | True | Nama tampilan pemilik objek. |
Lihat pernyataan DDL OBJECT TABLE
Sintaks
SHOW CREATE TABLE <object_table_name>;Parameter
object_table_name: Wajib. Nama tabel.
Contoh
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');Segarkan metadata OBJECT TABLE
Data objek aktual untuk Object Table disimpan di OSS. MaxCompute menyimpan cache metadata objek tersebut dan melakukan kueri serta komputasi berdasarkan metadata yang di-cache. Oleh karena itu, sebelum menggunakan Object Table, Anda harus merefresh cache-nya. Anda dapat merefresh cache secara manual atau mengonfigurasi refresh periodik saat membuat tabel.
Baik refresh manual maupun periodik merupakan pembaruan penuh.
Penyegaran Manual
Setiap refresh merupakan sinkronisasi metadata penuh. Anda dapat mengontrol waktu dan frekuensi refresh.
Sintaks
ALTER TABLE <objecttable_name> REFRESH METADATA;Parameter
objecttable_name: Wajib. Nama tabel.
Contoh
ALTER TABLE ot_demo_day REFRESH METADATA;
Refresh periodik
Jika file dalam direktori OSS yang dipetakan ke Object Table sering berubah, Anda dapat merefresh metadata secara periodik. Untuk melakukannya, tentukan parameter terkait saat membuat tabel. Hal ini mengurangi biaya maintenance.
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: Periode refresh. Untuk modeperiodic, Anda harus menentukan parameter ini. Nilainya harus berada dalam rentang[1, 604800], yaitu 1 detik hingga 1 minggu. Parameter ini bukan jaminan ketat. Penjadwal mencoba mengeksekusi refresh berdasarkan parameter ini.metadata.cache.mode: Metode pemicu refresh. Opsi berikut tersedia.periodic: Refresh dipicu secara periodik.manual: Refresh dipicu secara manual (default). Anda dapat mengontrol waktu pemicunya.
Lihat tugas refresh
Anda dapat menggunakan perintah berikut untuk melihat status tugas refresh historis.
SHOW refresh task history FOR object TABLE <object_table_name>;Parameter
<object_table_name> harus berupa Object Table.
Nilai kembalian: Perintah mengembalikan ID instans (InstanceId), waktu mulai (CreateTime), waktu selesai (EndTime), dan status (Status) setiap tugas refresh.
Jika statusnya Failed, Anda dapat menjalankan
wait InstanceId;lalu mencetak tampilan log untuk melihat detail error.
Contoh
-- Lihat tugas refresh historis Object Table. 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
Kueri OBJECT TABLE
Object Table mengambil metadata file dalam direktori OSS. Anda dapat mengkueri Object Table untuk melihat metadata tersebut. Anda juga dapat menggunakan pernyataan SQL untuk melakukan komputasi pada metadata, seperti penyaringan dan pencocokan. Komputasi ini mencakup tetapi tidak terbatas pada agregasi, join, fungsi jendela, serta klausa `ORDER BY` dan `LIMIT`.
Sintaks
SELECT * FROM <object_table_name>;Parameter
object_table_name: Wajib. Nama tabel.
Contoh
-- Anda dapat mengkueri data yang diunggah ke direktori OSS tertentu. Jika volume datanya besar, Anda dapat melihat lima catatan.
SELECT * FROM ot_demo_day [limit 5];Kueri konten objek untuk komputasi bisnis
Proses kueri hanya melakukan komputasi pada metadata objek. Proses ini tidak melibatkan konten aktual objek. Namun, proses komputasi perlu membaca konten aktual objek tersebut. MaxCompute memiliki fungsi unduh bawaan yang dapat Anda integrasikan ke dalam proses komputasi Anda.
Sintaks fungsi GET_DATA_FROM_OSS
Fungsi GET_DATA_FROM_OSS membaca sebagian atau seluruh konten objek dan mengembalikannya dalam format biner.
BINARY GET_DATA_FROM_OSS (
STRING <full_object_table_name>,
STRING <key>
[, BIGINT <offset>]
[, BIGINT <length>]
[, STRING <object_not_found_policy>]
)Parameter
Parameter | Wajib | Tipe data | Deskripsi | Nilai default |
full_object_table_name | Ya | STRING | Jalur lengkap ke OBJECT TABLE dalam model tiga tingkat, termasuk nama Proyek dan Schema, seperti Jika Anda menggunakan RoleARN untuk otentikasi saat membuat tabel, parameter ini membantu menghasilkan token Security Token Service (STS) secara otomatis untuk mengakses OSS. | Tidak ada |
key | Ya | STRING | Nama objek yang diakses di Object Table. Untuk informasi selengkapnya, lihat deskripsi parameter `key` dalam respons yang dijelaskan di Lihat properti OBJECT TABLE. | Tidak ada |
offset | Tidak | BIGINT | Posisi awal pembacaan konten objek. Nilainya harus lebih besar dari atau sama dengan 0. | 0. Artinya operasi baca dimulai dari awal objek. |
length | Tidak | BIGINT | Jumlah byte yang dibaca. | -1. Artinya panjangnya tidak dibatasi. |
object_not_found_policy | Tidak | STRING | Menentukan cara MaxCompute mengembalikan hasil pemanggilan fungsi jika kunci objek ada di data cache tetapi objek tersebut tidak lagi ada di OSS. Nilai yang valid:
| Nilai default-nya adalah OUTPUT_NULL. |
Contoh 1
Untuk mengeluarkan hasil fungsi GET_DATA_FROM_OSS sebagai tipe STRING, masukkan ke dalam fungsi `STRING`.
SELECT STRING(
GET_DATA_FROM_OSS('<project_name>.default.ot_demo_day', key, 0, -1, 'OUTPUT_NULL')
)
FROM ot_demo_day;Contoh 2
Baca seluruh konten Object Table dan kembalikan sebagai nilai biner. Jalur lengkap Object Table adalah <project_name>.default.ot_demo_day. Kode berikut menunjukkan kombinasi parameter yang berbeda.
-- Format lengkap.
SELECT GET_DATA_FROM_OSS('<project_name>.default.ot_demo_day', key, 0, -1, 'OUTPUT_NULL') FROM ot_demo_day;
-- Pernyataan berikut setara dengan get_data_from_oss('<project_name>.default.ot_demo_day', key, 0, -1, 'OUTPUT_NULL').
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;Gunakan optimisasi kueri untuk meningkatkan performa
Secara default, saat Anda mengakses tabel dalam pernyataan SQL MaxCompute, MaxCompute membuat chunk berukuran merata berdasarkan jumlah catatan, ukuran catatan dalam byte, dan total sumber daya komputasi yang tersedia di bawah kuota Anda. Hal ini menyediakan kemampuan komputasi paralel untuk shard yang berbeda, yang secara efektif mengendalikan masalah long-tail dalam tugas paralel dan meningkatkan performa kueri secara keseluruhan.
Metode chunking ini tidak ideal untuk pernyataan SQL yang perlu mengunduh konten objek dari Object Table untuk komputasi dalam memori. Performa tidak optimal, dan operasi I/O dapat dengan mudah menjadi bottleneck, menyebabkan masalah long-tail. Pertimbangkan kasus berikut:
key | size |
a0000.jpg | 10 MB |
a0001.jpg | 10 MB |
a0002.jpg | 10 MB |
... | ... |
a1022.jpg | 10 MB |
a1023.jpg | 10 MB |
b.avi | 10 GB |
Asumsikan hanya tersedia dua sumber daya worker. Jika chunk dibuat berdasarkan jumlah baris atau byte catatan, seperti yang dilakukan untuk tabel internal standar, dua objek split mungkin dibuat: split1 ([a0000.jpg hingga a0511.jpg]) dan split2 ([a0512.jpg hingga a1023.jpg, b.avi]). Volume data aktual yang diunduh untuk split1 adalah 10 MB × 512 = 5 GB. Volume data untuk split2 adalah 5 GB + 10 GB = 15 GB. Beban komputasi untuk split2 jauh lebih tinggi daripada split1, yang menyebabkan masalah long-tail parah.
Pendekatan yang lebih logis adalah membuat chunk berdasarkan ukuran aktual objek saat pernyataan SQL Anda perlu mengunduhnya. Hal ini membantu mengendalikan masalah long-tail. Jika logika konsumsi data objek OSS lebih memakan waktu, diperlukan kemampuan chunking yang lebih fleksibel. Untuk kasus di atas, Anda dapat membuat dua split: split1 ([a0000.jpg hingga a1023.jpg]) dan split2 ([b.avi]). Volume unduhan untuk kedua split adalah 10 GB.
Object Table MaxCompute menyediakan kemampuan ini dan secara default membuat chunk berdasarkan ukuran objek aktual. Nilai default-nya adalah 1 GB. Anda dapat menyesuaikan nilai ini sesuai kebutuhan, dengan tingkat granularitas KB, MB, atau GB.
# Nilai default-nya adalah 1 GB. Anda dapat menyesuaikannya.
SET odps.sql.object.table.split.unit.gb = 1;
SELECT get_data_from_oss('project.default.ot_demo_day', key) FROM ot_demo_da WHERE ...
# Atau, Anda dapat mengontrolnya pada level MB. Ini memiliki prioritas lebih tinggi daripada parameter GB.
SET odps.sql.object.table.split.unit.mb = 1;
SELECT get_data_from_oss('project.default.ot_demo_day', key) FROM ot_demo_da WHERE ...
# Atau, Anda dapat mengontrolnya pada level KB. Ini memiliki prioritas lebih tinggi daripada parameter GB dan MB.
SET odps.sql.object.table.split.unit.kb = 1;
SELECT get_data_from_oss('project.default.ot_demo_day', key) FROM ot_demo_da WHERE ...Dalam beberapa kasus, Anda mungkin ingin menonaktifkan solusi optimisasi kueri ini. Solusi ini menjalankan dua pekerjaan. Pekerjaan pertama melakukan pra-pemrosesan, dan Anda dapat melihat informasinya di Logview. Object Table MaxCompute menyediakan cara untuk melakukannya:
SET odps.sql.object.table.split.by.object.size.enabled = false;
SELECT get_data_from_oss('project.default.ot_demo_day', key) FROM ot_demo_day WHERE ...Hapus OBJECT TABLE
Object Table menyimpan cache metadata Anda, yang mengonsumsi storage space dan menimbulkan biaya penyimpanan. Jika Anda tidak lagi memerlukan data cache ini untuk bisnis Anda, Anda dapat menghapus Object Table tersebut. Untuk menggunakan data tersebut lagi di masa depan, Anda dapat membuat ulang Object Table.
Sintaks
DROP TABLE [IF EXISTS] <object_table_name>; Parameter
object_table_name: Wajib. Nama tabel.
Contoh
DROP TABLE IF EXISTS ot_demo_day;FAQ
ODPS-0010000:System internal error
Gejala
Pesan error berikut dikembalikan:
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
Titik akhir publik untuk OSS digunakan saat Object Table dibuat.
Solusi
Saat membuat Object Table,
oss_endpointdalam parameterlocationharus berupa alamat jaringan internal. Untuk informasi selengkapnya tentang cara mendapatkan alamat tersebut, lihat Parameter.
Refresh periodik gagal
Gejala
Anda menyetel parameter untuk refresh periodik saat membuat Object Table. Namun, refresh tidak terjadi ketika periode refresh tercapai.
Solusi
Periksa apakah nilai parameter `location` yang dikonfigurasi untuk Object Table merupakan nama domain jaringan internal OSS. Untuk informasi selengkapnya tentang cara membuat Object Table, lihat Parameter.
Tugas refresh periodik melaporkan error
Pesan error
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:
Solusi
Ini adalah error internal. Anda dapat mengirimkan tiket untuk menghubungi tim dukungan teknis MaxCompute.