All Products
Search
Document Center

MaxCompute:Custom storage handler

Last Updated:Sep 16, 2026

Topik ini menjelaskan cara membuat tabel eksternal OSS menggunakan custom storage handler serta cara membaca dan menulis ke tabel tersebut.

Usage notes

  • Tabel eksternal OSS tidak mendukung properti cluster.

  • Ukuran satu file tidak boleh melebihi 2 GB. Anda harus membagi file yang berukuran lebih dari 2 GB.

Create an external table

Syntax

CREATE EXTERNAL TABLE [IF NOT EXISTS] mc_oss_extable_name
(
  col_name data_type,
  ...
)
[comment table_comment]
[partitioned BY (col_name data_type, ...)] 
stored BY '<YOUR_DEFINED_STORAGEHANDLER>' 
WITH serdeproperties (
  ['property_name'='property_value',...]
) 
location 'oss_location' 
USING 'jar_name';

Secara default, custom storage handler tidak melakukan sharding data. Hal ini mencegah potensi masalah kebenaran data. Jika Anda yakin bahwa handler Anda dapat memproses data yang di-shard, jalankan perintah berikut untuk mengaktifkan sharding data dan memulai beberapa mapper.

SET odps.sql.unstructured.data.single.file.split.enabled=true;

Common parameters

Untuk informasi selengkapnya tentang parameter umum, lihat Basic syntax parameters.

Specific parameters

Parameter

Required

Description

your_defined_storagehandler

Yes

Custom storage handler yang Anda implementasikan sebagai user-defined function (UDF) MaxCompute. Untuk informasi selengkapnya tentang cara mengembangkan UDF, lihat Develop UDFs.

jar_name

Yes

Paket JAR yang berisi kode untuk custom storage handler. Anda harus menambahkan paket JAR ini sebagai resource ke Proyek MaxCompute Anda.

Untuk informasi selengkapnya tentang cara menambahkan resource, lihat Resource operations.

resource_name

No

Jika Anda menggunakan SerDe class kustom, tentukan resource JAR dependennya.

Resource ini harus berisi SerDe class kustom dan ditambahkan sebagai resource ke Proyek MaxCompute Anda.

Untuk informasi selengkapnya tentang cara menambahkan resource, lihat Resource operations.

Write data

Untuk informasi selengkapnya tentang sintaks penulisan MaxCompute, lihat Write data to OSS.

Query and analyze data

Example: Create an OSS external table

Contoh ini menunjukkan cara memetakan tabel eksternal ke direktori SampleData/ yang dijelaskan dalam Appendix: Prepare sample data. Direktori ini disiapkan untuk digunakan dengan custom storage handler. Prosedurnya adalah sebagai berikut:

  1. Prasyarat

    • Proyek MaxCompute telah dibuat.

    • Bucket OSS dan folder tersedia. Untuk informasi selengkapnya, lihat Create a bucket dan Manage folders.

      MaxCompute mendukung pembuatan folder otomatis di OSS. Jika pernyataan SQL melibatkan tabel eksternal dan user-defined function (UDF), Anda dapat menggunakan satu pernyataan untuk membaca dan menulis ke tabel serta menggunakan UDF tersebut. Anda juga dapat membuat folder secara manual.

      MaxCompute hanya dideploy di wilayah tertentu. Untuk menghindari potensi masalah koneksi data lintas wilayah, pastikan bucket OSS Anda berada di wilayah yang sama dengan Proyek MaxCompute Anda.
    • Otorisasi

      • Anda harus memiliki izin untuk mengakses OSS. Anda dapat menggunakan Akun Alibaba Cloud, pengguna Resource Access Management (RAM), atau Peran RAM untuk mengakses tabel eksternal OSS. Untuk informasi selengkapnya tentang otorisasi, lihat Authorize access in STS mode for OSS.

      • Anda harus memiliki izin CreateTable di Proyek MaxCompute. Untuk informasi selengkapnya tentang izin tabel, lihat MaxCompute permissions.

  2. Gunakan MaxCompute Studio untuk membuat kelas Java TextExtractor.java, TextOutputer.java, SplitReader.java, dan TextStorageHandler.java. Untuk informasi selengkapnya tentang cara mengembangkan program Java, lihat Develop UDFs.

  3. Gunakan fitur pengemasan satu klik MaxCompute Studio untuk mengemas TextStorageHandler.java dan unggah paket tersebut sebagai resource MaxCompute.

    Asumsikan resource tersebut diberi nama javatest-1.0-SNAPSHOT.jar. Untuk informasi selengkapnya tentang cara mengemas, mengunggah, dan mendaftarkan resource, lihat Package, upload, and register.

    Catatan

    Jika Anda memiliki beberapa dependensi, kemas masing-masing dan unggah sebagai resource MaxCompute terpisah.

  4. Jalankan perintah berikut untuk membuat tabel eksternal OSS:

    CREATE EXTERNAL TABLE ambulance_data_txt_external
    (
      vehicleId INT,
      recordId INT,
      patientId INT,
      calls INT,
      locationLatitute DOUBLE,
      locationLongtitue DOUBLE,
      recordTime STRING,
      direction STRING
    )
    stored BY 'com.aliyun.odps.udf.example.text.TextStorageHandler' 
      WITH serdeproperties (
        'delimiter'='|',  
        'odps.properties.rolearn'='acs:ram::<uid>:role/aliyunodpsdefaultrole'
      )
    location 'oss://oss-cn-hangzhou-internal.aliyuncs.com/oss-mc-test/SampleData/'
    USING 'javatest-1.0-SNAPSHOT.jar'; 
    
    -- Anda dapat menjalankan perintah 'desc extended ambulance_data_txt_external;' untuk melihat skema tabel eksternal yang telah dibuat.
    Catatan

    Parameter delimiter adalah properti kustom yang menentukan pemisah kolom dalam file OSS. Anda dapat menentukan string valid apa pun sebagai delimiter.

  5. Baca data dari OSS. Contoh perintah:

    SELECT recordId, patientId, direction FROM ambulance_data_txt_external WHERE patientId > 25;

    Hasil berikut dikembalikan:

    +----------+-----------+-----------+
    | recordid | patientid | direction |
    +----------+-----------+-----------+
    | 1        | 51        | S         |
    | 3        | 48        | NE        |
    | 4        | 30        | W         |
    | 5        | 47        | S         |
    | 7        | 53        | N         |
    | 8        | 63        | SW        |
    | 10       | 31        | N         |
    +----------+-----------+-----------+
  6. Tulis data ke tabel eksternal OSS.

    INSERT INTO ambulance_data_txt_external VALUES (1,16,76,1,'46.81006','-92.08174','9/14/2014 0:10','SW');
    
    -- Kueri ulang tabel untuk memeriksa apakah data telah ditulis. Anda juga dapat memeriksa apakah file baru dihasilkan di direktori OSS.
    SELECT * FROM ambulance_data_txt_external WHERE recordId='16';

