All Products
Search
Document Center

MaxCompute:Definisi tabel objek

Last Updated:Jul 29, 2026

MaxCompute memperkenalkan fitur tabel objek, yang memungkinkan mesin komputasi gudang data mengakses data tidak terstruktur dan metadata-nya di penyimpanan data lake. Topik ini menjelaskan sintaks perintah dan memberikan contoh penggunaannya.

Latar Belakang

Dalam banyak alur kerja AI, pengembang gudang data yang memahami data dan logika bisnis harus melakukan pra-pemrosesan atau memproses data tidak terstruktur untuk model besar. Tugas-tugas tersebut memanfaatkan daya komputasi skala besar berbiaya rendah dari platform data besar. Proses-proses tersebut dan hasilnya sering kali berinteraksi dengan data di gudang data atau data lake.

Penggunaan SQL untuk memproses data tidak terstruktur menghadapi beberapa tantangan:

  • Saat membaca dari penyimpanan objek, mesin SQL data besar tidak dapat menentukan ukuran objek, sehingga menyulitkan optimasi rencana eksekusi serta pengendalian konkurensi atau peluncuran jumlah tugas konkuren yang sesuai. Tanpa penurunan predikat yang efektif, daya komputasi tidak dapat dimanfaatkan secara optimal, terutama dalam kasus 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 satu proses pada fungsi tabel yang didefinisikan pengguna (UDTF), sehingga menghasilkan performa baca data yang buruk.

  • Anda harus mengimplementasikan logika otorisasi dan konektivitas jaringan dalam fungsi yang didefinisikan pengguna (UDF) untuk terhubung ke layanan penyimpanan.

  • Gudang data tradisional tidak menyediakan fitur untuk mengunggah gambar kustom secara aman atau lingkungan eksekusi yang aman untuk UDF. Selain itu, panggilan remote memerlukan manajemen konkurensi yang kompleks dengan layanan komputasi terdistribusi.

Fitur

MaxCompute memperkenalkan fitur tabel objek, yang memungkinkan mesin komputasi gudang data mengakses data tidak terstruktur dan metadata-nya di penyimpanan data lake. Fitur ini menyediakan kemampuan berikut:

  • Memungkinkan mesin membaca metadata file OSS sebagai tabel.

  • Memanfaatkan tabel metadata untuk menyimpan cache metadata versi file OSS. Mesin SQL kemudian dapat menggunakan metadata ini untuk optimasi kueri, seperti penyaringan data dan penurunan predikat.

  • Menyediakan fungsi bawaan untuk membaca konten file data tidak terstruktur dengan berbagai cara.

  • Memungkinkan mesin SQL MaxCompute membuat split konkuren berdasarkan metadata tabel objek, membuka potensi komputasi terdistribusi skala besar untuk meningkatkan efisiensi pembacaan dan pemrosesan data.

  • Memungkinkan Anda mengunggah gambar kustom untuk membangun UDF yang memproses data tidak terstruktur yang dibaca oleh mesin.

  • Mendukung pemrosesan data tidak terstruktur untuk menghasilkan hasil terstruktur dan menulisnya ke tabel internal atau eksternal di gudang data. Versi mendatang juga akan mendukung pembuatan hasil tidak terstruktur dan menulisnya kembali ke OSS melalui tabel objek.

  • Mendukung mesin Maxframe dari ekosistem Python.

Batasan

  • Proyek MaxCompute harus memiliki skema yang diaktifkan. Untuk informasi selengkapnya, lihat Aktifkan skema.

  • MaxCompute harus mendukung Type System 2.0.

  • Tabel objek saat ini tidak mendukung partisi.

Penagihan

  • Tabel objek menyimpan kumpulan metadata untuk file di OSS. Biaya penyimpanan dikenakan untuk metadata yang direfresh dan disimpan di tabel objek. Untuk informasi selengkapnya, lihat Harga penyimpanan. Karena file dari OSS tidak disimpan di dalam MaxCompute, MaxCompute tidak mengenakan biaya penyimpanan untuk file tersebut. OSS mengenakan biaya untuk penyimpanan dan akses data. Untuk informasi selengkapnya, lihat Harga penyimpanan OSS.

  • Untuk tugas yang mengekstraksi dan merefresh metadata OSS, inputsize untuk setiap file yang dipindai didasarkan pada ukuran metadata-nya, bukan ukuran file aktualnya. Oleh karena itu, total biaya pekerjaan refresh bergantung pada jumlah file, bukan ukuran totalnya. Untuk informasi selengkapnya, lihat Penagihan SQL untuk tabel eksternal.

  • Anda dikenakan biaya komputasi saat menggunakan tabel objek dan metadata-nya untuk menganalisis serta mengekstraksi data tidak terstruktur dari OSS.

    • Dalam langganan bayar sesuai penggunaan, analisis metadata tabel objek ditagih dengan cara 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 rencana penagihan langganan, Anda menggunakan sumber daya langganan prabayar. Untuk informasi selengkapnya, 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>'] 
