All Products
Search
Document Center

MaxCompute:Tabel eksternal CSV dan TSV

Last Updated:Sep 18, 2026

Pelajari cara membuat, membaca, dan menulis tabel eksternal untuk data CSV dan TSV yang disimpan di Object Storage Service (OSS).

Catatan penggunaan

  • Tabel eksternal OSS tidak mendukung properti cluster.

  • Ukuran satu file tidak boleh melebihi 2 GB. Anda harus membagi file yang berukuran lebih dari 2 GB.

  • MaxCompute dan OSS harus berada di wilayah yang sama.

Tipe data yang didukung

Untuk informasi lebih lanjut tentang tipe data MaxCompute, lihat Versi Tipe Data 1.0 dan Versi Tipe Data 2.0.

Untuk informasi lebih lanjut tentang SmartParse, lihat Kompatibilitas Tipe Fleksibel Smart Parse.

Type

com.aliyun.odps.CsvStorageHandler/

TsvStorageHandler

(Built-in)

org.apache.hadoop.hive.serde2.OpenCSVSerde

(Open-source)

TINYINT

Supported

Supported

SMALLINT

Supported

Supported

INT

Supported

Supported

BIGINT

Supported

Supported

BINARY

Not supported

Not supported

FLOAT

Supported

Supported

DOUBLE

Supported

Supported

DECIMAL(precision,scale)

Supported

Supported

VARCHAR(n)

Supported

Supported

CHAR(n)

Supported

Supported

STRING

Supported

Supported

DATE

Supported

Supported

DATETIME

Supported

Supported

TIMESTAMP

Supported

Supported

TIMESTAMP_NTZ

Supported

Not supported

BOOLEAN

Supported

Supported

ARRAY

Not supported

Not supported

MAP

Not supported

Not supported

STRUCT

Not supported

Not supported

JSON

Not supported

Not supported

Format kompresi yang didukung

Saat membaca atau menulis file OSS terkompresi, Anda harus menyertakan atribut with serdeproperties dalam pernyataan CREATE TABLE. Untuk informasi lebih lanjut, lihat Parameter Atribut with serdeproperties.

Format kompresi

com.aliyun.odps.CsvStorageHandler/

TsvStorageHandler

(Built-in)

org.apache.hadoop.hive.serde2.OpenCSVSerde

(Open-source)

GZIP

Supported

Supported

SNAPPY

Not supported

Supported

LZO

Not supported

Supported

ZSTD

Supported

Supported

Evolusi skema yang didukung

Operasi

Didukung

Deskripsi

Add column

Supported

  • Menambahkan kolom dengan nilai default tidak didukung.

  • Menambahkan kolom dengan tipe data kompleks atau bersarang tidak didukung.

Drop column

Supported

Operasi ini tidak disarankan karena dapat menyebabkan ketidaksesuaian antara skema dan data.

Change column order

Supported

Operasi ini tidak disarankan karena dapat menyebabkan ketidaksesuaian antara skema dan data.

Change column data type

Supported

Untuk daftar konversi tipe data yang didukung, lihat Ubah Tipe Data Kolom.

Rename column

Supported

Modify column comment

Supported

Komentar harus berupa string valid dengan panjang maksimum 1.024 byte. Jika tidak, terjadi error.

Change column nullability

Not supported

Operasi ini tidak didukung. Kolom bersifat nullable secara default.

Konfigurasi Parameter

Skema tabel eksternal CSV atau TSV dipetakan ke kolom file berdasarkan posisi. Jika jumlah kolom dalam file OSS tidak sesuai dengan jumlah kolom dalam skema tabel eksternal, Anda dapat menggunakan parameter odps.sql.text.schema.mismatch.mode untuk menentukan cara menangani baris yang tidak sesuai.

  • Jika odps.sql.text.schema.mismatch.mode diatur ke truncate, modifikasi kolom memiliki efek berikut:

    • Data yang sesuai dengan skema baru dapat dibaca seperti yang diharapkan.

    • Data lama yang menggunakan skema lama dibaca berdasarkan skema baru.

      Misalnya, jika Anda menambahkan kolom ke tabel, data historis untuk kolom tersebut muncul sebagai NULL saat Anda membaca tabel.

  • Jika odps.sql.text.schema.mismatch.mode diatur ke ignore, modifikasi kolom memiliki efek berikut:

    • Data yang sesuai dengan skema baru dapat dibaca seperti yang diharapkan.

    • Data lama yang menggunakan skema lama dibaca berdasarkan skema baru.

      Misalnya, jika Anda menambahkan kolom ke tabel, seluruh baris data historis yang tidak memiliki kolom baru akan dibuang saat Anda membaca tabel.

  • Jika odps.sql.text.schema.mismatch.mode diatur ke error, modifikasi kolom memiliki efek berikut:

    • Data yang sesuai dengan skema baru dapat dibaca seperti yang diharapkan.

    • Data lama yang menggunakan skema lama dibaca berdasarkan skema baru.

      Misalnya, jika Anda menambahkan kolom ke tabel, terjadi error saat Anda mencoba membaca data historis yang tidak memiliki kolom baru.

Deskripsi izin

  • Saat mengakses tabel eksternal OSS, data diakses melalui role yang ditentukan dalam parameter odps.properties.rolearn, baik Anda menggunakan Akun Alibaba Cloud, Pengguna RAM, maupun Peran RAM. Oleh karena itu, Anda harus membuat Peran RAM dan memberikan izin akses ke bucket OSS target, lalu mengonfigurasi ARN role tersebut dalam parameter odps.properties.rolearn. Untuk informasi lebih lanjut, lihat Parameter.

  • Anda dapat mengizinkan akses akun yang sama atau akses lintas akun sesuai kebutuhan bisnis Anda. Kami merekomendasikan penggunaan kebijakan otorisasi kustom untuk kontrol akses detail halus. Untuk informasi lebih lanjut, lihat Otorisasi untuk Sumber Data Eksternal.

Buat tabel eksternal

Sintaksis

Parser 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 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 Sintaksis Dasar.

Parameter khusus format

Parameter WITH SERDEPROPERTIES

Parser yang berlaku

Parameter

Kasus penggunaan

Deskripsi

Nilai

Default

Parser data teks bawaan (CsvStorageHandler/TsvStorageHandler)

odps.text.option.gzip.input.enabled

Gunakan properti ini untuk membaca file CSV atau TSV yang dikompresi dalam format GZIP.

Properti kompresi CSV dan TSV. Atur properti ini ke True agar MaxCompute dapat membaca file terkompresi GZIP. Jika tidak, operasi baca gagal.

  • True

  • False

False

odps.text.option.gzip.output.enabled

Gunakan properti ini untuk menulis data ke OSS dalam format terkompresi GZIP.

Properti kompresi CSV dan TSV. Atur properti ini ke True untuk mengompresi data saat menulis ke OSS. Jika tidak, data ditulis tanpa kompresi.

  • True

  • False

False

odps.text.option.header.lines.count

Gunakan properti ini untuk melewati N baris pertama file CSV atau TSV di OSS.

Menentukan jumlah baris header yang dilewati dari awal file saat membaca data.

Bilangan bulat non-negatif

0

odps.text.option.null.indicator

Gunakan properti ini untuk menentukan string kustom yang merepresentasikan nilai NULL dalam data.

MaxCompute mengurai string yang ditentukan sebagai nilai NULL.

Misalnya, untuk menginterpretasikan \N dalam file sebagai NULL, atur properti ini ke \\N, di mana \ pertama adalah karakter escape. Dengan pengaturan ini, a,\N,b diurai sebagai a, NULL, b.

