全部产品
Search
文档中心

MaxCompute:Tabel eksternal ORC

更新时间:Aug 27, 2025

Topik ini menjelaskan cara membuat, membaca dari, dan menulis ke tabel eksternal dalam format ORC yang disimpan di OSS.

Prasyarat

  • Pastikan Akun Alibaba Cloud, Pengguna RAM, atau Peran RAM Anda memiliki izin yang diperlukan untuk mengakses tabel eksternal OSS. Untuk informasi lebih lanjut tentang otorisasi, lihat Otorisasi STS untuk OSS.

  • (Opsional) Siapkan Bucket OSS, direktori, dan file data. Untuk informasi lebih lanjut, lihat Membuat Bucket, Mengelola Direktori, dan Unggah Sederhana.

    MaxCompute dapat secara otomatis membuat direktori di OSS. Anda dapat menggunakan satu Pernyataan SQL untuk membaca dari atau menulis ke tabel eksternal yang menggunakan UDF. Pembuatan direktori manual tidak lagi diperlukan, tetapi metode lama masih didukung.
  • Proyek MaxCompute telah dibuat. Untuk informasi lebih lanjut, lihat Buat Proyek MaxCompute.

    MaxCompute hanya tersedia di wilayah tertentu. Untuk mencegah masalah konektivitas data lintas wilayah, kami sarankan Anda menggunakan bucket di wilayah yang sama dengan proyek MaxCompute Anda.
  • Akun Alibaba Cloud atau Pengguna RAM memiliki izin CreateTable pada proyek Anda. Untuk informasi lebih lanjut tentang izin operasi tabel, lihat Izin MaxCompute.

Batasan

  • Atribut kluster tidak didukung untuk tabel eksternal OSS.

  • Satu file tidak boleh melebihi 3 GB. Jika sebuah file melebihi batas ini, kami sarankan Anda membaginya.

Catatan

Jika skema dalam file ORC tidak konsisten dengan skema tabel eksternal:

  • Jumlah kolom tidak konsisten: Jika jumlah kolom dalam file ORC kurang dari jumlah kolom dalam pernyataan Data Definition Language (DDL) tabel eksternal, sistem akan mengisi kolom yang hilang dengan nilai NULL saat membaca data ORC. Jika jumlah kolom dalam file ORC lebih banyak, data kolom tambahan akan dibuang.

  • Tipe kolom tidak konsisten: MaxCompute memungkinkan Anda membaca data INT dari file ORC sebagai tipe STRING, tetapi ini tidak direkomendasikan. Saat Anda mencoba membaca data STRING sebagai tipe INT, nilai string dikonversi menjadi NULL, sedangkan nilai numerik diproses dengan benar.

Dukungan tipe data

Catatan

Dalam tabel berikut, 已开通 menunjukkan dukungan dan 未开通 menunjukkan tidak ada dukungan.

  • Untuk informasi lebih lanjut tentang tipe data MaxCompute, lihat Versi Tipe Data 1.0 dan Versi Tipe Data 2.0.

  • Mode Java Native Interface (JNI) (Native ORC Reader tidak digunakan untuk membaca tabel): set odps.ext.oss.orc.native=false;. Operasi baca dan tulis didukung.

  • Mode asli (Native ORC Reader digunakan untuk membaca tabel): set odps.ext.oss.orc.native=true;. Hanya operasi baca yang didukung.

Tipe data

Dukungan mode JNI

Dukungan mode asli

TINYINT

已开通

已开通

SMALLINT

已开通

已开通

INT

已开通

已开通

BIGINT

已开通

已开通

BINARY

已开通

已开通

FLOAT

已开通

已开通

DOUBLE

已开通

已开通

DECIMAL(presisi,skala)

已开通

已开通

VARCHAR(n)

已开通

已开通

CHAR(n)

已开通

已开通

STRING

已开通

已开通

DATE

已开通

已开通

DATETIME

已开通

已开通

TIMESTAMP

未开通

未开通

TIMESTAMP_NTZ

未开通

未开通

BOOLEAN

已开通

已开通

ARRAY

已开通

已开通

MAP

已开通

已开通

STRUCT

已开通

已开通

JSON

未开通

未开通

Format kompresi yang didukung