;
Catatan
  • Tabel objek harus digunakan dalam proyek yang telah mengaktifkan skema, dan Anda harus mengaktifkan sakelar 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

Menentukan properti untuk serializer-deserializer (SerDe). Anda dapat menentukan peran RAM untuk otorisasi dengan mengatur kunci odps.properties.rolearn. Jika Anda menghilangkan kunci ini, MaxCompute menggunakan peran RAM AliyunODPSDefaultRole dari Akun Alibaba Cloud saat ini untuk mengakses OSS.

Contoh: 'odps.properties.rolearn'='acs:ram::uid:role/aliyunodpsdefaultrole'.

Sebelum menggunakan fitur ini, pastikan Anda telah menyelesaikan otorisasi satu klik untuk AliyunODPSDefaultRole. Otorisasi ini memungkinkan proyek MaxCompute mengakses langsung sumber daya OSS yang dimiliki oleh akun cloud saat ini melalui token STS.

Catatan

Otorisasi satu klik hanya dimungkinkan jika pemilik proyek MaxCompute dan pemilik akun OSS adalah pihak yang sama.

location

Ya

  • Jalur OSS yang dipetakan oleh tabel objek. Formatnya adalah oss://<oss_endpoint>/<bucket_name>/<oss_directory_name>/. Contohnya, oss://oss-cn-hangzhou-internal.aliyuncs.com/odps-external-****/ottest/.

  • Tabel objek mengekstraksi metadata file dalam direktori yang ditentukan.

  • Untuk mendapatkan oss_endpoint:

    • Login ke Konsol OSS.

    • Pada halaman Buckets, klik Bucket Name yang dituju untuk membuka halaman Objects-nya.

    • Di area Port pada halaman Overview, dapatkan Endpoint untuk Access from ECS over the Classic Network (internal network).

TBLPROPERTIES ('<key>'='<value>')

Tidak

  • metadata.cache.mode: Mode refresh cache.

    • manual: Pemicu manual (default).

    • periodic: Pemicu periodik. Mode ini memerlukan parameter metadata.staleness.seconds untuk menentukan interval refresh.

  • metadata.staleness.seconds: Interval refresh dalam detik. Nilainya dapat berkisar antara 1 hingga 604800 (1 detik hingga 1 minggu). Parameter ini merupakan jaminan upaya terbaik, dan penjadwal berusaha mengeksekusi refresh sedekat mungkin dengan interval yang ditentukan.

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 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 utama dalam hasil tersebut.

Parameter

Type

Null diizinkan

Deskripsi

key

VARCHAR(2048)

Batas panjang di OSS adalah 1.023 karakter.

Untuk informasi selengkapnya, lihat Aturan dan contoh penamaan objek OSS.

False

Jalur relatif objek dalam tabel objek.

size

BIGINT

False

Ukuran objek dalam byte.

type

VARCHAR(32)

False

Tipe objek di OSS: Normal, Multipart, Appendable, atau Symlink.

last_modified

TIMESTAMP_NTZ

False

Waktu terakhir data objek dimodifikasi di OSS.

storage_class

VARCHAR(32)

False

Kelas penyimpanan objek di OSS. Untuk daftar kelas penyimpanan, lihat Kelas penyimpanan.

etag

VARCHAR(64)

False

ETag adalah tag entitas yang dihasilkan untuk suatu objek. Tag ini mengidentifikasi apakah konten objek berubah antar pembaruan, tetapi bukan pengenal unik.

restore_info

VARCHAR(256)

True

Menunjukkan apakah objek telah dipulihkan dari penyimpanan dingin. Jika objek sedang dipulihkan, kolom ini memberikan informasi terkait.

owner_id

BIGINT

True

ID pemilik objek.

owner_display_name

VARCHAR(256)

True

Nama tampilan pemilik objek.

Lihat 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');