string

empty string

odps.text.option.ignore.empty.lines

Gunakan properti ini untuk menentukan cara menangani baris kosong dalam file CSV atau TSV.

Jika True, MaxCompute mengabaikan baris kosong dalam file data. Jika False, MaxCompute membacanya.

  • True

  • False

True

odps.text.option.encoding

Gunakan properti ini saat file data tidak menggunakan encoding UTF-8 default.

Encoding yang ditentukan di sini harus sesuai dengan encoding aktual file. Ketidaksesuaian menyebabkan kegagalan pembacaan.

  • UTF-8

  • UTF-16

  • US-ASCII

  • GBK

UTF-8

odps.text.option.delimiter

Gunakan properti ini untuk menentukan pemisah kolom untuk file CSV atau TSV.

Pastikan pemisah yang ditentukan benar-benar memisahkan kolom dalam file data Anda untuk mencegah ketidaksesuaian data.

Karakter tunggal

Comma (,)

odps.text.option.use.quote

Gunakan properti ini saat bidang dalam file CSV atau TSV berisi line break (CRLF), tanda kutip ganda, atau pemisah kolom.

Saat bidang dalam file CSV berisi newline, tanda kutip ganda (Anda harus menambahkan " lain sebelum " untuk meng-escape-nya), atau koma, seluruh bidang harus diapit oleh tanda kutip ganda ("") sebagai pemisah kolom. Parameter ini menentukan apakah akan mengenali pemisah kolom CSV ".

  • True

  • False

False

odps.sql.text.option.flush.header

Gunakan properti ini untuk menulis header tabel sebagai baris pertama ke setiap blok file di OSS.

Properti ini hanya berlaku untuk file CSV.

  • True

  • False

False

odps.sql.text.schema.mismatch.mode

Gunakan properti ini saat baris dalam file data memiliki jumlah kolom yang berbeda dengan skema tabel eksternal.

Menentukan cara menangani baris dengan jumlah kolom yang tidak sesuai dengan skema tabel.

Catatan: Fitur ini tidak berfungsi jika odps.text.option.use.quote diatur ke True.

  • error: Melaporkan error dan menghentikan kueri.

  • truncate: Jika baris memiliki lebih banyak kolom daripada skema, MaxCompute membuang kolom tambahan. Jika memiliki lebih sedikit kolom, MaxCompute mengisi kolom yang hilang dengan null.

  • ignore: Membuang seluruh baris yang tidak sesuai.

error

odps.text.option.zstd.input.enabled

Gunakan properti ini untuk membaca file CSV atau TSV yang dikompresi dalam format ZSTD.

Properti kompresi CSV dan TSV. Atur properti ini ke True agar MaxCompute dapat membaca file terkompresi ZSTD. Jika tidak, operasi baca gagal.

  • True

  • False

False

odps.text.option.zstd.output.enabled

Gunakan properti ini untuk menulis data ke OSS dalam format terkompresi ZSTD.

Properti kompresi CSV dan TSV. Atur properti ini ke True untuk mengompresi data dalam format ZSTD saat menulis ke OSS. Jika tidak, data ditulis tanpa kompresi.

  • True

  • False

False

odps.text.option.snappy.input.enabled

Tambahkan properti ini saat Anda perlu membaca file CSV atau TSV yang dikompresi dengan SNAPPY

(SnappyRawCodec).

Properti kompresi CSV dan TSV. MaxCompute hanya dapat membaca file terkompresi saat parameter ini diatur ke True. Jika tidak, operasi baca gagal.

  • True

  • False

False

odps.text.option.snappy.output.enabled

Tambahkan properti ini saat Anda perlu menulis data ke

OSS yang dikompresi dengan SNAPPY (SnappyRawCodec).

Properti kompresi CSV dan TSV. Saat parameter ini diatur ke True, MaxCompute menulis data ke OSS dalam kompresi SNAPPY. Jika tidak, data ditulis tanpa kompresi.

  • True

  • False

False

Parser data open-source bawaan (OpenCSVSerde)

separatorChar

Gunakan properti ini untuk menentukan pemisah kolom untuk data CSV yang disimpan sebagai TEXTFILE.

Menentukan pemisah kolom.

Karakter tunggal

Comma (,)

quoteChar

Gunakan properti ini saat bidang dalam data CSV berisi karakter khusus seperti pemisah atau line break.

Menentukan karakter yang digunakan untuk mengapit bidang.

Karakter tunggal

None

escapeChar

Gunakan properti ini untuk menentukan karakter escape untuk data CSV yang disimpan sebagai TEXTFILE.

Menentukan karakter yang digunakan untuk meng-escape karakter khusus dalam bidang.

Karakter tunggal

None

Parameter tblproperties

Parser yang berlaku

Parameter

Kasus penggunaan

Deskripsi

Nilai

Default

Parser data open-source bawaan (OpenCSVSerde)

skip.header.line.count

Gunakan properti ini untuk melewati N baris pertama file CSV yang disimpan sebagai TEXTFILE.

Menentukan jumlah baris header yang dilewati dari awal file saat membaca data.

Bilangan bulat non-negatif

None

skip.footer.line.count

Gunakan properti ini untuk melewati N baris terakhir file CSV yang disimpan sebagai TEXTFILE.

Menentukan jumlah baris footer yang dilewati dari akhir file saat membaca data.

Bilangan bulat non-negatif

None

mcfed.mapreduce.output.fileoutputformat.compress

Gunakan properti ini untuk menulis data TEXTFILE ke OSS dengan kompresi.

Properti kompresi TEXTFILE. Jika diatur ke True, MaxCompute mengompresi data saat menulis. Jika tidak, data ditulis tanpa kompresi.

  • True

  • False

False

mcfed.mapreduce.output.fileoutputformat.compress.codec

Gunakan properti ini untuk menentukan codec kompresi saat menulis data TEXTFILE terkompresi ke OSS.

Saat membaca file CSV/TSV terkompresi yang nama filenya mengandung ekstensi .bz2, .deflate, .snappy, .gz, atau .zstd, tidak diperlukan konfigurasi tambahan.

Properti kompresi TEXTFILE. Mengatur metode kompresi untuk file data TEXTFILE.

  • com.hadoop.compression.lzo.LzoCodec

  • com.hadoop.compression.lzo.LzopCodec

  • org.apache.hadoop.io.compress.SnappyCodec

  • com.aliyun.odps.io.compress.SnappyRawCodec

  • org.apache.hadoop.io.compress.odps.ZstandardCodec

  • org.apache.hadoop.io.compress.GzipCodec

  • org.apache.hadoop.io.compress.BZip2Codec

  • org.apache.hadoop.io.compress.DeflateCodec

None

odps.text.option.bad.row.skipping

Gunakan properti ini untuk melewati data kotor dalam file CSV yang disimpan di OSS.

Mengontrol apakah MaxCompute melewati baris yang dianggap data kotor atau melaporkan error.

  • rigid: Memberlakukan pelewatkan baris. Pengaturan ini tidak dapat di-override pada tingkat sesi atau proyek.

  • flexible: Mengaktifkan pelewatkan baris fleksibel. Anda dapat meng-override pengaturan ini dengan konfigurasi tingkat sesi atau proyek.

None

Daftar putih dan daftar hitam

