Topik ini menjelaskan cara membuat, membaca, dan menulis tabel eksternal ORC untuk OSS.
Batasan
Tabel eksternal OSS tidak mendukung properti cluster.
Ukuran satu file tidak boleh melebihi 2 GB. Anda harus melakukan Pemisahan pada file yang berukuran lebih besar dari 2 GB.
MaxCompute dan OSS harus berada di Wilayah yang sama.
Deskripsi izin
Saat mengakses tabel eksternal OSS, data diakses melalui peran yang ditentukan dalam parameter
odps.properties.rolearn, baik menggunakan Akun Alibaba Cloud, pengguna RAM, maupun Peran RAM. Oleh karena itu, Anda harus membuat Peran RAM dan memberikan izin untuk mengakses Bucket OSS target, lalu mengonfigurasikan ARN peran tersebut dalam parameterodps.properties.rolearn. Untuk informasi selengkapnya, lihat Parameter.Anda dapat mengotorisasi akses akun yang sama atau lintas akun sesuai kebutuhan bisnis. Sebaiknya gunakan kebijakan otorisasi kustom untuk Kontrol akses dengan detail halus. Untuk informasi selengkapnya, lihat Otorisasi untuk Sumber data eksternal.
Membuat tabel eksternal
sintaksis
Jika skema file ORC dan skema tabel eksternal tidak sesuai, MaxCompute menangani perbedaannya sebagai berikut:
Kolom dalam file lebih sedikit daripada di tabel: Kolom yang hilang akan diisi dengan NULL.
Kolom dalam file lebih banyak daripada di tabel: Kolom tambahan akan diabaikan.
Ketidakcocokan tipe: STRING dapat membaca data INT dari file ORC, namun hal ini tidak disarankan. INT yang membaca data STRING akan mengonversi nilai non-numerik menjadi NULL dan menerima nilai numerik.
Gunakan sintaksis sederhana atau sintaksis lengkap untuk membuat tabel eksternal ORC.
Sintaksis sederhana (disarankan)
Gunakan sintaksis ini jika Anda ingin MaxCompute menangani otorisasi secara otomatis menggunakan Peran RAM 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. |
| Tidak ada |
| 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: | Tidak ada |
| Mengontrol apakah file output menyertakan ekstensi file. |
|
|
|
| Menambahkan akhiran kustom ke file output. | String akhiran. Karakter yang diizinkan: huruf, angka, dan garis bawah. | Contoh: | Tidak ada |
| Menambahkan ekstensi kustom ke file output. Diutamakan dibandingkan | String ekstensi. Karakter yang diizinkan: huruf, angka, dan garis bawah. Panjang: 1–10 karakter. | Contoh: | Tidak ada |
odps.ext.column.mapping | Tambahkan properti ini jika nama bidang dalam file data OSS mengandung karakter khusus. | Properti ini mendefinisikan pemetaan nama kolom kustom. Misalnya, jika bidang 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 bidang yang mengandung karakter khusus. | Tidak ada nilai tetap | Tidak ada |
odps.ext.column.mapping.delimiters (Gunakan hanya jika karakter dalam nama kolom bertentangan dengan delimiter default dalam pemetaan nama kolom. Umumnya tidak disarankan.) | Tambahkan properti ini jika nama kolom mengandung karakter khusus | Properti ini menyesuaikan delimiter intra-kelompok dan antar-kelompok untuk pasangan kunci-nilai. Nilai harus terdiri dari tepat dua karakter: karakter pertama berfungsi sebagai delimiter kunci-nilai, dan karakter kedua berfungsi sebagai delimiter antara 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 di tblproperties, Anda dapat memfilter file yang akan dibaca dari direktori. Untuk detailnya, lihat Daftar putih dan blacklist.
Menulis data
Untuk detail mengenai sintaksis penulisan di MaxCompute, lihat Sintaksis penulisan.
Melakukan kueri data
Lihat Sintaksis kueri untuk detail tentang sintaksis SELECT.
Lihat Optimalisasi kueri untuk detail tentang mengoptimalkan Rencana kueri.
Mengaktifkan 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:
-- Mengaktifkan pembaca native ORC SET odps.ext.oss.orc.native=true; -- Mengaktifkan 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 Membuat bucket dan Mengelola 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, pengguna RAM, atau Peran RAM. 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: Menyiapkan file data
Menggunakan data sampel yang disediakan, buat jalur folder orc_snappy/dt=20250526 di bucket oss-mc-test. Unggah file snappy ke folder partisi dt=20250526.
Langkah 2: Membuat 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: Menambahkan partisi yang 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: Membaca 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: Menulis 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');
-- Memverifikasi baris yang disisipkan
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 bidang 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 sama persis dengan urutan bidang dalam file ORC.Pemetaan berbasis nama: Atur
'mcfed.orc.schema.resolution'='name'. Kolom dicocokkan berdasarkan nama, tanpa bergantung pada urutan.
Tabel di bawah ini menunjukkan operasi perubahan skema mana yang kompatibel dengan setiap metode Pemetaan. "Kompatibel" berarti data yang baru ditulis maupun data historis dapat dibaca dengan benar setelah operasi dilakukan.
Perubahan skema | Mode pemetaan | Didukung | Deskripsi | Kompatibilitas data |
Menambah kolom | Berdasarkan posisi | Ya |
|
Misalnya, setelah kolom ditambahkan, baris historis yang tidak memiliki kolom baru akan mengembalikan NULL untuk kolom tersebut. |
Berdasarkan nama | Ya | |||
Menghapus 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 kesalahan baca. |
Misalnya, setelah kolom dihapus, data historis yang masih berisi kolom yang dihapus akan menyebabkan kesalahan baca. |
Berdasarkan nama | Ya | Pemetaan berbasis nama mencocokkan kolom berdasarkan nama, tanpa bergantung pada urutan kolom. | Kompatibel | |
Mengubah urutan kolom | Berdasarkan posisi | Tidak | Tidak disarankan. Pemetaan berbasis posisi mengharuskan urutan kolom dalam DDL sesuai dengan file. Setelah kolom diurutkan ulang, skema DDL dan file menjadi berbeda, menyebabkan kesalahan baca. |
Misalnya, setelah kolom diurutkan ulang, data historis mempertahankan urutan aslinya, menyebabkan ketidaksesuaian antara skema dan data. |
Berdasarkan nama | Ya | Pemetaan berbasis nama mencocokkan kolom berdasarkan nama, tanpa bergantung pada urutan kolom. | Kompatibel | |
Mengubah Tipe data kolom | Berdasarkan posisi | Ya | Untuk konversi tipe yang diizinkan, lihat Mengubah Tipe data kolom. | Kompatibel |
Berdasarkan nama | Ya | |||
Mengganti nama kolom | Berdasarkan posisi | Ya | Kompatibel | |
Berdasarkan nama | Tidak | Tidak disarankan. Pemetaan berbasis nama mencocokkan kolom berdasarkan nama. Setelah kolom diganti namanya, file yang ada yang menggunakan nama asli tidak lagi dapat dicocokkan. |
Misalnya, setelah kolom diganti namanya, jika skema file ORC masih menggunakan nama asli, kolom tersebut akan mengembalikan NULL saat dibaca. | |
Mengubah komentar kolom | Berdasarkan posisi | Ya | Komentar harus berupa string valid yang tidak lebih dari 1.024 byte. | Kompatibel |
Berdasarkan nama | Ya | |||
Mengubah nullability kolom | Berdasarkan posisi | Tidak | Kolom bersifat nullable secara default. | Tidak berlaku |
Berdasarkan nama | Tidak |