Saat Anda membaca dari atau menulis ke file OSS terkompresi, tambahkan atribut with serdeproperties ke pernyataan CREATE TABLE. Untuk informasi lebih lanjut, lihat parameter with serdeproperties.

Format file data yang didukung untuk operasi baca dan tulis adalah file ORC yang dikompresi menggunakan SNAPPY atau ZLIB.

Membuat tabel eksternal

Sintaksis

Untuk informasi lebih lanjut tentang struktur sintaksis tabel eksternal untuk setiap format, lihat Tabel Eksternal OSS.

  • Sintaksis dasar

    CREATE EXTERNAL TABLE [IF NOT EXISTS] <mc_oss_extable_name>
    (
      <col_name> <tipe_data>,
      ...
    )
    [KOMENTAR <komentar_tabel>]
    [PARTITIONED BY (<col_name> <tipe_data>, ...)]
    DISIMPAN SEBAGAI orc
    LOKASI '<lokasi_oss>';
  • Sintaksis lengkap

    CREATE EXTERNAL TABLE [IF NOT EXISTS] <mc_oss_extable_name>
    (
      <col_name> <tipe_data>,
      ...
    )
    [KOMENTAR <komentar_tabel>]
    [PARTITIONED BY (<col_name> <tipe_data>, ...)]
    FORMAT BARIS SERDE 'org.apache.hadoop.hive.ql.io.orc.OrcSerde'
    DENGAN serdeproperties(
        'odps.properties.rolearn'='acs:ram::<uid>:role/aliyunodpsdefaultrole'
    )
    DISIMPAN SEBAGAI orc 
    LOKASI '<lokasi_oss>' 
    propertiestabel (
        '<xxx>'='<yyy>'
    );

Parameter umum

Untuk informasi tentang parameter umum, lihat Parameter Sintaksis Dasar.

Parameter unik

Properti untuk WITH SERDEPROPERTIES

property_name

Skenario

Deskripsi

property_value

Nilai default

mcfed.orc.schema.resolution

Tambahkan properti ini ketika data di tabel eksternal OSS yang sama memiliki skema yang berbeda.

Menentukan metode penguraian untuk file ORC. Nilai name menunjukkan bahwa file diurai berdasarkan nama kolom.

name

Berdasarkan posisi kolom. Ini setara dengan menyetel mcfed.orc.schema.resolution'='position'.

Properti untuk TBLPROPERTIES

property_name

Skenario

Deskripsi

property_value

Nilai default

mcfed.orc.compress

Tambahkan properti ini untuk menulis data ORC ke OSS dalam format terkompresi.

Properti kompresi ORC. Menentukan metode kompresi untuk data ORC.

  • SNAPPY

  • ZLIB

Tidak ada

io.compression.codecs

Tambahkan properti ini jika file data OSS dalam format Raw-Snappy.

Setel parameter ini untuk memungkinkan MaxCompute membaca data terkompresi Raw-Snappy.

com.aliyun.odps.io.compress.SnappyRawCodec

Tidak ada

Menulis data

Untuk informasi lebih lanjut tentang sintaksis penulisan di MaxCompute, lihat Sintaksis Penulisan.

Kueri dan analisis data

  • Untuk informasi lebih lanjut tentang sintaksis SELECT, lihat Sintaksis Kueri.

  • Untuk informasi lebih lanjut tentang optimasi rencana kueri, lihat Optimasi Kueri.

Skenario

Bagian ini menjelaskan cara membuat tabel eksternal ORC dengan kompresi SNAPPY, kemudian membaca data dari dan menulis data ke tabel tersebut.