Tabel eksternal OSS MaxCompute mendukung penyaringan daftar putih dan daftar hitam. Dengan mengatur parameter daftar putih dan daftar hitam dalam tblproperties, Anda dapat menyaring file mana yang akan dibaca dari direktori. Untuk detailnya, lihat Daftar Putih dan Daftar Hitam.

Menulis data

Untuk detail tentang sintaksis penulisan di MaxCompute, lihat Sintaksis Penulisan.

Kueri dan analisis

BadRowSkipping

Fitur BadRowSkipping memungkinkan Anda melewati baris buruk dalam data CSV yang seharusnya menyebabkan kueri gagal. Pengaturan ini mengontrol penanganan error dan tidak memengaruhi cara format data dasar diurai.

Parameter

  • Parameter tingkat tabel: odps.text.option.bad.row.skipping

    • rigid: Memaksa pelewatkan. Pengaturan ini tidak dapat di-override oleh konfigurasi tingkat sesi atau proyek.

    • flexible: Mengaktifkan pelewatkan. Pengaturan ini fleksibel, memungkinkannya di-override oleh konfigurasi tingkat sesi atau proyek.

  • Parameter tingkat sesi/proyek

    • Parameter odps.sql.unstructured.text.bad.row.skipping dapat meng-override parameter tingkat tabel flexible, tetapi tidak dapat meng-override yang rigid.

      • on: Mengaktifkan fitur. Jika fitur tidak dikonfigurasi untuk tabel, fitur diaktifkan secara default.

      • off: Menonaktifkan fitur. Jika tabel dikonfigurasi sebagai flexible, fitur dinonaktifkan. Jika tidak, pengaturan parameter tabel yang digunakan.

      • <null> atau input tidak valid: Konfigurasi tingkat tabel yang digunakan.

    • odps.sql.unstructured.text.bad.row.skipping.debug.num: Menentukan jumlah hasil error yang dicetak ke stdout di Logview.

      • Nilai maksimum adalah 1000.

      • Jika nilainya <=0, fitur ini dinonaktifkan.

      • Jika nilainya tidak valid, fitur ini dinonaktifkan.

  • Interaksi antara parameter tingkat sesi dan properti tabel

    properti tbl

    flag sesi

    hasil

    rigid

    on

    On, Dipaksa aktif

    off

    <null>, nilai tidak valid, atau parameter tidak dikonfigurasi

    flexible

    on

    On

    off

    Off, Dinonaktifkan oleh sesi

    <null>, nilai tidak valid, atau parameter tidak dikonfigurasi

    On

    Not configured

    on

    On, Diaktifkan oleh sesi

    off

    Off

    <null>, nilai tidak valid, atau parameter tidak dikonfigurasi

Contoh

  1. Siapkan data

    Unggah file data uji csv_bad_row_skipping.csv, yang berisi baris buruk, ke direktori di OSS, seperti oss-mc-test/badrow/.

  2. Buat tabel eksternal CSV

    Contoh berikut menunjukkan tiga skenario berdasarkan kombinasi berbeda parameter tingkat tabel dan tingkat sesi.

    • Parameter tabel: odps.text.option.bad.row.skipping = flexible | rigid | <not set>

    • Flag sesi: odps.sql.unstructured.text.bad.row.skipping = on | off | <not set>

    Parameter tidak diatur

    -- Tidak ada parameter tingkat tabel yang diatur. Kueri akan gagal pada baris buruk kecuali di-override oleh flag tingkat sesi.
    CREATE EXTERNAL TABLE test_csv_bad_data_skipping_flag
    (
      a INT,
      b INT
    )
    STORED BY 'com.aliyun.odps.CsvStorageHandler' 
    WITH serdeproperties (
      'odps.properties.rolearn'='acs:ram::<uid>:role/aliyunodpsdefaultrole'
    )
    location '<oss://<your-bucket-name>/<your-file-path>/>';

    Pelewatkan fleksibel

    -- Tabel dikonfigurasi untuk melewati baris buruk, tetapi ini dapat dinonaktifkan oleh flag tingkat sesi.
    CREATE EXTERNAL TABLE test_csv_bad_data_skipping_flexible
    (
      a INT,
      b INT
    )
    STORED BY 'com.aliyun.odps.CsvStorageHandler' 
    WITH serdeproperties (
      'odps.properties.rolearn'='acs:ram::<uid>:role/aliyunodpsdefaultrole'
    )
    location '<oss://<your-bucket-name>/<your-file-path>/>'
    tblproperties (
      'odps.text.option.bad.row.skipping' = 'flexible'   -- Mengaktifkan pelewatkan fleksibel, yang dapat dinonaktifkan pada tingkat sesi.
    );

    Pelewatkan kaku

    -- Tabel dikonfigurasi untuk memaksa melewati baris buruk. Ini tidak dapat dinonaktifkan pada tingkat sesi.
    CREATE EXTERNAL TABLE test_csv_bad_data_skipping_rigid
    (
      a INT,
      b INT
    )
    STORED BY 'com.aliyun.odps.CsvStorageHandler' 
    WITH serdeproperties (
      'odps.properties.rolearn'='acs:ram::<uid>:role/aliyunodpsdefaultrole'
    )
    location '<oss://<your-bucket-name>/<your-file-path>/>'
    tblproperties (
      'odps.text.option.bad.row.skipping' = 'rigid'  -- Memaksa pelewatkan aktif.
    );
  3. Verifikasi hasil kueri

    Parameter tidak diatur

    -- Perintah berikut mengaktifkan pelewatkan, tetapi segera di-override oleh perintah berikutnya dalam contoh ini.
    SET odps.sql.unstructured.text.bad.row.skipping=on;
    
    -- Perintah ini menonaktifkan pelewatkan dan merupakan pengaturan aktif untuk kueri SELECT di bawah, menyebabkannya gagal.
    SET odps.sql.unstructured.text.bad.row.skipping=off;
    
    -- Anda dapat menggunakan perintah ini untuk mencetak detail baris yang dilewati saat pelewatkan diaktifkan. Tidak berpengaruh di sini karena kueri gagal.
    SET odps.sql.unstructured.text.bad.row.skipping.debug.num=10;
    
    SELECT * FROM test_csv_bad_data_skipping_flag;

    Kueri gagal dengan error berikut: FAILED: ODPS-0123131:User defined function exception

    Pelewatkan fleksibel

    -- Perintah berikut mengaktifkan pelewatkan, tetapi segera di-override oleh perintah berikutnya dalam contoh ini.
    SET odps.sql.unstructured.text.bad.row.skipping=on;
    
    -- Perintah ini menonaktifkan pelewatkan, meng-override pengaturan 'flexible' tabel. Ini adalah pengaturan aktif untuk kueri SELECT di bawah, menyebabkannya gagal.
    SET odps.sql.unstructured.text.bad.row.skipping=off;
    
    -- Cetak detail hingga 10 baris buruk pada tingkat sesi. Maksimum adalah 1.000. Nilai 0 atau kurang menonaktifkan pencetakan.
    SET odps.sql.unstructured.text.bad.row.skipping.debug.num=10;
    
    SELECT * FROM test_csv_bad_data_skipping_flexible;

    Kueri gagal dengan error berikut: FAILED: ODPS-0123131:User defined function exception

    Pelewatkan kaku

    -- Perintah ini redundan karena pengaturan 'rigid' sudah memberlakukan pelewatkan.
    SET odps.sql.unstructured.text.bad.row.skipping=on;
    
    -- Perintah ini mencoba menonaktifkan pelewatkan, tetapi diabaikan karena pengaturan tabel 'rigid' tidak dapat di-override.
    SET odps.sql.unstructured.text.bad.row.skipping=off;
    
    -- Perintah ini mencetak detail hingga 10 baris buruk yang dilewati oleh pengaturan 'rigid'.
    SET odps.sql.unstructured.text.bad.row.skipping.debug.num=10;
    
    SELECT * FROM test_csv_bad_data_skipping_rigid;

    Hasil berikut dikembalikan:

    +------------+------------+
    | a          | b          | 
    +------------+------------+
    | 1          | 26         | 
    | 5          | 37         | 
    +------------+------------+

