Topik ini menjelaskan cara membuat, membaca dari, dan menulis ke tabel eksternal ORC di OSS.
Batasan
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.
Deskripsi izin
Saat mengakses tabel eksternal OSS, data diakses melalui role yang ditentukan dalam parameter
odps.properties.rolearn, baik Anda menggunakan Akun Alibaba Cloud, RAM user, maupun RAM role. Oleh karena itu, Anda harus membuat RAM role dan memberikan izin untuk mengakses bucket OSS target, lalu mengonfigurasi ARN role tersebut dalam parameterodps.properties.rolearn. Untuk informasi selengkapnya, lihat Parameter.Anda dapat mengotorisasi akses same-account atau cross-account sesuai kebutuhan bisnis. Kami merekomendasikan penggunaan kebijakan otorisasi kustom untuk kontrol akses yang lebih detail halus. Untuk informasi selengkapnya, lihat Otorisasi untuk sumber data eksternal.
Buat tabel eksternal
sintaksis
Jika skema file ORC dan skema tabel eksternal tidak sesuai, MaxCompute menangani perbedaan tersebut sebagai berikut:
Kolom dalam file lebih sedikit daripada dalam tabel: Kolom yang hilang diisi dengan NULL.
Kolom dalam file lebih banyak daripada dalam tabel: Kolom tambahan dibuang.
Ketidakcocokan tipe: STRING dapat membaca data INT dari file ORC, tetapi hal ini tidak disarankan. Membaca data STRING sebagai INT akan mengonversi nilai non-numerik menjadi NULL dan menerima nilai numerik.
Gunakan sintaksis sederhana atau sintaksis lengkap untuk membuat tabel eksternal ORC.
Sintaksis sederhana (direkomendasikan)
Gunakan sintaksis ini jika Anda ingin MaxCompute menangani otorisasi secara otomatis menggunakan RAM role default.
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/<role_name>'
)
STORED AS orc
LOCATION '<oss_location>'
tblproperties (
'<xxx>'='<yyy>'
);Parameter umum
Untuk informasi selengkapnya tentang parameter umum, lihat Parameter sintaksis dasar.
Parameter khusus format
WITH serdeproperties
Properti | Kapan digunakan | Nilai | Default |
| File ORC dalam tabel eksternal yang sama memiliki skema yang tidak konsisten. |
|
|
tblproperties
Properti | Kapan digunakan | Deskripsi | Nilai | Default |
| Menulis data ORC ke OSS dalam format terkompresi. Tidak diperlukan konfigurasi parameter tambahan saat membaca file terkompresi. | Algoritma kompresi untuk file output ORC. |
| None |
| Menambahkan awalan kustom ke file output. | String awalan. Karakter yang diizinkan: huruf, angka, dan garis bawah (a–z, A–Z, 0–9, _). Panjang: 1–10 karakter. | Contoh: | None |
| Mengontrol apakah file output menyertakan ekstensi file. |
|
|
|
| Menambahkan akhiran kustom ke file output. | String akhiran. Karakter yang diizinkan: huruf, angka, dan garis bawah. | Contoh: | None |
| Menambahkan ekstensi kustom ke file output. Memiliki prioritas lebih tinggi daripada | String ekstensi. Karakter yang diizinkan: huruf, angka, dan garis bawah. Panjang: 1–10 karakter. | Contoh: | None |
odps.ext.column.mapping | Tambahkan properti ini ketika nama field dalam file data OSS mengandung karakter khusus. | Properti ini mendefinisikan pemetaan nama kolom kustom. Misalnya, jika field file OSS adalah id BIGINT, $_test DOUBLE, dan =name STRING, atur nilai parameter menjadi t_test:$_test,t_name:=_name saat membuat tabel eksternal. Anda hanya perlu menentukan pemetaan untuk field yang mengandung karakter khusus. | Tidak ada nilai tetap | None |
odps.ext.column.mapping.delimiters (Gunakan hanya ketika karakter dalam nama kolom bertentangan dengan pembatas default dalam pemetaan nama kolom. Umumnya tidak disarankan.) | Tambahkan properti ini ketika nama kolom mengandung karakter khusus | Properti ini menyesuaikan pembatas intra-grup dan antar-grup untuk pasangan kunci-nilai. Nilainya harus terdiri tepat dua karakter: karakter pertama berfungsi sebagai pembatas kunci-nilai, dan karakter kedua berfungsi sebagai pembatas antar pasangan kunci-nilai yang berbeda. | Tidak ada nilai tetap. Contoh: | Nilai default:
|
| Menyesuaikan penggunaan memori dan throughput pemrosesan. | Jumlah baris yang diproses per batch (ukuran batch ORC). | Bilangan bulat non-negatif |
|
Daftar putih dan blacklist
Tabel eksternal OSS MaxCompute mendukung penyaringan daftar putih dan blacklist. Dengan mengatur parameter daftar putih dan blacklist dalam tblproperties, Anda dapat menyaring file mana yang akan dibaca dari direktori. Untuk detailnya, lihat Daftar putih dan blacklist.
Menulis data
Untuk detail tentang sintaksis penulisan di MaxCompute, lihat Sintaksis penulisan.
Kueri data
Lihat Sintaksis kueri untuk detail sintaksis SELECT.
Lihat Optimasi kueri untuk detail optimasi rencana kueri.
Aktifkan penurunan predikat
Penurunan predikat (PPD) meningkatkan performa kueri pada tabel eksternal ORC dengan mendorong kondisi filter ke lapisan pemindaian data. PPD memerlukan mode native (
odps.ext.oss.orc.native=true).Tambahkan pernyataan berikut sebelum kueri SQL Anda:
-- Aktifkan pembaca native ORC SET odps.ext.oss.orc.native=true; -- Aktifkan penurunan predikat ORC SET odps.storage.orc.use.predicate.pushdown=true;
Contoh
Contoh ini membuat tabel eksternal ORC dengan kompresi SNAPPY, menambahkan partisi yang sudah ada, membaca data, dan menulis baris baru.
Prasyarat
Anda telah membuat proyek MaxCompute.
Anda telah menyiapkan bucket dan direktori OSS. Untuk informasi selengkapnya, lihat Buat bucket dan Kelola direktori.
Pastikan bucket Anda berada di wilayah yang sama dengan proyek MaxCompute Anda.
Berikan izin.
Anda memiliki izin untuk mengakses OSS. Anda dapat mengakses tabel eksternal OSS menggunakan Akun Alibaba Cloud, RAM user, atau RAM role. Untuk informasi selengkapnya tentang cara memberikan izin, lihat Otorisasi mode STS untuk OSS.
Anda memiliki izin CreateTable di proyek MaxCompute. Untuk informasi selengkapnya tentang izin terkait tabel, lihat Izin MaxCompute.
Langkah 1: Siapkan file data
Menggunakan data sampel yang disediakan, buat path folder orc_snappy/dt=20250526 di bucket oss-mc-test. Unggah file snappy ke folder partisi dt=20250526.
Langkah 2: Buat tabel eksternal
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/<role_name>'
)
STORED AS ORC
LOCATION 'oss://oss-cn-hangzhou-internal.aliyuncs.com/oss-mc-test/orc_snappy/'
tblproperties (
'mcfed.orc.compress'='SNAPPY'
);Langkah 3: Tambahkan partisi yang sudah ada
Untuk tabel eksternal berpartisi, jalankan MSCK REPAIR TABLE untuk mendaftarkan partisi OSS yang sudah ada ke MaxCompute. Untuk sintaksis lengkapnya, lihat Menambahkan partisi ke tabel eksternal OSS.
MSCK REPAIR TABLE orc_data_type_snappy ADD PARTITIONS;Langkah 4: Baca data
SELECT * FROM orc_data_type_snappy WHERE dt = '20250526' LIMIT 10;Kueri mengembalikan:
+------------+------------+------------+------------+------------------+-------------------+----------------+------------+------------+
| 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 |
+------------+------------+------------+------------+------------------+-------------------+----------------+------------+------------+Langkah 5: Tulis data
INSERT INTO orc_data_type_snappy PARTITION (dt = '20250526')
VALUES (1, 16, 76, 1, 46.81006, -92.08174, '9/14/2014 0:10', 'SW');
-- Verifikasi baris yang dimasukkan
SELECT * FROM orc_data_type_snappy WHERE dt = '20250526' AND recordid = 16;Kueri mengembalikan:
+------------+------------+------------+------------+------------------+-------------------+----------------+------------+------------+
| 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 daftar lengkap tipe data MaxCompute, lihat Tipe data versi 1.0 dan Tipe data versi 2.0.
MaxCompute mendukung dua mode untuk membaca tabel eksternal ORC:
Mode JNI (
SET odps.ext.oss.orc.native=false;): Mendukung operasi baca dan tulis.Mode native (
SET odps.ext.oss.orc.native=true;): Hanya mendukung operasi baca.
Tipe data | Mode JNI (baca dan tulis) | Mode native (hanya baca) |
TINYINT | Ya | Ya |
SMALLINT | Ya | Ya |
INT | Ya | Ya |
BIGINT | Ya | Ya |
BINARY | Ya | Ya |
FLOAT | Ya | Ya |
DOUBLE | Ya | Ya |
DECIMAL(precision,scale) | Ya | Ya |
VARCHAR(n) | Ya | Ya |
CHAR(n) | Ya | Ya |
STRING | Ya | Ya |
DATE | Ya | Ya |
DATETIME | Tidak | Ya |
TIMESTAMP | Tidak | Tidak |
TIMESTAMP_NTZ | Ya | Tidak |
BOOLEAN | Ya | Ya |
ARRAY | Ya | Ya |
MAP | Ya | Ya |
STRUCT | Ya | Ya |
JSON | Tidak | Tidak |
Format kompresi yang didukung
Untuk membaca atau menulis file ORC terkompresi, tambahkan properti mcfed.orc.compress ke bagian with serdeproperties saat membuat tabel, lihat WITH serdeproperties.
Properti kompresi | Baca | Tulis |
ZSTD | Ya | Ya |
SNAPPY(SnappyRawCodec) | Ya | Ya |
SNAPPY(SnappyCodec) | Ya | Tidak |
ZLIB | Ya | Ya |
Evolusi skema yang didukung
Tabel eksternal ORC mendukung dua metode untuk memetakan kolom tabel ke field file ORC: pemetaan berbasis posisi dan pemetaan berbasis nama.
Pemetaan berbasis posisi (default): Atur
'mcfed.orc.schema.resolution'='position'atau abaikan properti tersebut. Kolom dicocokkan berdasarkan urutannya, sehingga urutan kolom tabel harus persis sesuai dengan urutan field dalam file ORC.Pemetaan berbasis nama: Atur
'mcfed.orc.schema.resolution'='name'. Kolom dicocokkan berdasarkan nama, terlepas dari urutannya.
Tabel di bawah ini menunjukkan operasi perubahan skema mana yang kompatibel dengan masing-masing metode pemetaan. "Kompatibel" berarti data yang baru ditulis maupun data historis dapat dibaca dengan benar setelah operasi tersebut.
Perubahan skema | Mode pemetaan | Didukung | Deskripsi | Kompatibilitas data |
Tambah kolom | Berdasarkan posisi | Ya |
|
Misalnya, setelah kolom ditambahkan, baris historis yang tidak memiliki kolom baru tersebut mengembalikan NULL untuk kolom tersebut. |
Berdasarkan nama | Ya | |||
Hapus kolom | Berdasarkan posisi | Tidak | Tidak disarankan. Pemetaan berbasis posisi mengharuskan urutan kolom dalam DDL sesuai dengan file. Setelah kolom dihapus, skema DDL dan file menjadi berbeda, menyebabkan error saat membaca. |
Misalnya, setelah kolom dihapus, data historis yang masih berisi kolom yang dihapus menyebabkan error saat membaca. |
Berdasarkan nama | Ya | Pemetaan berbasis nama mencocokkan kolom berdasarkan nama, terlepas dari urutan kolom. | Kompatibel | |
Ubah urutan kolom | Berdasarkan posisi | Tidak | Tidak disarankan. Pemetaan berbasis posisi mengharuskan urutan kolom dalam DDL sesuai dengan file. Setelah kolom diubah urutannya, skema DDL dan file menjadi berbeda, menyebabkan error saat membaca. |
Misalnya, setelah kolom diubah urutannya, data historis tetap mempertahankan urutan aslinya, menyebabkan ketidaksesuaian antara skema dan data. |
Berdasarkan nama | Ya | Pemetaan berbasis nama mencocokkan kolom berdasarkan nama, terlepas dari urutan kolom. | Kompatibel | |
Ubah tipe data kolom | Berdasarkan posisi | Ya | Untuk konversi tipe yang diizinkan, lihat Ubah tipe data kolom. | Kompatibel |
Berdasarkan nama | Ya | |||
Ubah nama kolom | Berdasarkan posisi | Ya | Kompatibel | |
Berdasarkan nama | Tidak | Tidak disarankan. Pemetaan berbasis nama mencocokkan kolom berdasarkan nama. Setelah kolom diubah namanya, file yang ada yang menggunakan nama asli tidak dapat lagi dicocokkan. |
Misalnya, setelah kolom diubah namanya, jika skema file ORC masih menggunakan nama asli, kolom tersebut mengembalikan NULL saat dibaca. | |
Ubah komentar kolom | Berdasarkan posisi | Ya | Komentar harus berupa string valid dengan panjang maksimal 1.024 byte. | Kompatibel |
Berdasarkan nama | Ya | |||
Ubah nullability kolom | Berdasarkan posisi | Tidak | Kolom bersifat nullable secara default. | Tidak berlaku |
Berdasarkan nama | Tidak |