Topik ini menjelaskan cara membuat, membaca dari, dan menulis ke tabel eksternal CSV dan TSV di Object Storage Service (OSS).
Prasyarat
Akun Alibaba Cloud, Pengguna RAM, atau Peran RAM Anda harus memiliki izin yang diperlukan untuk mengakses tabel eksternal OSS. Untuk informasi lebih lanjut tentang otorisasi, lihat Otorisasi STS untuk OSS.
(Opsional) Anda telah membuat bucket OSS, direktori OSS, dan file data OSS. Untuk informasi lebih lanjut, lihat Buat bucket, Kelola direktori, dan Unggahan sederhana.
MaxCompute dapat secara otomatis membuat direktori di OSS. Anda dapat menggunakan satu pernyataan SQL untuk melakukan operasi baca dan tulis yang melibatkan tabel eksternal dan UDF sekaligus. Pembuatan direktori manual tidak lagi diperlukan, meskipun metode lama masih didukung.
Anda telah membuat proyek MaxCompute. Untuk informasi lebih lanjut, lihat Buat proyek MaxCompute.
MaxCompute hanya tersedia di wilayah tertentu. Untuk mencegah masalah konektivitas data lintas wilayah, gunakan bucket di wilayah yang sama dengan proyek MaxCompute Anda.
Akun Alibaba Cloud atau Pengguna RAM Anda memiliki izin CreateTable pada proyek Anda. Untuk informasi lebih lanjut tentang izin operasi tabel, lihat Izin MaxCompute.
Batasan
Properti kluster tidak didukung untuk tabel eksternal OSS.
Ukuran satu file tidak boleh melebihi 3 GB. Jika ukuran file lebih besar dari 3 GB, Anda harus membaginya.
Catatan
Kesalahan terjadi saat membaca data dari file CSV atau TSV jika jumlah kolom dalam file tidak sesuai dengan jumlah kolom dalam pernyataan DDL tabel eksternal. Contohnya: FAILED: ODPS-0123131:User defined function exception - Traceback:java.lang.RuntimeException: SCHEMA MISMATCH:xxx.
Untuk mengontrol perilaku ini, Anda dapat mengatur parameter odps.sql.text.schema.mismatch.mode pada tingkat sesi:
SET odps.sql.text.schema.mismatch.mode=error: Jika jumlah kolom tidak cocok, sistem melaporkan kesalahan.SET odps.sql.text.schema.mismatch.mode=truncate: Jika jumlah kolom tidak cocok, kolom tambahan dibuang. Jika data sumber memiliki lebih sedikit kolom daripada definisi tabel, kolom yang hilang diisi dengan NULL.
Dukungan tipe data
Untuk informasi lebih lanjut tentang tipe data MaxCompute, lihat Tipe data (Versi 1.0) dan Tipe data (Versi 2.0).
Untuk informasi lebih lanjut tentang Smart Parse, lihat Penguraian tipe yang lebih fleksibel dengan Smart Parse.
Tipe data | com.aliyun.odps.CsvStorageHandler/ TsvStorageHandler (parser data teks bawaan) | org.apache.hadoop.hive.serde2.OpenCSVSerde (parser data open source bawaan) |
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 |
|
|
Dukungan format kompresi
Saat membaca dari atau menulis ke file OSS terkompresi, Anda harus menambahkan properti with serdeproperties ke pernyataan CREATE TABLE. Untuk informasi lebih lanjut, lihat Parameter with serdeproperties.
Format kompresi | com.aliyun.odps.CsvStorageHandler/ TsvStorageHandler (parser data teks bawaan) | org.apache.hadoop.hive.serde2.OpenCSVSerde (parser data open source bawaan) |
GZIP |
|
|
SNAPPY |
|
|
LZO |
|
|
Buat tabel eksternal
Sintaks
Untuk informasi lebih lanjut tentang sintaks pembuatan tabel eksternal dalam berbagai format, lihat Tabel eksternal OSS.
Parser data teks bawaan
Format CSV
CREATE EXTERNAL TABLE [IF NOT EXISTS] <mc_oss_extable_name> ( <col_name> <data_type>, ... ) [COMMENT <table_comment>] [PARTITIONED BY (<col_name> <data_type>, ...)] STORED BY 'com.aliyun.odps.CsvStorageHandler' [WITH serdeproperties ( ['<property_name>'='<property_value>',...] )] LOCATION '<oss_location>' [tblproperties ('<tbproperty_name>'='<tbproperty_value>',...)];Format TSV
CREATE EXTERNAL TABLE [IF NOT EXISTS] <mc_oss_extable_name> ( <col_name> <data_type>, ... ) [COMMENT <table_comment>] [PARTITIONED BY (<col_name> <data_type>, ...)] STORED BY 'com.aliyun.odps.TsvStorageHandler' [WITH serdeproperties ( ['<property_name>'='<property_value>',...] )] LOCATION '<oss_location>' [tblproperties ('<tbproperty_name>'='<tbproperty_value>',...)];
Parser data open source bawaan
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.serde2.OpenCSVSerde' [WITH serdeproperties ( ['<property_name>'='<property_value>',...] )] STORED AS TEXTFILE LOCATION '<oss_location>' [tblproperties ('<tbproperty_name>'='<tbproperty_value>',...)];
Parameter umum
Untuk informasi lebih lanjut tentang parameter umum, lihat Parameter sintaks dasar.
Parameter unik
Parameter with serdeproperties
Parser yang berlaku | Nama properti | Skenario | Deskripsi | Nilai properti | Nilai default |
Parser data teks bawaan (CsvStorageHandler/TsvStorageHandler) | odps.text.option.gzip.input.enabled | Tambahkan properti ini untuk membaca data dari file CSV atau TSV terkompresi GZIP. | Properti kompresi CSV dan TSV. Atur parameter ini ke True agar MaxCompute dapat membaca file terkompresi. Jika tidak, operasi baca gagal. |
| False |
odps.text.option.gzip.output.enabled | Tambahkan properti ini untuk menulis data ke OSS dalam format kompresi GZIP. | Properti kompresi CSV dan TSV. Atur parameter ini ke True agar MaxCompute dapat menulis data ke OSS dalam format kompresi GZIP. Jika tidak, data tidak dikompresi. |
| False | |
odps.text.option.header.lines.count | Tambahkan properti ini untuk mengabaikan N baris pertama dari file data CSV atau TSV di OSS. | Saat MaxCompute membaca file data dari OSS, file tersebut mengabaikan jumlah baris yang ditentukan. | Bilangan bulat non-negatif | 0 | |
odps.text.option.null.indicator | Tambahkan properti ini untuk mendefinisikan bagaimana nilai NULL diurai dalam file data CSV atau TSV di OSS. | String yang ditentukan oleh parameter ini diurai sebagai NULL dalam SQL. Misalnya, jika | String | String kosong | |
odps.text.option.ignore.empty.lines | Tambahkan properti ini untuk mendefinisikan bagaimana baris kosong ditangani dalam file data CSV atau TSV di OSS. | Jika parameter ini diatur ke True, MaxCompute mengabaikan baris kosong dalam file data. Jika tidak, baris kosong dibaca. |
| True | |
odps.text.option.encoding | Tambahkan properti ini jika pengkodean file data CSV atau TSV di OSS bukan pengkodean default. | Pastikan pengkodean yang ditentukan di sini sesuai dengan pengkodean file data OSS. Jika tidak, MaxCompute tidak dapat membaca data. |
| UTF-8 | |
odps.text.option.delimiter | Tambahkan properti ini untuk menentukan pemisah kolom untuk file data CSV atau TSV. | Pastikan pemisah kolom yang ditentukan dapat membaca setiap kolom file data OSS dengan benar. Jika tidak, data yang dibaca oleh MaxCompute mungkin tidak selaras. | Karakter tunggal | Koma (,) | |
odps.text.option.use.quote | Tambahkan properti ini jika suatu bidang dalam file data CSV atau TSV berisi jeda baris (CRLF), tanda kutip ganda, atau koma. | Saat suatu bidang dalam file CSV berisi jeda baris, tanda kutip ganda (dieskapi dengan menambahkan |
| False | |
odps.sql.text.option.flush.header | Saat menulis data ke OSS, baris pertama blok file adalah header. | Parameter ini hanya berlaku untuk file CSV. |
| False | |
odps.sql.text.schema.mismatch.mode | Saat jumlah kolom data dalam file OSS tidak sesuai dengan jumlah kolom dalam skema tabel eksternal. | Menentukan cara menangani baris dengan jumlah kolom yang tidak cocok. Catatan: Pengaturan ini tidak berpengaruh saat parameter odps.text.option.use.quote diatur ke True. |
| error | |
Parser data open source bawaan (OpenCSVSerde) | separatorChar | Tambahkan properti ini untuk menentukan pemisah kolom untuk data CSV yang disimpan dalam format TEXTFILE. | Menentukan pemisah kolom untuk data CSV. | String tunggal | Koma (,) |
quoteChar | Tambahkan properti ini jika suatu bidang dalam data CSV yang disimpan dalam format TEXTFILE berisi jeda baris, tanda kutip ganda, atau koma. | Menentukan karakter kutip untuk data CSV. | String tunggal | Tidak ada | |
escapeChar | Tambahkan properti ini untuk menentukan aturan escape untuk data CSV yang disimpan dalam format TEXTFILE. | Menentukan karakter escape untuk data CSV. | String tunggal | Tidak ada |
Parameter tblproperties
Parser yang berlaku | Nama properti | Skenario | Deskripsi | Nilai properti | Nilai default |
Parser data open source bawaan (OpenCSVSerde) | skip.header.line.count | Tambahkan properti ini untuk mengabaikan N baris pertama dari file CSV yang disimpan dalam format TEXTFILE. | Saat MaxCompute membaca data dari OSS, file tersebut mengabaikan jumlah baris yang ditentukan mulai dari baris pertama. | Bilangan bulat non-negatif | Tidak ada |
skip.footer.line.count | Tambahkan properti ini untuk mengabaikan N baris terakhir dari file CSV yang disimpan dalam format TEXTFILE. | Saat MaxCompute membaca data dari OSS, file tersebut mengabaikan jumlah baris yang ditentukan mulai dari baris terakhir. | Bilangan bulat non-negatif | Tidak ada | |
mcfed.mapreduce.output.fileoutputformat.compress | Tambahkan properti ini untuk menulis file data TEXTFILE ke OSS dalam format terkompresi. | Properti kompresi TEXTFILE. Atur parameter ini ke True agar MaxCompute dapat menulis file data TEXTFILE ke OSS dalam format terkompresi. Jika tidak, data tidak dikompresi. |
| False | |
mcfed.mapreduce.output.fileoutputformat.compress.codec | Tambahkan properti ini untuk menulis file data TEXTFILE ke OSS dalam format terkompresi. | Properti kompresi TEXTFILE. Menetapkan metode kompresi untuk file data TEXTFILE. Catatan: Hanya empat metode kompresi yang didukung untuk |
| Tidak ada | |
io.compression.codecs | Tambahkan properti ini jika file data OSS dalam format Raw-Snappy. | Atur parameter ini ke True agar MaxCompute dapat membaca data terkompresi. Jika tidak, MaxCompute tidak dapat membaca data. | com.aliyun.odps.io.compress.SnappyRawCodec | Tidak ada |
Menulis data
Untuk informasi lebih lanjut tentang sintaks penulisan di MaxCompute, lihat Sintaks penulisan.
Analisis kueri
Untuk informasi lebih lanjut tentang sintaks SELECT, lihat Sintaks kueri.
Untuk informasi lebih lanjut tentang mengoptimalkan rencana kueri, lihat Optimasi kueri.
Penguraian tipe yang lebih fleksibel dengan Smart Parse
SQL MaxCompute menggunakan Tipe data 2.0 untuk membaca dan menulis data pada tabel eksternal OSS berformat CSV. Fitur ini memberikan kompatibilitas dengan berbagai jenis nilai dalam file CSV, sedangkan sebelumnya hanya mendukung nilai dalam format ketat. Tabel berikut memberikan detail lebih lanjut.
Tipe | Masukan sebagai String | Keluaran sebagai String | Deskripsi |
BOOLEAN |
Catatan Masukan dipangkas menggunakan operasi |
| Jika nilai tidak termasuk dalam enumerasi, penguraian gagal. |
TINYINT |
Catatan
|
| Bilangan bulat 8-bit. Kesalahan dilaporkan jika nilai berada di luar rentang |
SMALLINT | Bilangan bulat 16-bit. Kesalahan dilaporkan jika nilai berada di luar rentang | ||
INT | Bilangan bulat 32-bit. Kesalahan dilaporkan jika nilai berada di luar rentang | ||
BIGINT | Bilangan bulat 64-bit. Kesalahan dilaporkan jika nilai berada di luar rentang Catatan
| ||
FLOAT |
Catatan
|
| Nilai khusus (tidak peka huruf besar/kecil) meliputi NaN, Inf, -Inf, Infinity, dan -Infinity. Kesalahan dilaporkan jika nilai berada di luar rentang nilai. Jika presisi terlampaui, nilai dibulatkan dan dipotong. |
DOUBLE |
Catatan
|
| Nilai khusus (tidak peka huruf besar/kecil) meliputi NaN, Inf, -Inf, Infinity, dan -Infinity. Kesalahan dilaporkan jika nilai berada di luar rentang nilai. Jika presisi terlampaui, nilai dibulatkan dan dipotong. |
DECIMAL (presisi, skala) Contoh: DECIMAL(15,2) |
Catatan
|
| Kesalahan dilaporkan jika bagian bilangan bulat melebihi Jika bagian pecahan melebihi skala, nilai dibulatkan dan dipotong. |
CHAR(n) Contoh: CHAR(7) |
|
| Panjang maksimum adalah 255. Jika panjangnya kurang dari n, diisi dengan spasi. Spasi pengisi tidak digunakan dalam perbandingan. Jika panjangnya melebihi n, string dipotong. |
VARCHAR(n) Contoh: VARCHAR(7) |
|
| Panjang maksimum adalah 65535. Jika panjangnya melebihi n, string dipotong. |
STRING |
|
| Batas panjang adalah 8 MB. |
DATE |
Catatan Anda juga dapat menyesuaikan metode penguraian untuk masukan dengan mengatur |
|
|
TIMESTAMP_NTZ Catatan OpenCsvSerde tidak mendukung tipe ini karena tidak kompatibel dengan format data Hive. |
|
|
|
DATETIME |
| Jika zona waktu sistem adalah Asia/Shanghai:
|
|
TIMESTAMP |
| Jika zona waktu sistem adalah Asia/Shanghai:
|
|
Catatan
Untuk semua tipe data, string kosong dalam file data CSV diurai sebagai NULL saat dibaca ke dalam tabel.
Tipe kompleks seperti STRUCT, ARRAY, dan MAP tidak didukung karena nilainya dapat dengan mudah bertentangan dengan pemisah CSV umum, seperti koma (,), yang dapat menyebabkan penguraian gagal.
Tipe BINARY dan INTERVAL saat ini tidak didukung. Untuk menggunakan tipe-tipe ini, Anda dapat menghubungi dukungan teknis MaxCompute.
Untuk tipe data INT, SMALLINT, TINYINT, BIGINT, FLOAT, DOUBLE, dan DECIMAL, kemampuan penguraian default bersifat fleksibel.
Jika Anda ingin hanya mengurai string angka dasar, Anda dapat mengatur parameter
odps.text.option.smart.parse.levelkenaiveditblproperties. Ini mengonfigurasi parser untuk hanya mendukung string angka biasa, seperti "123" dan "123.456". Mengurai format string lainnya menghasilkan kesalahan.Untuk keempat tipe terkait tanggal dan waktu (DATE, DATETIME, TIMESTAMP, dan TIMESTAMP_NTZ), kode dasar menggunakan
java.time.format.DateTimeFormatteruntuk pemrosesan. MaxCompute memiliki beberapa format penguraian default bawaan. Anda juga dapat mendefinisikan beberapa format penguraian dan satu format keluaran dengan mengaturodps.text.option.<date|datetime|timestamp|timestamp_ntz>.io.formatditblproperties. Anda dapat memisahkan format penguraian dengan simbol hash (#).Format kustom memiliki prioritas lebih tinggi daripada format penguraian bawaan MaxCompute. Format keluaran menggunakan format kustom pertama.
Misalnya, jika Anda mendefinisikan string format kustom untuk tipe DATE sebagai
pattern1#pattern2#pattern3, Anda dapat mengurai string yang cocok denganpattern1,pattern2, ataupattern3. Namun, saat Anda menulis data ke file, keluaran menggunakan formatpattern1. Untuk informasi lebih lanjut, lihat DateTimeFormatter.Jangan gunakan 'z' (nama zona waktu) sebagai format zona waktu kustom, terutama untuk pengguna di Tiongkok, karena 'z' bisa ambigu dalam beberapa konteks.
Misalnya, 'CST' biasanya berarti China Standard Time (UTC+8) di Tiongkok. Namun, saat 'CST' diurai oleh
java.time.format.DateTimeFormatter, itu diidentifikasi sebagai US Central Standard Time (UTC-6). Hal ini dapat menyebabkan masukan atau keluaran yang tidak terduga. Gunakan pola 'x' (offset-zona) atau 'VV' (ID zona waktu) sebagai gantinya.
Contoh
Saat 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 berbeda, gantialiyunodpsdefaultroledengan nama peran target dan berikan izin akses OSS kepada peran target tersebut.
Buat tabel eksternal OSS menggunakan parser data teks bawaan
Contoh 1: Tabel non-partisi
Petakan tabel ke folder
Demo1/di data sampel. Kode contoh berikut menunjukkan cara membuat tabel eksternal OSS.CREATE EXTERNAL TABLE IF NOT EXISTS mc_oss_csv_external1 ( vehicleId INT, recordId INT, patientId INT, calls INT, locationLatitute DOUBLE, locationLongitude DOUBLE, recordTime STRING, direction STRING ) STORED BY 'com.aliyun.odps.CsvStorageHandler' WITH serdeproperties ( 'odps.properties.rolearn'='acs:ram::<uid>:role/aliyunodpsdefaultrole' ) LOCATION 'oss://oss-cn-hangzhou-internal.aliyuncs.com/oss-mc-test/Demo1/'; -- Anda dapat menjalankan perintah desc extended mc_oss_csv_external1; untuk melihat skema tabel eksternal OSS yang dibuat.Kueri tabel eksternal non-partisi.
SELECT * FROM mc_oss_csv_external1;Hasil berikut dikembalikan:
+------------+------------+------------+------------+------------------+-------------------+----------------+------------+ | vehicleid | recordid | patientid | calls | locationlatitute | locationlongitude | recordtime | direction | +------------+------------+------------+------------+------------------+-------------------+----------------+------------+ | 1 | 1 | 51 | 1 | 46.81006 | -92.08174 | 9/14/2014 0:00 | S | | 1 | 2 | 13 | 1 | 46.81006 | -92.08174 | 9/14/2014 0:00 | NE | | 1 | 3 | 48 | 1 | 46.81006 | -92.08174 | 9/14/2014 0:00 | NE | | 1 | 4 | 30 | 1 | 46.81006 | -92.08174 | 9/14/2014 0:00 | W | | 1 | 5 | 47 | 1 | 46.81006 | -92.08174 | 9/14/2014 0:00 | S | | 1 | 6 | 9 | 1 | 46.81006 | -92.08174 | 9/15/2014 0:00 | S | | 1 | 7 | 53 | 1 | 46.81006 | -92.08174 | 9/15/2014 0:00 | N | | 1 | 8 | 63 | 1 | 46.81006 | -92.08174 | 9/15/2014 0:00 | SW | | 1 | 9 | 4 | 1 | 46.81006 | -92.08174 | 9/15/2014 0:00 | NE | | 1 | 10 | 31 | 1 | 46.81006 | -92.08174 | 9/15/2014 0:00 | N | +------------+------------+------------+------------+------------------+-------------------+------------+----------------+Tulis data ke tabel eksternal non-partisi dan periksa apakah data telah ditulis.
INSERT INTO mc_oss_csv_external1 VALUES(1,12,76,1,46.81006,-92.08174,'9/14/2014 0:10','SW'); SELECT * FROM mc_oss_csv_external1 WHERE recordId=12;Hasil berikut dikembalikan:
+------------+------------+------------+------------+------------------+-------------------+----------------+------------+ | vehicleid | recordid | patientid | calls | locationlatitute | locationlongitude | recordtime | direction | +------------+------------+------------+------------+------------------+-------------------+----------------+------------+ | 1 | 12 | 76 | 1 | 46.81006 | -92.08174 | 9/14/2014 0:10 | SW | +------------+------------+------------+------------+------------------+-------------------+----------------+------------+File baru dihasilkan di path
Demo1/di OSS.
Contoh 2: Tabel partisi
Petakan tabel ke folder
Demo2/di data sampel. Kode contoh berikut menunjukkan cara membuat tabel eksternal OSS dan mengimpor data partisi.CREATE EXTERNAL TABLE IF NOT EXISTS mc_oss_csv_external2 ( vehicleId INT, recordId INT, patientId INT, calls INT, locationLatitute DOUBLE, locationLongitude DOUBLE, recordTime STRING ) PARTITIONED BY ( direction STRING ) STORED BY 'com.aliyun.odps.CsvStorageHandler' WITH serdeproperties ( 'odps.properties.rolearn'='acs:ram::<uid>:role/aliyunodpsdefaultrole' ) LOCATION 'oss://oss-cn-hangzhou-internal.aliyuncs.com/oss-mc-test/Demo2/'; -- Anda dapat menjalankan perintah DESC EXTENDED mc_oss_csv_external2; untuk melihat skema tabel eksternal yang dibuat.Impor data partisi. Jika tabel eksternal OSS yang Anda buat adalah tabel partisi, Anda juga harus mengimpor data partisi. Untuk informasi lebih lanjut, lihat Sintaks untuk menambahkan data partisi ke tabel eksternal OSS.
MSCK REPAIR TABLE mc_oss_csv_external2 ADD PARTITIONS; --Ini setara dengan pernyataan berikut. ALTER TABLE mc_oss_csv_external2 ADD PARTITION (direction = 'N') PARTITION (direction = 'NE') PARTITION (direction = 'S') PARTITION (direction = 'SW') PARTITION (direction = 'W');Kueri tabel eksternal partisi.
SELECT * FROM mc_oss_csv_external2 WHERE direction='NE';Hasil berikut dikembalikan:
+------------+------------+------------+------------+------------------+-------------------+----------------+------------+ | vehicleid | recordid | patientid | calls | locationlatitute | locationlongitude | recordtime | direction | +------------+------------+------------+------------+------------------+-------------------+----------------+------------+ | 1 | 2 | 13 | 1 | 46.81006 | -92.08174 | 9/14/2014 0:00 | NE | | 1 | 3 | 48 | 1 | 46.81006 | -92.08174 | 9/14/2014 0:00 | NE | | 1 | 9 | 4 | 1 | 46.81006 | -92.08174 | 9/15/2014 0:00 | NE | +------------+------------+------------+------------+------------------+-------------------+----------------+------------+Tulis data ke tabel eksternal partisi dan periksa apakah data telah ditulis.
INSERT INTO mc_oss_csv_external2 PARTITION(direction='NE') VALUES(1,12,76,1,46.81006,-92.08174,'9/14/2014 0:10'); SELECT * FROM mc_oss_csv_external2 WHERE direction='NE' AND recordId=12;Hasil berikut dikembalikan:
+------------+------------+------------+------------+------------------+-------------------+----------------+------------+ | vehicleid | recordid | patientid | calls | locationlatitute | locationlongitude | recordtime | direction | +------------+------------+------------+------------+------------------+-------------------+----------------+------------+ | 1 | 12 | 76 | 1 | 46.81006 | -92.08174 | 9/14/2014 0:10 | NE | +------------+------------+------------+------------+------------------+-------------------+----------------+------------+File baru dihasilkan di path
Demo2/direction=NEdi OSS.
Contoh 3: Data terkompresi
Contoh ini menunjukkan cara membuat tabel eksternal CSV terkompresi GZIP dan melakukan operasi baca dan tulis.
Buat tabel internal dan tulis data uji ke dalamnya.
CREATE TABLE vehicle_test( vehicleid INT, recordid INT, patientid INT, calls INT, locationlatitute DOUBLE, locationLongitude DOUBLE, recordtime STRING, direction STRING ); INSERT INTO vehicle_test VALUES (1,1,51,1,46.81006,-92.08174,'9/14/2014 0:00','S');Buat tabel eksternal CSV terkompresi GZIP dan petakan ke folder
Demo3/(data terkompresi) di data sampel. Pernyataan contoh berikut digunakan untuk membuat tabel eksternal OSS:CREATE EXTERNAL TABLE IF NOT EXISTS mc_oss_csv_external3 ( vehicleId INT, recordId INT, patientId INT, calls INT, locationLatitute DOUBLE, locationLongitude DOUBLE, recordTime STRING, direction STRING ) PARTITIONED BY (dt STRING) STORED BY 'com.aliyun.odps.CsvStorageHandler' WITH serdeproperties ( 'odps.properties.rolearn'='acs:ram::<uid>:role/aliyunodpsdefaultrole', 'odps.text.option.gzip.input.enabled'='true', 'odps.text.option.gzip.output.enabled'='true' ) LOCATION 'oss://oss-cn-hangzhou-internal.aliyuncs.com/oss-mc-test/Demo3/'; -- Impor data partisi. MSCK REPAIR TABLE mc_oss_csv_external3 ADD PARTITIONS; -- Anda dapat menjalankan perintah DESC EXTENDED mc_oss_csv_external3; untuk melihat skema tabel eksternal yang dibuat.Gunakan klien MaxCompute untuk membaca data dari OSS. Berikut adalah perintah contoh:
CatatanJika data terkompresi di OSS dalam format data open source, Anda harus menambahkan perintah
set odps.sql.hive.compatible=true;sebelum pernyataan SQL dan mengirimkannya bersama-sama.--Aktifkan pemindaian tabel penuh. Pengaturan ini hanya berlaku untuk sesi saat ini. SET odps.sql.allow.fullscan=true; SELECT recordId, patientId, direction FROM mc_oss_csv_external3 WHERE patientId > 25;Hasil berikut dikembalikan:
+------------+------------+------------+ | recordid | patientid | direction | +------------+------------+------------+ | 1 | 51 | S | | 3 | 48 | NE | | 4 | 30 | W | | 5 | 47 | S | | 7 | 53 | N | | 8 | 63 | SW | | 10 | 31 | N | +------------+------------+------------+Baca data dari tabel internal dan tulis ke tabel eksternal OSS.
Anda dapat menjalankan perintah
INSERT OVERWRITEatauINSERT INTOpada tabel eksternal menggunakan klien MaxCompute untuk menulis data ke OSS.INSERT INTO TABLE mc_oss_csv_external3 PARTITION (dt='20250418') SELECT * FROM vehicle_test;Setelah perintah berhasil dieksekusi, Anda dapat melihat file yang diekspor di folder OSS.
Buat tabel eksternal OSS dan tentukan baris pertama file OSS yang sesuai sebagai header
Buat folder Demo11 di bucket oss-mc-test dari data sampel dan jalankan pernyataan berikut:
--Buat tabel eksternal.
CREATE EXTERNAL TABLE mf_oss_wtt
(
id BIGINT,
name STRING,
tran_amt DOUBLE
)
STORED BY 'com.aliyun.odps.CsvStorageHandler'
WITH serdeproperties (
'odps.text.option.header.lines.count' = '1',
'odps.sql.text.option.flush.header' = 'true'
)
LOCATION 'oss://oss-cn-hangzhou-internal.aliyuncs.com/oss-mc-test/Demo11/';
--Masukkan data.
INSERT OVERWRITE TABLE mf_oss_wtt VALUES (1, 'val1', 1.1),(2, 'value2', 1.3);
--Kueri data.
--Saat membuat tabel, Anda dapat mendefinisikan semua bidang sebagai STRING. Jika tidak, kesalahan terjadi saat header dibaca.
--Atau, tambahkan parameter 'odps.text.option.header.lines.count' = '1' saat membuat tabel untuk melewati header.
SELECT * FROM mf_oss_wtt;Hasil berikut dikembalikan:
+----------+--------+------------+
| id | name | tran_amt |
+----------+--------+------------+
| 1 | val1 | 1.1 |
| 2 | value2 | 1.3 |
+----------+--------+------------+Buat tabel eksternal OSS dengan jumlah kolom yang tidak cocok
Buat folder
demodi bucketoss-mc-testdari data sampel dan unggah filetest.csv. Filetest.csvberisi konten berikut.1,kyle1,this is desc1 2,kyle2,this is desc2,this is two 3,kyle3,this is desc3,this is three, I have 4 columnsBuat tabel eksternal.
Atur perilaku untuk baris dengan jumlah kolom yang tidak cocok ke
TRUNCATE.--Hapus tabel. DROP TABLE test_mismatch; --Buat tabel eksternal baru. CREATE EXTERNAL TABLE IF NOT EXISTS test_mismatch ( id string, name string, dect string, col4 string ) STORED BY 'com.aliyun.odps.CsvStorageHandler' WITH serdeproperties ('odps.sql.text.schema.mismatch.mode' = 'truncate') LOCATION 'oss://oss-cn-hangzhou-internal.aliyuncs.com/oss-mc-test/demo/';Atur perilaku untuk baris dengan jumlah kolom yang tidak cocok ke
IGNORE.--Hapus tabel. DROP TABLE test_mismatch01; --Buat tabel eksternal baru. CREATE EXTERNAL TABLE IF NOT EXISTS test_mismatch01 ( id STRING, name STRING, dect STRING, col4 STRING ) STORED BY 'com.aliyun.odps.CsvStorageHandler' WITH serdeproperties ('odps.sql.text.schema.mismatch.mode' = 'ignore') LOCATION 'oss://oss-cn-hangzhou-internal.aliyuncs.com/oss-mc-test/demo/';Kueri data tabel.
Kueri tabel test_mismatch.
SELECT * FROM test_mismatch; --Hasil +----+-------+---------------+---------------+ | id | name | dect | col4 | +----+-------+---------------+---------------+ | 1 | kyle1 | this is desc1 | NULL | | 2 | kyle2 | this is desc2 | this is two | | 3 | kyle3 | this is desc3 | this is three | +----+-------+---------------+---------------+Kueri tabel test_mismatch01.
SELECT * FROM test_mismatch01; --Hasil +----+-------+----------------+-------------+ | id | name | dect | col4 | +----+-------+----------------+-------------+ | 2 | kyle2 | this is desc2 | this is two +----+-------+----------------+-------------+
Buat tabel eksternal OSS menggunakan parser open source bawaan
Contoh ini menunjukkan cara membuat tabel eksternal OSS menggunakan parser open source bawaan untuk membaca file yang dipisahkan koma dan mengabaikan baris pertama dan terakhir data.
Buat folder
demo-testdi bucketoss-mc-testdari data sampel dan unggah file uji test.csv.File uji berisi data berikut.
1,1,51,1,46.81006,-92.08174,9/14/2014 0:00,S 1,2,13,1,46.81006,-92.08174,9/14/2014 0:00,NE 1,3,48,1,46.81006,-92.08174,9/14/2014 0:00,NE 1,4,30,1,46.81006,-92.08174,9/14/2014 0:00,W 1,5,47,1,46.81006,-92.08174,9/14/2014 0:00,S 1,6,9,1,46.81006,-92.08174,9/15/2014 0:00,S 1,7,53,1,46.81006,-92.08174,9/15/2014 0:00,N 1,8,63,1,46.81006,-92.08174,9/15/2014 0:00,SW 1,9,4,1,46.81006,-92.08174,9/15/2014 0:00,NE 1,10,31,1,46.81006,-92.08174,9/15/2014 0:00,NBuat tabel eksternal, tentukan pemisah sebagai koma, dan atur parameter untuk mengabaikan baris pertama dan terakhir.
CREATE EXTERNAL TABLE ext_csv_test08 ( vehicleId INT, recordId INT, patientId INT, calls INT, locationLatitute DOUBLE, locationLongitude DOUBLE, recordTime STRING, direction STRING ) ROW FORMAT serde 'org.apache.hadoop.hive.serde2.OpenCSVSerde' WITH serdeproperties ( "separatorChar" = "," ) stored AS textfile location 'oss://oss-cn-hangzhou-internal.aliyuncs.com/***/' -- Atur parameter untuk mengabaikan baris pertama dan terakhir. TBLPROPERTIES ( "skip.header.line.COUNT"="1", "skip.footer.line.COUNT"="1" ) ;Baca tabel eksternal.
SELECT * FROM ext_csv_test08; -- Hasil menunjukkan bahwa hanya 8 baris yang dibaca, mengabaikan baris pertama dan terakhir. +------------+------------+------------+------------+------------------+-------------------+------------+------------+ | vehicleid | recordid | patientid | calls | locationlatitute | locationlongitude | recordtime | direction | +------------+------------+------------+------------+------------------+-------------------+------------+------------+ | 1 | 1 | 51 | 1 | 46.81006 | -92.08174 | 9/14/2014 0:00 | S | | 1 | 2 | 13 | 1 | 46.81006 | -92.08174 | 9/14/2014 0:00 | NE | | 1 | 3 | 48 | 1 | 46.81006 | -92.08174 | 9/14/2014 0:00 | NE | | 1 | 4 | 30 | 1 | 46.81006 | -92.08174 | 9/14/2014 0:00 | W | | 1 | 5 | 47 | 1 | 46.81006 | -92.08174 | 9/14/2014 0:00 | S | | 1 | 6 | 9 | 1 | 46.81006 | -92.08174 | 9/15/2014 0:00 | S | | 1 | 7 | 53 | 1 | 46.81006 | -92.08174 | 9/15/2014 0:00 | N | | 1 | 8 | 63 | 1 | 46.81006 | -92.08174 | 9/15/2014 0:00 | SW | | 1 | 9 | 4 | 1 | 46.81006 | -92.08174 | 9/15/2014 0:00 | NE | | 1 | 10 | 31 | 1 | 46.81006 | -92.08174 | 9/15/2014 0:00 | N | +------------+------------+------------+------------+------------------+-------------------+------------+------------+
Buat tabel eksternal OSS berformat CSV dengan tipe data tanggal dan waktu kustom
Untuk informasi lebih lanjut tentang format penguraian dan keluaran kustom untuk tipe waktu CSV, lihat Penguraian tipe yang lebih fleksibel dengan Smart Parse.
Buat tabel eksternal CSV untuk berbagai tipe data waktu (datetime, timestamp, dan timestamp_ntz).
CREATE EXTERNAL TABLE test_csv ( col_date DATE, col_datetime DATETIME, col_timestamp TIMESTAMP, col_timestamp_ntz TIMESTAMP_NTZ ) STORED BY 'com.aliyun.odps.CsvStorageHandler' LOCATION 'oss://oss-cn-hangzhou-internal.aliyuncs.com/oss-mc-test/demo/' TBLPROPERTIES ( 'odps.text.option.date.io.format' = 'MM/dd/yyyy', 'odps.text.option.datetime.io.format' = 'yyyy-MM-dd-HH-mm-ss x', 'odps.text.option.timestamp.io.format' = 'yyyy-MM-dd HH-mm-ss VV', 'odps.text.option.timestamp_ntz.io.format' = 'yyyy-MM-dd HH:mm:ss.SS' ); INSERT OVERWRITE test_csv VALUES(DATE'2025-02-21', DATETIME'2025-02-21 08:30:00', TIMESTAMP'2025-02-21 12:30:00', TIMESTAMP_NTZ'2025-02-21 16:30:00.123456789');Setelah Anda memasukkan data, konten file CSV adalah:
02/21/2025,2025-02-21-08-30-00 +08,2025-02-21 12-30-00 Asia/Shanghai,2025-02-21 16:30:00.12Baca data lagi untuk melihat hasilnya.
SELECT * FROM test_csv;Hasil berikut dikembalikan:
+------------+---------------------+---------------------+------------------------+ | col_date | col_datetime | col_timestamp | col_timestamp_ntz | +------------+---------------------+---------------------+------------------------+ | 2025-02-21 | 2025-02-21 08:30:00 | 2025-02-21 12:30:00 | 2025-02-21 16:30:00.12 | +------------+---------------------+---------------------+------------------------+