FAQ

Mengapa saya menerima error ODPS-0123131 saat membaca field DATETIME dari data tidak terstruktur menggunakan custom extractor?

  • Gejala

    Saat Anda menggunakan custom extractor untuk membaca data tidak terstruktur, jika suatu field bertipe DATETIME, seperti 2019-11-11 06:43:36, error berikut terjadi:

    FAILED: ODPS-0123131:User defined function exception - Traceback:
    java.lang.IllegalArgumentException
        at java.sql.Date.valueOf(Date.java:143)
        at com.aliyun.odps.udf.example.text.TextExtractor.textLineToRecord(TextExtractor.java:194)
        at com.aliyun.odps.udf.example.text.TextExtractor.extract(TextExtractor.java:153)
        at com.aliyun.odps.udf.ExtractorHandler.extract(ExtractorHandler.java:120)       
  • Penyebab

    Error ini disebabkan oleh kode Date.valueOf(parts). Fungsi java.sql.Date.valueOf() hanya menerima string dalam format "yyyy-[m]m-[d]d" dan tidak mendukung string yang mencakup informasi waktu.

  • Solusi

    1. Tambahkan dependensi Joda-Time dan impor kelas yang diperlukan dalam kode Anda.

      -- Dependency.
      <dependency>
        <groupId>joda-time</groupId>
        <artifactId>joda-time</artifactId>
        <version>2.10</version>
      </dependency> 
      -- Import information.
      import org.joda.time.DateTime;
      import org.joda.time.format.DateTimeFormat;                           
    2. Gunakan fungsi Joda-Time DateTimeFormat.forPattern() untuk mengurai string yang berisi tanggal dan waktu. Kemudian, buat objek java.sql.Date dari nilai yang telah diurai.

      record.setDate(index, new Date(DateTime.parse(parts[i], DateTimeFormat.forPattern("yyyy-MM-dd HH:mi:ss")).getMillis()));                           
    3. Gunakan client MaxCompute untuk mengunggah paket JAR yang dihasilkan untuk proyek extractor.

      add jar /Users/gary/big_data/odps/text_extractor/target/text_extractor-1.0-SNAPSHOT.jar      

      Jalur /Users/gary/big_data/odps/text_extractor/target/text_extractor-1.0-SNAPSHOT.jar adalah jalur lokal paket JAR.

    4. Gunakan client MaxCompute untuk mengunggah paket JAR pihak ketiga Joda-Time.

      add jar /Users/gary/.m2/repository/joda-time/joda-time/2.10/joda-time-2.10.jar                         

      Jalur /Users/gary/.m2/repository/joda-time/joda-time/2.10/joda-time-2.10.jar adalah jalur lokal paket JAR pihak ketiga Joda-Time.

    5. Unggah data uji ke direktori yang ditentukan di OSS. Asumsikan file tersebut diberi nama video_play_log.txt. Data sampel:

      5c661071dba64d5080c91da085ff1073^music-click-fast_forward^26.12.XX.XX^2019-11-11 06:43:36                           
    6. Baca data dari tabel eksternal.

      select * from <project_name>.video_play_log;

      Hasil berikut dikembalikan:

      +------+-------+---+----------------+
      | uuid  | action  | ip  | time      |
      +------+-------+---+----------------+
      | 5c661071dba64d5080c91da085ff1073 | music-click-fast_forward | 26.12.XX.XX | 2019-11-11 06:43:36 |
      +------+-------+---+----------------+