Refresh metadata tabel objek

Data aktual untuk tabel objek disimpan di OSS. MaxCompute menyimpan cache metadata objek-objek tersebut dan menggunakan metadata cache ini untuk kueri dan komputasi. Oleh karena itu, Anda harus merefresh cache sebelum menggunakan tabel objek. Anda dapat merefresh metadata secara manual atau mengonfigurasi refresh periodik saat membuat tabel.

Catatan

Baik refresh manual maupun periodik merupakan pembaruan penuh.

Penyegaran manual

Setiap refresh melakukan sinkronisasi penuh metadata. Anda dapat mengontrol waktu dan frekuensi refresh ini.

  • Sintaks

    ALTER TABLE <objecttable_name> REFRESH METADATA;
  • Parameter

    object_table_name: Wajib. Nama tabel.

  • Contoh

    SET odps.namespace.schema=true; 
    ALTER TABLE ot_demo_day REFRESH METADATA;

Refresh periodik

Jika file dalam direktori OSS yang dipetakan oleh tabel objek sering berubah, Anda dapat mengonfigurasi refresh metadata periodik. Hal ini mengurangi biaya pemeliharaan dengan menentukan parameter terkait saat 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 mode periodic. Nilainya dapat berkisar antara [1, 604800], yang merepresentasikan rentang dari 1 detik hingga 1 minggu. Parameter ini merupakan jaminan upaya terbaik, dan penjadwal akan mencoba mengeksekusi refresh sedekat mungkin dengan interval yang ditentukan.

    • metadata.cache.mode: Mode refresh. Opsi yang tersedia adalah:

      • periodic: Pemicu periodik.

      • crontab: Refresh terjadwal.

      • manual: Pemicu manual (default). Anda dapat mengontrol waktu pemicunya.

Refresh terjadwal

Jika file dalam direktori OSS yang dipetakan oleh tabel objek sering berubah, Anda dapat menjadwalkan refresh metadata. Hal ini mengurangi biaya pemeliharaan dengan menentukan parameter terkait saat 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 yang menentukan jadwal. Misalnya, untuk memicu refresh setiap hari pukul 14.00, Anda dapat menggunakan ekspresi 0 0 14 * * ?, yang berarti 0 detik, 0 menit, jam 14 (14.00), setiap hari, setiap bulan, dan ? untuk tidak menentukan hari dalam minggu (saling eksklusif dengan field hari-bulan untuk menghindari konflik).

    • metadata.cache.mode: Mode refresh. Opsi yang tersedia adalah:

      • crontab: Refresh terjadwal.

      • periodic: Pemicu periodik.

      • manual: Pemicu manual (default). Anda dapat mengontrol waktu pemicunya.

Lihat tugas refresh

Anda dapat menjalankan perintah berikut untuk melihat riwayat tugas refresh.

SHOW refresh task history FOR object TABLE <object_table_name>;
  • Parameter

    • <object_table_name> harus berupa tabel objek.

    • Nilai kembalian: ID instans tugas refresh (InstanceId), waktu pembuatan (CreateTime), waktu selesai (EndTime), dan status (Status).

    • Jika Status bernilai Failed, Anda dapat menjalankan wait InstanceId; untuk melihat log dan memeriksa detail error.

  • Contoh

    -- Lihat tugas refresh historis 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

Kueri tabel objek

Setelah tabel objek mengambil metadata file dari direktori OSS, Anda dapat mengkueri tabel tersebut untuk menelusuri metadata ini. Anda juga dapat menggunakan pernyataan SQL untuk melakukan perhitungan pada metadata, seperti penyaringan, pencocokan, agregasi, join, fungsi jendela, 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 jumlah datanya besar, Anda dapat membatasi hasil menjadi lima baris.
SET odps.namespace.schema=true; 
SELECT * FROM  ot_demo_day [limit 5];

Kueri data biner

Anda dapat mengkueri data biner objek dalam tabel objek dengan salah satu dari dua cara berikut:

  • Kolom _data

    Kolom _data mengembalikan data biner lengkap suatu objek, seperti aliran biner gambar. Tipe datanya adalah BINARY.

    Untuk menghindari error kehabisan memori, data biner objek tunggal sebaiknya tidak terlalu besar. Kode contoh berikut menunjukkan cara menggunakan kolom ini:

    SET odps.namespace.schema=true;
    SELECT _data FROM test_ot1;
  • Kolom _blob

    Kolom _blob mengembalikan kredensial sementara untuk mengunduh data biner, bukan data binernya sendiri. Kolom _blob menawarkan stabilitas komputasi yang lebih baik dan konsumsi sumber daya lebih rendah dibandingkan kolom _data. Kami menyarankan Anda menggunakan kolom _data secara langsung untuk objek yang lebih kecil (rata-rata kurang dari 1 MB) dan kolom _blob untuk objek yang lebih besar. Penggunaannya sebagai berikut:

    SET odps.namespace.schema=true;
    SELECT _blob FROM test_ot1;