Kompatibilitas tipe fleksibel dengan Smart Parse

Untuk tabel eksternal berformat CSV di OSS, MaxCompute SQL menggunakan tipe data 2.0 untuk operasi baca dan tulis. Sebelumnya, hanya nilai dalam format ketat yang didukung. Fitur ini menyediakan kompatibilitas tipe fleksibel untuk membaca berbagai format nilai dari file CSV. Aturan penguraian spesifik dijelaskan di bawah ini.

Type

Input sebagai string

Output sebagai string

Deskripsi

BOOLEAN

  • "true"/"false"

  • "T"/"F"

  • "1"/"0"

  • "Yes"/"No"

  • "Y"/"N"

  • "" (String kosong diurai sebagai NULL.)

Catatan

Operasi trim() akan dilakukan pada input selama penguraian.

  • "true"/"false"

  • "true"/"false"

  • "true"/"false"

  • "true"/"false"

  • "true"/"false"

  • "" (Nilai NULL ditulis sebagai string kosong ke file CSV.)

Penguraian gagal jika string input bukan salah satu nilai yang didukung.

TINYINT

  • "0"

  • "1"

  • "-100"

  • "1,234,567" (notasi pemisah ribuan; koma tidak boleh di awal atau akhir string)

  • "1_234_567" (gaya Java; garis bawah tidak boleh di awal atau akhir string)

  • "0.3e2" (notasi ilmiah; hanya diurai jika nilainya bilangan bulat; jika tidak, terjadi error)

  • "-1e5" (notasi ilmiah)

  • "0xff" (heksadesimal, case-insensitive)

  • "0b1001" (biner, case-insensitive)

  • "4/2" (pecahan; hanya diurai jika nilainya bilangan bulat; jika tidak, terjadi error)

  • "1000%" (persentase; hanya diurai jika nilainya bilangan bulat; jika tidak, terjadi error)

  • "1000‰" (per-mille; hanya diurai jika nilainya bilangan bulat; jika tidak, terjadi error)

  • "1,000 $" (dengan simbol mata uang)

  • "$ 1,000" (dengan simbol mata uang)

  • "3M" (gaya K8s, unit basis-1000)

  • "2Gi" (gaya K8s, unit basis-1024)

  • "" (String kosong diurai sebagai NULL.)

Catatan
  • Selama penguraian, input menjalani operasi trim().

  • Jika Anda menggunakan notasi pemisah ribuan, seperti "1,234,567", Anda harus mengatur pemisah CSV ke karakter selain koma. Untuk informasi lebih lanjut, lihat penggunaan odps.text.option.delimiter di atribut with serdeproperties.

  • Unit basis-1000 gaya K8s yang didukung meliputi K, M, G, P, dan T. Unit basis-1024 meliputi Ki, Mi, Gi, Pi, dan Ti. Untuk informasi lebih lanjut, lihat resource-management.

  • Simbol mata uang yang didukung meliputi $/¥/€/£/₩/USD/CNY/EUR/GBP/JPY/KRW/IDR/RP.

  • String "0", "1", "-100", dan "" juga dapat diurai dengan benar dalam naive mode.

  • "0"

  • "1"

  • "-100"

  • "1234567"

  • "1234567"

  • "30"

  • "-100000"

  • "255"

  • "9"

  • "2"

  • "10"

  • "1"

  • "1000"

  • "1000"

  • "3000000" (1M = 1000*1000)

  • "2147483648" (1 Gi = 1024*1024*1024)

  • "" (Nilai NULL ditulis sebagai string kosong ke file CSV.)

Bilangan bulat 8-bit. Terjadi error jika nilai berada di luar rentang [-128, 127].

SMALLINT

Bilangan bulat 16-bit. Terjadi error jika nilai berada di luar rentang [-32768, 32767].

INT

Bilangan bulat 32-bit. Terjadi error jika nilai berada di luar rentang [-2147483648, 2147483647].

BIGINT

Bilangan bulat 64-bit. Terjadi error jika nilai berada di luar rentang [-9223372036854775807, 9223372036854775807].

Catatan

Nilai -2<sup>63</sup> (-9223372036854775808) berada di luar rentang yang didukung karena keterbatasan mesin SQL.

FLOAT

  • "3.14"

  • "0.314e1" (notasi ilmiah)

  • "2/5" (pecahan)

  • "123.45%" (persentase)

  • "123.45‰" (per-mille)

  • "1,234,567.89" (notasi pemisah ribuan)

  • "1,234.56 $" (dengan simbol mata uang)

  • "$ 1,234.56" (dengan simbol mata uang)

  • "1.2M" (gaya K8s, unit basis-1000)

  • "2Gi" (gaya K8s, unit basis-1024)

  • "NaN" (case-insensitive)

  • "Inf" (case-insensitive)

  • "-Inf" (case-insensitive)

  • "Infinity" (case-insensitive)

  • "-Infinity" (case-insensitive)

  • "" (String kosong diurai sebagai NULL.)

Catatan
  • Input menjalani operasi trim() selama penguraian.

  • String "3.14", "0.314e1", "NaN", "Infinity", "-Infinity", dan "" juga dapat diurai dengan benar dalam naive mode.

  • "3.14"

  • "3.14"

  • "0.4"

  • "1.2345"

  • "0.12345"

  • "1234567.89"

  • "1234.56"

  • "1234.56"

  • "1200000"

  • "2147483648"

  • "NaN"

  • "Infinity"

  • "-Infinity"

  • "Infinity"

  • "-Infinity"

  • "" (Nilai NULL ditulis sebagai string kosong ke file CSV.)

Nilai khusus (case-insensitive) meliputi NaN, Inf, -Inf, Infinity, dan -Infinity. Terjadi error jika nilai di luar rentang. Jika presisi melebihi batas, nilai dibulatkan.

DOUBLE

  • "3.1415926"

  • "0.314e1" (notasi ilmiah)

  • "2/5" (pecahan)

  • "123.45%" (persentase)

  • "123.45‰" (per-mille)

  • "1,234,567.89" (notasi pemisah ribuan)

  • "1,234.56 $" (dengan simbol mata uang)

  • "$ 1,234.56" (dengan simbol mata uang)

  • "1.2M" (gaya K8s, unit basis-1000)

  • "2Gi" (gaya K8s, unit basis-1024)

  • "NaN" (case-insensitive)

  • "Inf" (case-insensitive)

  • "-Inf" (case-insensitive)

  • "Infinity" (case-insensitive)

  • "-Infinity" (case-insensitive)

  • "" (String kosong diurai sebagai NULL.)

Catatan
  • Selama penguraian, operasi trim() dilakukan pada input.

  • String "3.1415926", "0.314e1", "NaN", "Infinity", "-Infinity", dan "" juga dapat diurai dengan benar dalam naive mode.

  • "3.1415926"

  • "3.14"

  • "0.4"

  • "1.2345"

  • "0.12345"

  • "1234567.89"

  • "1234.56"

  • "1234.56"

  • "1200000"

  • "2147483648"

  • "NaN"

  • "Infinity"

  • "-Infinity"

  • "Infinity"

  • "-Infinity"

  • "" (Nilai NULL ditulis sebagai string kosong ke file CSV.)

