Topik ini menjelaskan cara membuat, membaca, dan menulis tabel eksternal OSS berformat ORC.
Cakupan
Tabel eksternal OSS tidak mendukung properti cluster.
Ukuran satu file tidak boleh melebihi 2 GB. File yang lebih besar dari 2 GB harus dibagi.
MaxCompute dan OSS harus berada di wilayah yang sama.
Buat Tabel Eksternal
Sintaksis
Jika skema file ORC tidak konsisten dengan skema tabel eksternal:
Jumlah kolom tidak sesuai: Jika file ORC memiliki jumlah kolom lebih sedikit daripada tabel eksternal, sistem akan mengisi kolom yang hilang dengan nilai NULL saat membaca data. Jika file memiliki lebih banyak kolom, kolom tambahan tersebut akan diabaikan.
Tipe kolom tidak sesuai: MaxCompute mendukung penggunaan tipe STRING untuk membaca data INT dari file ORC, tetapi hal ini tidak disarankan. Saat menggunakan tipe INT untuk membaca data STRING, sistem akan mengonversi nilai string menjadi NULL dan hanya menerima nilai numerik.
Sintaksis Sederhana
CREATE EXTERNAL TABLE [IF NOT EXISTS] <mc_oss_extable_name>
(
<col_name> <data_type>,
...
)
[COMMENT <table_comment>]
[PARTITIONED BY (<col_name> <data_type>, ...)]
STORED AS orc
LOCATION '<oss_location>';Sintaksis Lengkap
CREATE EXTERNAL TABLE [IF NOT EXISTS] <mc_oss_extable_name>
(
<col_name> <data_type>,
...
)
[COMMENT <table_comment>]
[PARTITIONED BY (<col_name> <data_type>, ...)]
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_location>'
tblproperties (
'<xxx>'='<yyy>'
);Parameter Umum
Untuk informasi selengkapnya tentang parameter umum, lihat Parameter sintaksis dasar.
Parameter Unik
Dengan properti serdeproperties
Nama Properti | Skenario | Deskripsi | Nilai Properti | Nilai Default |
mcfed.orc.schema.resolution | Tambahkan properti ini jika skema data dalam tabel eksternal OSS yang sama tidak konsisten. | Menetapkan metode penguraian file ORC. | name | Mengurai berdasarkan nomor kolom secara default. Setara dengan: |
Properti tblproperties
Nama Properti | Skenario | Deskripsi | Nilai Properti | Nilai Default |
mcfed.orc.compress | Tambahkan properti ini untuk menulis data ORC ke OSS dalam format terkompresi. | Properti kompresi ORC. Tentukan metode kompresi untuk data ORC. |
| None |
io.compression.codecs | Tambahkan properti ini jika file data OSS berada dalam format Raw-Snappy. | Jika Anda menyetel parameter ini ke True, MaxCompute dapat membaca data terkompresi secara normal. Jika tidak, MaxCompute tidak dapat membaca data tersebut. | com.aliyun.odps.io.compress.SnappyRawCodec | None |
odps.external.data.output.prefix (Kompatibel dengan odps.external.data.prefix) | Tambahkan properti ini untuk menambahkan awalan kustom pada file output. |
| Kombinasi karakter yang valid, seperti 'mc_'. | None |
odps.external.data.enable.extension | Tambahkan properti ini untuk menampilkan ekstensi file output. | True menampilkan ekstensi file output. False menyembunyikannya. |
| False |
odps.external.data.output.suffix | Tambahkan properti ini untuk menambahkan akhiran kustom pada file output. | Hanya berisi angka, huruf, dan garis bawah (a-z, A-Z, 0-9, _). | Kombinasi karakter yang valid, seperti '_hangzhou'. | None |
odps.external.data.output.explicit.extension | Tambahkan properti ini untuk menambahkan ekstensi kustom pada file output. |
| Kombinasi karakter yang valid, seperti "jsonl". | None |
mcfed.orc.batch.size | Mengontrol jumlah record yang diproses setiap kali, memengaruhi penggunaan memori dan efisiensi pemrosesan. | Properti penyetelan ORC. Menentukan ukuran batch ORC default dalam baris. | Bilangan bulat non-negatif | 1000 |
Menulis data
Untuk informasi selengkapnya tentang sintaksis penulisan MaxCompute, lihat Sintaksis penulisan.
Analisis kueri
Untuk informasi selengkapnya tentang sintaksis SELECT, lihat Sintaksis kueri.
Untuk informasi selengkapnya tentang optimasi rencana kueri, lihat Optimasi kueri.
Anda dapat mengoptimalkan kueri pada tabel eksternal ORC dengan mengaktifkan Predicate Pushdown (PPD). Untuk melakukannya, tambahkan parameter berikut sebelum pernyataan SQL Anda:
Parameter PPD harus digunakan dalam mode Native. Artinya, sakelar Native harus disetel ke true.
-- Aktifkan pembaca native ORC. SET odps.ext.oss.orc.native=true; -- Aktifkan PPD ORC. SET odps.storage.orc.use.predicate.pushdown=true;
Contoh skenario
Contoh ini menunjukkan cara membuat tabel ORC eksternal yang menggunakan kompresi SNAPPY, lalu membaca dan menulis data ke tabel tersebut.
Prasyarat
Anda telah membuat proyek MaxCompute.
Anda telah menyiapkan bucket OSS dan direktori OSS. Untuk informasi selengkapnya, lihat Buat bucket dan Kelola folder.
Karena MaxCompute hanya tersedia di wilayah tertentu, masalah konektivitas lintas wilayah mungkin terjadi. Disarankan untuk menggunakan bucket OSS di wilayah yang sama dengan proyek MaxCompute Anda.
Otorisasi
Anda memiliki izin untuk mengakses OSS. Akun Alibaba Cloud (akun utama), pengguna Resource Access Management (RAM), atau peran RAM dapat mengakses tabel eksternal OSS. Untuk detail otorisasi, lihat Otorisasi mode STS untuk OSS.
Anda memiliki izin CreateTable di proyek MaxCompute. Untuk detail tentang izin operasi tabel, lihat Izin MaxCompute.
Siapkan file data berformat SNAPPY.
Menggunakan data sampel yang disediakan, buat path folder
orc_snappy/dt=20250526di bucketoss-mc-test. Unggah file SNAPPY ke folder partisidt=20250526.Buat tabel ORC eksternal dengan kompresi SNAPPY.
CREATE EXTERNAL TABLE orc_data_type_snappy ( vehicleId INT, recordId INT, patientId INT, calls INT, locationLatitute DOUBLE, locationLongitude 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');Jika tabel eksternal OSS Anda dipartisi, jalankan perintah berikut untuk menambahkan partisi yang sudah ada. Untuk informasi selengkapnya, lihat Sintaksis untuk menambahkan partisi ke tabel eksternal OSS.
-- Tambahkan partisi ke tabel eksternal MSCK REPAIR TABLE orc_data_type_snappy ADD PARTITIONS;Baca data dari tabel eksternal ORC.
SELECT * FROM orc_data_type_snappy WHERE dt=20250526 LIMIT 10;Kueri mengembalikan hasil berikut:
+------------+------------+------------+------------+------------------+-------------------+----------------+------------+------------+ | vehicleid | recordid | patientid | calls | locationlatitute | locationlongitude | 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 | +------------+------------+------------+------------+------------------+-------------------+----------------+------------+------------+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 dimasukkan SELECT * FROM orc_data_type_snappy WHERE dt = '20250526' AND recordid=16;Kueri mengembalikan hasil berikut:
+------------+------------+------------+------------+------------------+-------------------+----------------+------------+------------+ | vehicleid | recordid | patientid | calls | locationlatitute | locationlongitude | recordtime | direction | dt | +------------+------------+------------+------------+------------------+-------------------+----------------+------------+------------+ | 1 | 16 | 76 | 1 | 46.81006 | -92.08174 | 9/14/2014 0:10 | SW | 20250526 | +------------+------------+------------+------------+------------------+-------------------+----------------+------------+------------+
Tipe data yang didukung
Untuk informasi selengkapnya tentang tipe data MaxCompute, lihat Versi tipe data 1.0 dan Versi tipe data 2.0.
Mode JNI (
set odps.ext.oss.orc.native=false;): Mode ini tidak menggunakan pembaca ORC native saat membaca tabel. Mode ini mendukung operasi baca dan tulis.Mode Native (
set odps.ext.oss.orc.native=true;): Mode ini menggunakan pembaca ORC native saat membaca tabel. Mode ini hanya mendukung operasi baca.
Mode | Mode Java (baca dan tulis) | Native mode (read-only) |
TINYINT | ||
SMALLINT | ||
INT | ||
BIGINT | ||
BINARY | ||
FLOAT | ||
DOUBLE | ||
DECIMAL(precision,scale) | ||
VARCHAR(n) | ||
CHAR(n) | ||
STRING | ||
DATE | ||
DATETIME | ||
TIMESTAMP | ||
TIMESTAMP_NTZ | ||
BOOLEAN | ||
ARRAY | ||
MAP | ||
STRUCT | ||
JSON |
Format Kompresi yang Didukung
Untuk membaca atau menulis file OSS terkompresi, Anda harus menambahkan konfigurasi
with serdepropertieske pernyataan pembuatan tabel. Untuk informasi selengkapnya, lihat Parameter properti with serdeproperties.MaxCompute mendukung pembacaan dan penulisan file ORC yang dikompresi dengan SNAPPY atau ZLIB.
Dukungan Schema Evolution
Tabel eksternal ORC mendukung dua metode untuk memetakan skema tabel ke kolom dalam file data: pemetaan berbasis posisi dan pemetaan berbasis nama.
Pemetaan berbasis posisi: Untuk menggunakan metode ini, setel parameter
'mcfed.orc.schema.resolution'='position'atau abaikan untuk menggunakan pengaturan default. Sistem memetakan kolom berdasarkan posisinya. Oleh karena itu, urutan kolom dalam tabel harus persis sesuai dengan urutan bidang dalam file.Pemetaan berbasis nama: Untuk menggunakan metode ini, setel parameter
'mcfed.orc.schema.resolution'='name'saat membuat tabel eksternal. Sistem kemudian memetakan kolom berdasarkan nama, bukan posisi.
Pada tabel berikut, Masalah kompatibilitas data menjelaskan apakah tabel eksternal dapat membaca data dengan benar setelah operasi Schema Evolution. Ini mencakup pembacaan data baru yang sesuai dengan skema yang dimodifikasi dan data historis yang menggunakan skema lama.
Jenis operasi | Metode pemetaan | Didukung | Deskripsi | Masalah kompatibilitas data |
Tambah kolom | Pemetaan berbasis posisi |
|
| |
Pemetaan berbasis nama | ||||
Hapus kolom | Pemetaan berbasis posisi | Tidak disarankan. Tabel eksternal ORC memetakan nilai kolom berdasarkan posisi. Urutan kolom tabel harus sesuai dengan urutan bidang dalam file. Setelah operasi penghapusan kolom, jika bidang file dan tabel tidak cocok, terjadi error saat membaca tabel. |
| |
Pemetaan berbasis nama | Dengan pemetaan berbasis nama, sistem secara otomatis mencocokkan berdasarkan nama kolom, tidak lagi bergantung pada urutan. | Kompatibel | ||
Ubah urutan kolom | Pemetaan berbasis posisi | Tidak disarankan. Tabel eksternal ORC memetakan nilai kolom berdasarkan posisi. Urutan kolom tabel harus sesuai dengan urutan bidang dalam file. Setelah operasi penghapusan kolom, jika bidang file dan tabel tidak cocok, terjadi error saat membaca tabel. |
| |
Pemetaan berbasis nama | Dengan pemetaan berbasis nama, sistem secara otomatis mencocokkan berdasarkan nama kolom, tidak lagi bergantung pada urutan. | Kompatibel | ||
Ubah tipe data kolom | Pemetaan berbasis posisi | Untuk informasi selengkapnya tentang tabel konversi tipe data, lihat Ubah tipe data kolom. | Kompatibel | |
Pemetaan berbasis nama | ||||
Ubah nama kolom | Pemetaan berbasis posisi | Kompatibel | ||
Pemetaan berbasis nama | Tidak disarankan. Dengan pemetaan berbasis nama, sistem secara otomatis mencocokkan berdasarkan nama kolom. Setelah mengubah nama kolom, nama kolom asli yang dapat dicocokkan mungkin tidak ditemukan dalam file. |
| ||
Ubah komentar kolom | Pemetaan berbasis posisi | Konten komentar harus berupa string yang valid dengan panjang tidak melebihi 1024 byte; jika tidak, akan dilaporkan error. | Kompatibel | |
Pemetaan berbasis nama | ||||
Ubah properti nullability kolom | Pemetaan berbasis posisi | Operasi ini tidak didukung. Secara default bersifat Nullable. | Tidak berlaku | |
Pemetaan berbasis nama |