Contoh

Kolom _data

  1. Unduh file uji dan unggah ke OSS: ot_test.txt.

  2. 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>/';
    
    -- 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         |
    +------+------------+------+---------------+---------------+------+--------------+------------+--------------------+
  3. 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} |
    +-------+
  4. 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": "This is sample JSON data that contains both Chinese and English.",
      "tags": [
        "Programming",
        "JSON",
        "Example"
      ],
      "metadata": {
        "author": "AI Assistant",
        "created_at": "2023-10-01T12:00:00Z",
        "is_active": true
      }
    } |
    +-----+

Kolom _blob

  1. Unduh file uji dan unggah ke OSS: ot_test.txt.

  2. 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>/';
    
    -- 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         |
    +------+------------+------+---------------+---------------+------+--------------+------------+--------------------+
  3. Baca kolom _blob.

    SET odps.namespace.schema=true;
    SELECT _blob FROM test_ot1;
    
    -- Hasil berikut dikembalikan:
    +-------+
    | _blob |
    +-------+
    | CAEQAxruAgEAAAANA**AAEb2svMjAy3CIAKhR5WVBc/0S4GmxSm4psPJ5CV3k4STIeCgl***FyYTQ1ZXEx |
    +-------+
  4. 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": "This is sample JSON data that contains both Chinese and English.",
      "tags": [
        "Programming",
        "JSON",
        "Example"
      ],
      "metadata": {
        "author": "AI Assistant",
        "created_at": "2023-10-01T12:00:00Z",
        "is_active": true
      }
    } |
    +-----+

Kueri konten objek

Secara default, kueri hanya menghitung metadata objek dan tidak membaca konten objek. Namun, komputasi dunia nyata sering kali memerlukan konten objek aktual. MaxCompute menyediakan fungsi unduh bawaan untuk digunakan dalam komputasi Anda.

Sintaks GET_DATA_FROM_OSS

Fungsi GET_DATA_FROM_OSS membaca seluruh atau sebagian konten objek dan mengembalikannya sebagai data 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

Default

full_object_table_name

Ya

STRING

Jalur lengkap ke OBJECT TABLE dalam model tiga tingkat, termasuk nama Project dan Schema, misalnya project.schema.object_table. Jika Anda menggunakan autentikasi RoleARN saat membuat tabel, parameter ini memicu pembuatan otomatis token Layanan Keamanan (STS) untuk mengakses OSS.

Tidak ada

key

Ya

STRING

Kunci objek (nama) objek OSS dalam Tabel Objek. Untuk nilai pastinya, lihat bidang key di Lihat properti OBJECT TABLE.

Tidak ada

offset

Tidak

BIGINT

Posisi byte tempat mulai membaca. Harus >= 0.

0 (awal objek)

length

Tidak

BIGINT

Jumlah byte yang akan dibaca.

-1 (tanpa batas)

object_not_found_policy

Tidak

STRING

Perilaku ketika kunci objek ada di cache metadata tetapi objek telah dihapus dari OSS. Lihat tabel di bawah untuk nilai yang valid.

OUTPUT_NULL

Contoh 1

GET_DATA_FROM_OSS mengembalikan BINARY. Untuk bekerja dengan konten sebagai teks, bungkus dengan fungsi STRING().

SET odps.namespace.schema=true;
SELECT STRING(
  GET_DATA_FROM_OSS('<project_name>.default.ot_demo_day', key, 0, -1, 'OUTPUT_NULL')
) 
FROM ot_demo_day;

Contoh 2

Pernyataan berikut semuanya membaca konten lengkap Tabel Objek <project_name>.default.ot_demo_day. Keenam bentuk ini setara — masing-masing menggunakan nilai default offset ke 0, length ke -1, dan object_not_found_policy ke OUTPUT_NULL.