Nilai khusus (case-insensitive) meliputi NaN, Inf, -Inf, Infinity, dan -Infinity. Terjadi error jika nilai di luar rentang. Jika presisi melebihi batas, nilai dibulatkan.

DECIMAL

(precision, scale)

Contoh: DECIMAL(15,2)

  • "3.358"

  • "2/5" (pecahan)

  • "123.45%" (persentase)

  • "123.45‰" (per-mille)

  • "1,234,567.89" (notasi pemisah ribuan)

  • "1,234.56 $" (dengan simbol mata uang)

  • "$ 1,234.56" (dengan simbol mata uang)

  • "1.2M" (gaya K8s, unit basis-1000)

  • "2Gi" (gaya K8s, unit basis-1024)

  • "" (String kosong diurai sebagai NULL.)

Catatan
  • Selama penguraian, operasi trim() dilakukan pada input.

  • String "3.358" dan "" juga dapat diurai dengan benar dalam naive mode.

  • "3.36" (dibulatkan)

  • "0.4"

  • "1.23" (dibulatkan)

  • "0.12" (dibulatkan)

  • "1234567.89"

  • "1234.56"

  • "1234.56"

  • "1200000"

  • "2147483648"

  • "" (Nilai NULL ditulis sebagai string kosong ke file CSV.)

Terjadi error jika bagian integer berisi lebih dari precision - scale digit. Jika bagian pecahan melebihi skala yang ditentukan, nilai dibulatkan.

Terjadi error. Jika bagian pecahan melebihi skala, nilai dibulatkan dan dipotong.

CHAR(n)

Contoh: CHAR(7)

  • "abcdefg"

  • "abcdefghijklmn"

  • "abc"

  • "" (String kosong diurai sebagai NULL.)

  • "abcdefg"

  • "abcdefg" (Sisa string dipotong.)

  • "abc____" (diisi dengan empat karakter spasi, yang direpresentasikan oleh _)

  • "" (Nilai NULL ditulis sebagai string kosong ke file CSV.)

Panjang maksimum adalah 255. Jika string input lebih pendek dari n, diisi dengan spasi trailing, tetapi spasi ini diabaikan dalam perbandingan. Jika string input lebih panjang dari n, dipotong.

VARCHAR(n)

Contoh: VARCHAR(7)

  • "abcdefg"

  • "abcdefghijklmn"

  • "abc"

  • "" (String kosong diurai sebagai NULL.)

  • "abcdefg"

  • "abcdefg" (Sisa string dipotong.)

  • "abc"

  • "" (Nilai NULL ditulis sebagai string kosong ke file CSV.)

Panjang maksimum adalah 65.535. Jika string input lebih panjang dari n, dipotong.

STRING

  • "abcdefg"

  • "abc"

  • "" (String kosong diurai sebagai NULL.)

  • "abcdefg"

  • "abc"

  • "" (Nilai NULL ditulis sebagai string kosong ke file CSV.)

Panjang maksimum adalah 8 MB.

DATE

  • "yyyy-MM-dd" (misalnya, "2025-02-21")

  • "yyyyMMdd" (misalnya, "20250221")

  • "MMM d,yyyy" (misalnya, "Oct 1,2025")

  • "MMMM d,yyyy" (misalnya, "October 1,2025")

  • "" (String kosong diurai sebagai NULL.)

Catatan

Anda juga dapat mengatur properti odps.text.option.date.io.format untuk mengontrol format penguraian. Misalnya, jika Anda mengatur format ke 'dd/MM/yyyy#yyyy--MM--dd', MaxCompute dapat mengurai string seperti '21/02/2025' dan '2025--02--21'.

  • "2000-01-01"

  • "2000-01-01"

  • "" (Nilai NULL ditulis sebagai string kosong ke file CSV.)

  • Tipe ini tidak berisi informasi waktu, sehingga mengubah zona waktu tidak memengaruhi output. Format output default adalah "yyyy-MM-dd".

  • Anda dapat mengatur properti odps.text.option.date.io.format untuk menentukan format penguraian dan output kustom. Pola pertama yang Anda definisikan digunakan untuk output. Untuk sintaks pola, lihat DateTimeFormatter.

TIMESTAMP_NTZ

Catatan

OpenCsvSerde tidak mendukung tipe ini karena tidak kompatibel dengan format data Hive.

  • Bagian nanodetik dapat memiliki 0 hingga 9 digit. Format bawaan MaxCompute yang didukung adalah:

    • "yyyy-MM-dd HH:mm:ss[.SSSSSSSSS]" (misalnya, "2000-01-01 00:00:00.123")

    • "yyyy-MM-ddTHH:mm:ss[.SSSSSSSSS]" (misalnya, "2000-01-01T00:00:00.123456789")

    • "yyyyMMddHHmmss" (misalnya, "20000101000000")

    • "" (String kosong diurai sebagai NULL.)

  • Anda juga dapat mengatur properti odps.text.option.timestamp_ntz.io.format untuk mengontrol format penguraian. Misalnya, jika Anda mengatur format ke 'ddMMyyyy-HHmmss', MaxCompute dapat mengurai string seperti '31102024-103055'.

  • "2000-01-01 00:00:00.123000000"

  • "2000-01-01 00:00:00.123456789"

  • "2000-01-01 00:00:00.000000000"

  • "" (Nilai NULL ditulis sebagai string kosong ke file CSV.)

  • Tipe ini merepresentasikan timestamp presisi nanodetik. Tidak terpengaruh oleh zona waktu sesi, dan output default-nya menggunakan zona waktu UTC standar. Format output default adalah "yyyy-MM-dd HH:mm:ss.SSSSSSSSS".

  • Anda dapat mengatur properti odps.text.option.timestamp_ntz.io.format untuk menentukan format penguraian dan output kustom. Untuk sintaks pola, lihat DateTimeFormatter.

DATETIME

  • Bagian milidetik dapat memiliki 0 hingga 3 digit. [x] merepresentasikan offset zona waktu. Dengan asumsi zona waktu sistem adalah Asia/Shanghai, format bawaan MaxCompute yang didukung adalah:

    • "yyyy-MM-dd HH:mm:ss[.SSS][x]" (misalnya, "2000-01-01 00:00:00.123")

    • "yyyy-MM-ddTHH:mm:ss[.SSS][x]" (misalnya, "2000-01-01T00:00:00.123+0000")

    • "yyyyMMddHHmmss[x]" (misalnya, "20000101000000+0000")

    • "" (String kosong diurai sebagai NULL.)

  • Anda juga dapat mengatur properti odps.text.option.datetime.io.format untuk mengontrol format penguraian. Misalnya, jika Anda mengatur format ke 'yyyyMMdd-HHmmss.SSS', MaxCompute dapat mengurai string seperti '20241031-103055.123'.

Dengan asumsi zona waktu sistem adalah Asia/Shanghai:

  • "2000-01-01 00:00:00.123+0800"

  • "2000-01-01 08:00:00.123+0800"

  • "2000-01-01 08:00:00.000+0800"

  • "" (Nilai NULL ditulis sebagai string kosong ke file CSV.)

  • Tipe ini merepresentasikan timestamp presisi milidetik. Nilai output dipengaruhi oleh zona waktu sesi. Format output default adalah "yyyy-MM-dd HH:mm:ss.SSSx".

  • Anda dapat mengatur properti odps.sql.timezone untuk mengubah zona waktu sistem, yang mengontrol offset zona waktu nilai output.

  • Anda juga dapat mengatur properti odps.text.option.datetime.io.format untuk menentukan format penguraian dan output kustom. Untuk sintaks pola, lihat DateTimeFormatter.