Catatan
  • Saat Anda menjalankan kode contoh berikut, ganti <uid> dengan ID Akun Alibaba Cloud Anda.

  • Peran yang digunakan dalam contoh berikut adalah aliyunodpsdefaultrole. Jika Anda ingin menggunakan peran lain, ganti aliyunodpsdefaultrole dengan nama peran target dan berikan izin kepada peran target untuk mengakses OSS.

  1. Siapkan file ORC yang dikompresi menggunakan SNAPPY.

    Di bucket oss-mc-test untuk Data Sampel, buat hierarki folder orc_snappy/dt=20250526, dan simpan file snappy di folder partisi dt=20250526.

  2. Buat tabel eksternal ORC dengan kompresi SNAPPY.

    CREATE EXTERNAL TABLE orc_data_type_snappy
    (
        vehicleId INT,
        recordId INT,
        patientId INT,
        calls INT,
        locationLatitute DOUBLE,
        locationLongtitue DOUBLE,
        recordTime STRING,
        direction STRING
    )
    PARTITIONED BY (dt STRING )
    ROW FORMAT SERDE 'org.apache.hadoop.hive.ql.io.orc.OrcSerde'
    WITH serdeproperties (
     'odps.properties.rolearn'='acs:ram::<uid>:role/aliyunodpsdefaultrole'
    ) 
    STORED AS ORC  
    LOCATION 'oss://oss-cn-hangzhou-internal.aliyuncs.com/oss-mc-test/orc_snappy/'
    tblproperties (
        'mcfed.orc.compress'='SNAPPY');
  3. Impor data partisi. Jika tabel eksternal OSS adalah tabel partisi, Anda harus melakukan operasi tambahan untuk mengimpor data partisi. Untuk informasi lebih lanjut, lihat Sintaksis untuk Menambahkan Data Partisi ke Tabel Eksternal OSS.

    -- Impor data partisi
    MSCK REPAIR TABLE orc_data_type_snappy ADD PARTITIONS;
  4. Baca data dari tabel eksternal ORC.

    SELECT * FROM orc_data_type_snappy WHERE dt=20250526 LIMIT 10;

    Hasil berikut dikembalikan:

    +------------+------------+------------+------------+------------------+-------------------+----------------+------------+------------+
    | vehicleid  | recordid   | patientid  | calls      | locationlatitute | locationlongtitue | recordtime     | direction  | dt         |
    +------------+------------+------------+------------+------------------+-------------------+----------------+------------+------------+
    | 1          | 12         | 76         | 1          | 46.81006         | -92.08174         | 9/14/2014 0:10 | SW         | 20250526   |
    | 1          | 1          | 51         | 1          | 46.81006         | -92.08174         | 9/14/2014 0:00 | S          | 20250526   |
    | 1          | 2          | 13         | 1          | 46.81006         | -92.08174         | 9/14/2014 0:01 | NE         | 20250526   |
    | 1          | 3          | 48         | 1          | 46.81006         | -92.08174         | 9/14/2014 0:02 | NE         | 20250526   |
    | 1          | 4          | 30         | 1          | 46.81006         | -92.08174         | 9/14/2014 0:03 | W          | 20250526   |
    | 1          | 5          | 47         | 1          | 46.81006         | -92.08174         | 9/14/2014 0:04 | S          | 20250526   |
    | 1          | 6          | 9          | 1          | 46.81006         | -92.08174         | 9/14/2014 0:05 | S          | 20250526   |
    | 1          | 7          | 53         | 1          | 46.81006         | -92.08174         | 9/14/2014 0:06 | N          | 20250526   |
    | 1          | 8          | 63         | 1          | 46.81006         | -92.08174         | 9/14/2014 0:07 | SW         | 20250526   |
    | 1          | 9          | 4          | 1          | 46.81006         | -92.08174         | 9/14/2014 0:08 | NE         | 20250526   |
    | 1          | 10         | 31         | 1          | 46.81006         | -92.08174         | 9/14/2014 0:09 | N          | 20250526   |
    +------------+------------+------------+------------+------------------+-------------------+----------------+------------+------------+
  5. Tulis data ke tabel eksternal ORC dan kueri data tersebut.

    INSERT INTO orc_data_type_snappy PARTITION (dt ='20250526') 
      VALUES (1,16,76,1,46.81006,-92.08174,'9/14/2014 0:10','SW');
    
    -- Kueri data yang baru saja ditulis
    SELECT * FROM orc_data_type_snappy WHERE dt = '20250526' AND recordid=16;

    Hasil berikut dikembalikan:

    +------------+------------+------------+------------+------------------+-------------------+----------------+------------+------------+
    | vehicleid  | recordid   | patientid  | calls      | locationlatitute | locationlongtitue | recordtime     | direction  | dt         |
    +------------+------------+------------+------------+------------------+-------------------+----------------+------------+------------+
    | 1          | 16         | 76         | 1          | 46.81006         | -92.08174         | 9/14/2014 0:10 | SW         | 20250526   |
    +------------+------------+------------+------------+------------------+-------------------+----------------+------------+------------+