SET odps.namespace.schema=true;
-- Bentuk lengkap dengan semua parameter eksplisit
SELECT GET_DATA_FROM_OSS('<project_name>.default.ot_demo_day', key, 0, -1, 'OUTPUT_NULL') FROM ot_demo_day;

-- Pernyataan berikut setara dengan yang di atas
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;

Optimasi kueri

Secara default, saat Anda mengakses tabel dalam kueri SQL MaxCompute, sistem membuat split data seragam berdasarkan jumlah record, ukurannya dalam byte, dan total sumber daya komputasi yang tersedia (dibatasi oleh kuota Anda). Pendekatan ini memungkinkan pemrosesan paralel split yang berbeda, yang secara efektif mengurangi masalah long-tail dan meningkatkan performa kueri secara keseluruhan.

Namun, metode pemisahan ini tidak optimal untuk kueri SQL yang perlu mengunduh konten objek dari tabel objek untuk komputasi dalam memori. Dalam kasus ini, operasi I/O dapat dengan mudah menjadi bottleneck, menyebabkan masalah long-tail. Pertimbangkan skenario berikut:

Kunci

Ukuran

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 worker. Jika split dibuat berdasarkan jumlah baris atau byte record, seperti pada tabel internal standar, sistem mungkin membuat dua split: split1 ([a0000.jpg ~ a0511.jpg]) dan split2 ([a0512.jpg ~ a1023.jpg, b.avi]). Jumlah data yang akan diunduh untuk split1 adalah 10 MB * 512 = 5 GB, sedangkan untuk split2 adalah 5 GB + 10 GB = 15 GB. Akibatnya, beban komputasi untuk split2 jauh lebih tinggi daripada split1, menyebabkan masalah long-tail yang parah.

Pendekatan yang lebih logis adalah membuat split berdasarkan ukuran aktual objek untuk kueri yang mengunduhnya. Strategi ini meminimalkan masalah long-tail. Jika logika konsumsi data objek OSS bahkan lebih memakan waktu, kemampuan pemisahan yang fleksibel sangat penting. Untuk skenario di atas, pendekatan yang lebih baik adalah membuat dua split: split1 dengan [a0000.jpg ~ a1023.jpg] dan split2 dengan [b.avi]. Dalam kasus ini, ukuran unduhan untuk kedua split adalah 10 GB.

Untuk mendukung hal ini, secara default, tabel objek MaxCompute membagi tugas berdasarkan ukuran aktual objek. Ukuran split default adalah 1 GB, tetapi Anda dapat menyesuaikannya ke tingkat KB, MB, atau GB sesuai kebutuhan.

SET odps.namespace.schema=true; 
-- Defaultnya 1 GB, tetapi 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 mengontrol ukuran split pada tingkat MB, yang 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 ...


-- Anda juga dapat mengontrol ukuran split pada tingkat KB, yang memiliki prioritas tertinggi.
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 optimasi kueri ini. Strategi optimasi ini meluncurkan dua pekerjaan, dengan pekerjaan pertama melakukan beberapa pra-pemrosesan, yang dapat Anda lihat di Logview. MaxCompute menyediakan opsi untuk menonaktifkannya:

SET odps.namespace.schema=true; 
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 tabel objek

Tabel objek menyimpan cache metadata pengguna, yang mengonsumsi penyimpanan dan menimbulkan biaya. Jika Anda tidak lagi memerlukan data cache tersebut, Anda dapat menghapus tabel objek. Anda dapat membuat ulang tabel objek tersebut 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:Kesalahan internal sistem

  • Gejala

    Pesan error berikut dilaporkan:

    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
  • Penyebab

    Anda menggunakan titik akhir publik untuk OSS saat membuat tabel objek.

  • Solusi

    Saat membuat tabel objek, parameter location harus berisi titik akhir internal untuk oss_endpoint. Untuk informasi tentang cara mendapatkan titik akhir internal, lihat Deskripsi parameter. Jika error tetap muncul setelah Anda mengubah alamat ke titik akhir internal, hubungi tim dukungan teknis MaxCompute dengan mengirimkan tiket untuk mendapatkan bantuan.

Refresh periodik gagal

  • Gejala

Anda mengatur parameter refresh periodik saat membuat tabel objek. Namun, refresh tidak berjalan saat interval tercapai.

  • Solusi

Pastikan parameter location yang digunakan untuk membuat tabel objek menentukan titik akhir internal OSS. Untuk informasi selengkapnya tentang membuat tabel objek, lihat Parameter.