TIMESTAMP

  • Bagian nanodetik dapat memiliki 0 hingga 9 digit. [x] merepresentasikan offset zona waktu. Dengan asumsi zona waktu sistem adalah Asia/Shanghai, format bawaan MaxCompute yang didukung adalah:

    • "yyyy-MM-dd HH:mm:ss[.SSSSSSSSS][x]" (misalnya, "2000-01-01 00:00:00.123456")

    • "yyyy-MM-ddTHH:mm:ss[.SSSSSSSSS][x]" (misalnya, "2000-01-01T00:00:00.123+0000")

    • "yyyyMMddHHmmss[x]" (misalnya, "20000101000000+0000")

    • "" (String kosong diurai sebagai NULL.)

  • Anda juga dapat mengatur properti odps.text.option.timestamp.io.format untuk mengontrol format penguraian. Misalnya, jika Anda mengatur format ke 'yyyyMMdd-HHmmss', MaxCompute dapat mengurai string seperti '20240910-103055'.

(Dengan asumsi zona waktu sistem adalah Asia/Shanghai)

  • "2000-01-01 00:00:00.123456000+0800"

  • "2000-01-01 08:00:00.123000000+0800"

  • "2000-01-01 08:00:00.000000000+0800"

  • "" (Nilai NULL ditulis sebagai string kosong ke file CSV.)

  • Tipe ini merepresentasikan timestamp presisi nanodetik. Nilai output dipengaruhi oleh zona waktu sesi. Format output default adalah "yyyy-MM-dd HH:mm:ss.SSSSSSSSSx".

  • Anda dapat mengatur properti odps.sql.timezone untuk mengubah zona waktu sistem, yang mengontrol offset zona waktu nilai output.

  • Anda juga dapat mengatur properti odps.text.option.timestamp.io.format untuk menentukan format penguraian dan output kustom. Untuk sintaks pola, lihat DateTimeFormatter.

  • Aturan Umum

    • Untuk semua tipe data, string kosong dalam file data CSV diurai sebagai NULL saat dibaca ke dalam tabel.

  • Tipe Data yang Tidak Didukung

    • Tipe kompleks (STRUCT, ARRAY, MAP): Tidak didukung. Nilai tipe ini sering berisi karakter seperti koma (,), yang dapat bertentangan dengan pemisah CSV umum dan menyebabkan kegagalan penguraian.

    • BINARY dan INTERVAL: Saat ini tidak didukung. Jika Anda memerlukan dukungan untuk tipe ini, hubungi dukungan teknis MaxCompute.

  • Tipe Numerik (INT, DOUBLE, dll.)

    • Untuk tipe data numerik seperti INT, SMALLINT, TINYINT, BIGINT, FLOAT, DOUBLE, dan DECIMAL, MaxCompute menyediakan kemampuan penguraian default yang luas.

    • Jika Anda hanya perlu mengurai string numerik dasar, Anda dapat mengatur properti odps.text.option.smart.parse.level ke naive dalam tblproperties. Dalam mode naive, parser hanya mendukung format sederhana seperti "123" dan "123.456". Mengurai format string lain menyebabkan error.

  • Tipe Tanggal dan Waktu (DATE, TIMESTAMP, dll.)

    • Kelas java.time.format.DateTimeFormatter memproses keempat tipe tanggal dan waktu: DATE, DATETIME, TIMESTAMP, dan TIMESTAMP_NTZ.

    • Format default: MaxCompute memiliki beberapa format penguraian bawaan.

    • Format kustom:

      • Anda dapat menentukan beberapa format penguraian dan satu format output dengan mengatur properti odps.text.option.<date|datetime|timestamp|timestamp_ntz>.io.format dalam tblproperties.

      • Gunakan simbol hash (#) untuk memisahkan beberapa pola penguraian.

      • Format kustom memiliki prioritas lebih tinggi daripada format bawaan. Pola kustom pertama digunakan untuk output.

      • Contoh: Jika Anda menentukan string format kustom untuk tipe DATE sebagai pattern1#pattern2#pattern3, MaxCompute dapat mengurai string yang cocok dengan pattern1, pattern2, atau pattern3. Namun, saat menulis data ke file, output akan selalu menggunakan format yang ditentukan oleh pattern1. Untuk informasi lebih lanjut, lihat DateTimeFormatter.

  • Catatan Penting tentang Pola Zona Waktu 'z'

    • Hindari menggunakan 'z' (nama zona waktu) dalam format kustom, terutama untuk pengguna di Tiongkok, karena ambigu.

    • Sebagai gantinya, gunakan 'x' (offset zona) atau 'VV' (ID zona waktu) untuk pola zona waktu.

    • Contoh: 'CST' biasanya berarti China Standard Time (UTC+8) di Tiongkok. Namun, saat java.time.format.DateTimeFormatter mengurai 'CST', ia menginterpretasikannya sebagai US Central Standard Time (UTC-6), yang dapat menyebabkan hasil input atau output yang tidak terduga.

Logika pemisahan file CSV

Parser CSV/TSV bawaan (OpenCSVSerde)

Parser CSV/TSV bawaan (OpenCSVSerde) mengharuskan setiap baris data dalam file CSV dipisahkan oleh \r\n atau karakter serupa, dan kolom tidak boleh berisi \r\n. Logika pemisahan paralel dan integritas data adalah sebagai berikut:

  • Pertama, file dibagi berdasarkan ukuran split, dan beberapa baris mungkin terpotong di tengah.

  • Saat worker berikutnya mengonsumsi split, semua split kecuali yang pertama secara aktif melewati baris parsial atau penuh di awal.

  • Setiap worker juga harus secara aktif mengonsumsi baris parsial atau penuh di akhir, bahkan jika berada dalam rentang split berikutnya.

Parser ini mendukung pemisahan paralel tetapi tidak mendukung escape quote.

Parser CSV open-source (CsvStorageHandler / TsvStorageHandler)

Parser CSV open-source (CsvStorageHandler / TsvStorageHandler) mempertimbangkan escape quote saat membaca file CSV/TSV dan mendukung \r\n. Parser ini dapat menangani skenario di mana karakter khusus seperti quote bersarang atau \r\n muncul di dalam quote.

Misalnya, dalam data "a\ra","b\nb","cc""cc", \r\n dan tanda kutip ganda dapat diurai dan di-output dengan benar, mendukung nilai lintas baris. Namun, karena posisi line break sebenarnya hanya dapat ditentukan melalui penguraian data, file tidak dapat dibagi secara sederhana berdasarkan \r\n. Akibatnya, konsumsi paralel satu file tidak didukung.

Jika Anda memastikan bahwa kolom data tidak berisi \r\n dan \r\n hanya digunakan sebagai pemisah baris, Anda dapat mengaktifkan pemisahan paralel dengan mengatur odps.sql.unstructured.data.single.file.split.enabled. Dalam kasus ini, file besar dapat dibagi menjadi beberapa split berdasarkan ukuran split, dan Text Extractor bawaan secara otomatis menyelaraskan ke batas line break untuk memastikan integritas data.

Kesimpulan:

  • Jika data berisi \r\n yang tidak dapat diperlakukan sebagai pemisah baris, hanya parser CSV/TSV bawaan yang dapat digunakan.

  • Sebaliknya, jika Anda perlu membagi satu file besar secara paralel, hanya parser Serde CSV open-source yang dapat digunakan.

Contoh

Prasyarat

  • Proyek MaxCompute telah dibuat.

  • Bucket dan folder OSS tersedia. Untuk informasi lebih lanjut, lihat Buat bucket dan Kelola folder.

    MaxCompute mendukung pembuatan folder otomatis di OSS. Jika pernyataan SQL melibatkan tabel eksternal dan fungsi yang ditentukan pengguna (UDF), Anda dapat menggunakan satu pernyataan untuk membaca dan menulis ke tabel serta menggunakan UDF. Anda juga dapat membuat folder secara manual.

    MaxCompute hanya diterapkan di wilayah tertentu. Untuk menghindari potensi masalah koneksi data lintas wilayah, pastikan bucket OSS Anda berada di wilayah yang sama dengan proyek MaxCompute Anda.
  • Otorisasi

    • Anda harus memiliki izin untuk mengakses OSS. Anda dapat menggunakan Akun Alibaba Cloud, pengguna Resource Access Management (RAM), atau peran RAM untuk mengakses tabel eksternal OSS. Untuk informasi lebih lanjut tentang otorisasi, lihat Otorisasi Akses dalam Mode STS untuk OSS.

    • Anda harus memiliki izin CreateTable di proyek MaxCompute. Untuk informasi lebih lanjut tentang izin tabel, lihat Izin MaxCompute.

Buat tabel eksternal OSS dengan parser teks bawaan

Contoh 1: Tabel non-partisi

  1. Petakan tabel eksternal ke direktori Demo1/ dari data sampel. Gunakan perintah berikut untuk membuat tabel eksternal OSS.

    CREATE EXTERNAL TABLE IF NOT EXISTS mc_oss_csv_external1
    (
      vehicleId INT,
      recordId INT,
      patientId INT,
      calls INT,
      locationLatitute DOUBLE,
      locationLongtitue 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.

    Contoh ini menggunakan peran RAM aliyunodpsdefaultrole. Jika Anda menggunakan peran RAM berbeda, ganti aliyunodpsdefaultrole dengan nama peran RAM target Anda dan berikan izin yang diperlukan untuk mengakses OSS.

  2. Kueri tabel eksternal non-partisi.

    SELECT * FROM mc_oss_csv_external1;

    Perintah mengembalikan hasil berikut:

    +------------+------------+------------+------------+------------------+-------------------+----------------+------------+
    | vehicleid  | recordid   | patientid  | calls      | locationlatitute | locationlongtitue | 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          |
    +------------+------------+------------+------------+------------------+-------------------+------------+----------------+
  3. Tulis data ke tabel eksternal non-partisi dan periksa bahwa data berhasil 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;

    Perintah mengembalikan hasil berikut:

    +------------+------------+------------+------------+------------------+-------------------+----------------+------------+
    | vehicleid  | recordid   | patientid  | calls      | locationlatitute | locationlongtitue | recordtime     | direction  |
    +------------+------------+------------+------------+------------------+-------------------+----------------+------------+
    | 1          | 12         | 76         | 1          | 46.81006         | -92.08174         | 9/14/2014 0:10 | SW         |
    +------------+------------+------------+------------+------------------+-------------------+----------------+------------+

    Verifikasi bahwa file baru muncul di direktori Demo1/ di OSS.

    Setelah data ditulis, Anda dapat melihat file hasil yang dihasilkan 20250606054845430gpwnhakujm16_M1_1_0_0-0_TableSink1-0-.csv (0,046 KB) di jalur OSS yang sesuai, bersama dengan file data asli vehicle.csv (0,45 KB).

Contoh 2: Tabel partisi

  1. Petakan tabel eksternal ke direktori Demo2/ dari data sampel. Perintah sampel berikut membuat tabel eksternal OSS terpartisi.

    CREATE EXTERNAL TABLE IF NOT EXISTS mc_oss_csv_external2
    (
      vehicleId INT,
      recordId INT,
      patientId INT,
      calls INT,
      locationLatitute DOUBLE,
      locationLongtitue 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.

    Contoh ini menggunakan peran RAM aliyunodpsdefaultrole. Jika Anda menggunakan peran RAM berbeda, ganti aliyunodpsdefaultrole dengan nama peran RAM target Anda dan berikan izin yang diperlukan untuk mengakses OSS.

  2. Impor data partisi. Jika Anda membuat tabel eksternal OSS terpartisi, Anda juga harus mengimpor data partisi. Untuk informasi lebih lanjut, lihat 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');
  3. Kueri tabel eksternal terpartisi.

    SELECT * FROM mc_oss_csv_external2 WHERE direction='NE';

    Perintah mengembalikan hasil berikut:

    +------------+------------+------------+------------+------------------+-------------------+----------------+------------+
    | vehicleid  | recordid   | patientid  | calls      | locationlatitute | locationlongtitue | 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         |
    +------------+------------+------------+------------+------------------+-------------------+----------------+------------+
  4. Tulis data ke tabel eksternal terpartisi dan periksa bahwa data berhasil 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;

    Perintah mengembalikan hasil berikut:

    +------------+------------+------------+------------+------------------+-------------------+----------------+------------+
    | vehicleid  | recordid   | patientid  | calls      | locationlatitute | locationlongtitue | recordtime     | direction  |
    +------------+------------+------------+------------+------------------+-------------------+----------------+------------+
    | 1          | 12         | 76         | 1          | 46.81006         | -92.08174         | 9/14/2014 0:10 | NE         |
    +------------+------------+------------+------------+------------------+-------------------+----------------+------------+

    Periksa bahwa file baru dihasilkan di direktori Demo2/direction=NE di OSS.

    File data partisi yang dihasilkan secara otomatis 20250606062610590gocsdsoujm16_M1_1_0_0-0_TableSink1-0-.csv dapat dilihat dalam daftar file OSS, menunjukkan bahwa data telah berhasil ditulis ke jalur partisi yang sesuai di OSS.

Contoh 3: Data terkompresi

Contoh ini menunjukkan cara membuat tabel eksternal CSV terkompresi GZIP dan melakukan operasi baca dan tulis.

  1. Buat tabel internal dan masukkan data uji untuk pengujian tulis berikutnya.

    CREATE TABLE vehicle_test(
      vehicleid INT, 
      recordid INT, 
      patientid INT, 
      calls INT, 
      locationlatitute DOUBLE, 
      locationlongtitue DOUBLE, 
      recordtime STRING, 
      direction STRING
    );
    
    INSERT INTO vehicle_test VALUES (1,1,51,1,46.81006,-92.08174,'9/14/2014 0:00','S');
  2. Buat tabel eksternal CSV terkompresi GZIP dan petakan ke direktori Demo3/ (yang berisi data terkompresi) dari data sampel. Perintah sampel berikut membuat tabel eksternal OSS.

    CREATE EXTERNAL TABLE IF NOT EXISTS mc_oss_csv_external3
    (
      vehicleId INT,
      recordId INT,
      patientId INT,
      calls INT,
      locationLatitute DOUBLE,
      locationLongtitue 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.

    Contoh ini menggunakan peran RAM aliyunodpsdefaultrole. Jika Anda menggunakan peran RAM berbeda, ganti aliyunodpsdefaultrole dengan nama peran RAM target Anda dan berikan izin yang diperlukan untuk mengakses OSS.

  3. Gunakan klien MaxCompute untuk membaca data dari OSS:

    Catatan

    Jika 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 untuk dieksekusi.

    --Aktifkan pemindaian tabel penuh hanya untuk sesi saat ini.
    SET odps.sql.allow.fullscan=true;
    SELECT recordId, patientId, direction FROM mc_oss_csv_external3 WHERE patientId > 25;

    Perintah mengembalikan hasil berikut:

    +------------+------------+------------+
    | recordid   | patientid  | direction  |
    +------------+------------+------------+
    | 1          | 51         | S          |
    | 3          | 48         | NE         |
    | 4          | 30         | W          |
    | 5          | 47         | S          |
    | 7          | 53         | N          |
    | 8          | 63         | SW         |
    | 10         | 31         | N          |
    +------------+------------+------------+
  4. Baca data dari tabel internal dan tulis ke tabel eksternal OSS.

    Anda dapat mengeksekusi perintah INSERT OVERWRITE atau INSERT INTO pada tabel eksternal dari klien MaxCompute untuk menulis data ke OSS.

    INSERT INTO TABLE mc_oss_csv_external3 PARTITION (dt='20250418') SELECT * FROM vehicle_test;

    Setelah perintah berhasil dijalankan, Anda dapat melihat file yang diekspor di direktori OSS.

Buat tabel eksternal dengan baris header

Buat direktori 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',
  'odps.properties.rolearn'='acs:ram::<uid>:role/aliyunodpsdefaultrole'
)
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 kolom sebagai STRING. Jika tidak, terjadi error saat header dibaca.
--Atau, tambahkan parameter 'odps.text.option.header.lines.count' = '1' ke definisi tabel untuk melewati header.
SELECT * FROM mf_oss_wtt;

Contoh ini menggunakan peran RAM aliyunodpsdefaultrole. Jika Anda menggunakan peran RAM berbeda, ganti aliyunodpsdefaultrole dengan nama peran RAM target Anda dan berikan izin yang diperlukan untuk mengakses OSS.

Perintah mengembalikan hasil berikut:

+----------+--------+------------+
| id       | name   | tran_amt   |
+----------+--------+------------+
| 1        | val1   | 1.1        |
| 2        | value2 | 1.3        |
+----------+--------+------------+

Buat tabel eksternal dengan kolom tidak sesuai

  1. Buat direktori demo di bucket oss-mc-test dari data sampel dan unggah file test.csv. File test.csv berisi 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 columns
  2. Buat tabel eksternal.

    1. Atur metode penanganan untuk baris dengan jumlah kolom tidak konsisten ke TRUNCATE.

      -- Hapus tabel.
      DROP TABLE test_mismatch;
      -- Buat tabel eksternal.
      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',
        'odps.properties.rolearn'='acs:ram::<uid>:role/aliyunodpsdefaultrole')
      LOCATION 'oss://oss-cn-hangzhou-internal.aliyuncs.com/oss-mc-test/demo/';
    2. Tentukan metode penanganan untuk baris dengan jumlah kolom tidak konsisten sebagai IGNORE.

      -- Hapus tabel.
      DROP TABLE test_mismatch01;
      -- Buat tabel eksternal.
      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/';
    3. Kueri data dalam tabel.

      • Kueri tabel test_mismatch.

        SELECT * FROM test_mismatch;
        
        --Hasil yang dikembalikan
        +----+-------+---------------+---------------+
        | 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 yang dikembalikan
        +----+-------+----------------+-------------+
        | id | name  | dect           | col4        |
        +----+-------+----------------+-------------+
        | 2  | kyle2 | this is desc2  | this is two  
        +----+-------+----------------+-------------+

Buat tabel eksternal dengan parser open-source

Contoh ini menunjukkan cara menggunakan parser open source bawaan untuk membuat tabel eksternal OSS untuk membaca file yang dipisahkan koma sambil mengabaikan baris header dan footer.

  1. Buat direktori demo-test di bucket oss-mc-test dari data sampel dan unggah file 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,N
  2. Buat tabel eksternal, tentukan koma sebagai pemisah, dan atur parameter untuk mengabaikan baris header dan footer.

    CREATE EXTERNAL TABLE ext_csv_test08
    (
      vehicleId INT,
      recordId INT,
      patientId INT,
      calls INT,
      locationLatitute DOUBLE,
      locationLongtitue DOUBLE,
      recordTime STRING,
      direction STRING
    )
    ROW FORMAT serde 'org.apache.hadoop.hive.serde2.OpenCSVSerde'
    WITH serdeproperties (
    "separatorChar" = ",",
    'odps.properties.rolearn'='acs:ram::<uid>:role/aliyunodpsdefaultrole'
    )
    stored AS textfile
    location 'oss://oss-cn-hangzhou-internal.aliyuncs.com/***/'
    -- Atur parameter untuk mengabaikan baris header dan footer.
    TBLPROPERTIES (
    "skip.header.line.COUNT"="1",
    "skip.footer.line.COUNT"="1"
    )
    ;
  3. Baca data dari tabel eksternal.

    SELECT * FROM ext_csv_test08;
    
    -- Hasil mencakup 8 baris data karena baris header dan footer diabaikan.
    +------------+------------+------------+------------+------------------+-------------------+----------------+------------+
    | vehicleid  | recordid   | patientid  | calls      | locationlatitute | locationlongtitue | 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          | 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         |
    +------------+------------+------------+------------+------------------+-------------------+----------------+------------+

Buat tabel eksternal CSV dengan tipe waktu kustom

Untuk detail tentang format penguraian dan output untuk tipe waktu kustom dalam CSV, lihat Kompatibilitas Tipe Fleksibel dengan Smart Parse.

  1. Buat tabel eksternal CSV yang menggunakan berbagai tipe data waktu, seperti DATE, 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/'
    WITH serdeproperties (
      'odps.properties.rolearn'='acs:ram::<uid>:role/aliyunodpsdefaultrole'
    )
    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');
  2. Setelah data dimasukkan, konten file CSV adalah sebagai berikut:

    02/21/2025,2025-02-21-08-30-00 +08,2025-02-21 12-30-00 Asia/Shanghai,2025-02-21 16:30:00.12
  3. Kueri data lagi untuk melihat hasilnya.

    SELECT * FROM test_csv;

    Perintah mengembalikan hasil berikut:

    +------------+---------------------+---------------------+------------------------+
    | 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 |
    +------------+---------------------+---------------------+------------------------+

FAQ

Error ketidaksesuaian jumlah kolom

  • Gejala

    Error ini terjadi saat jumlah kolom dalam baris file CSV atau TSV tidak sesuai dengan yang didefinisikan dalam DDL tabel eksternal. MaxCompute melaporkan error serupa dengan FAILED: ODPS-0123131:User defined function exception - Traceback:java.lang.RuntimeException: SCHEMA MISMATCH:xxx.

  • Resolusi

    Anda dapat mengontrol cara MaxCompute menangani ketidaksesuaian dengan mengatur parameter odps.sql.text.schema.mismatch.mode pada tingkat sesi:

    • SET odps.sql.text.schema.mismatch.mode=error: Menggagalkan kueri saat terjadi ketidaksesuaian jumlah kolom. Ini adalah perilaku default.

    • SET odps.sql.text.schema.mismatch.mode=truncate: Jika baris memiliki lebih banyak kolom daripada yang didefinisikan dalam DDL tabel eksternal, kolom tambahan dibuang. Jika baris memiliki lebih sedikit kolom, kolom yang hilang diisi dengan NULL.