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
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 | Berdasarkan posisi kolom. Ini setara dengan menyetel |
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. |
| 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.
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, gantialiyunodpsdefaultroledengan nama peran target dan berikan izin kepada peran target untuk mengakses OSS.
Siapkan file ORC yang dikompresi menggunakan SNAPPY.
Di bucket
oss-mc-testuntuk Data Sampel, buat hierarki folderorc_snappy/dt=20250526, dan simpan file snappy di folder partisidt=20250526.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');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;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 | +------------+------------+------------+------------+------------------+-------------------+----------------+------------+------------+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 | +------------+------------+------------+------------+------------------+-------------------+----------------+------------+------------+