全部产品
Search
文档中心

MaxCompute:Tabel eksternal CSV/TSV

更新时间:Nov 10, 2025

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

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.

  • True

  • False

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.

  • True

  • False

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 \N merepresentasikan NULL, a,\N,b diurai sebagai a, NULL, b.

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

  • False

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

  • UTF-16

  • US-ASCII

  • GBK

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 " di depan " lainnya), atau koma, seluruh bidang harus diapit oleh tanda kutip ganda ("") sebagai pemisah kolom. Parameter ini menentukan apakah akan mendeteksi pemisah kolom CSV ".

  • True

  • False

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.

  • True

  • False

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: Melaporkan kesalahan.

  • truncate: Membuang kolom tambahan. Mengisi kolom yang hilang dengan null.

  • ignore: Membuang baris yang tidak konsisten.

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.

  • True

  • False

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 property_value.

  • com.hadoop.compression.lzo.LzoCodec

  • com.hadoop.compression.lzo.LzopCodec

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

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

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

  • "true"/"false"

  • "T"/"F"

  • "1"/"0"

  • "Yes"/"No"

  • "Y"/"N"

  • "" (String kosong diurai sebagai NULL saat dibaca ke dalam tabel.)

Catatan

Masukan dipangkas menggunakan operasi trim() selama penguraian.

  • "true"/"false"

  • "true"/"false"

  • "true"/"false"

  • "true"/"false"

  • "true"/"false"

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

Jika nilai tidak termasuk dalam enumerasi, penguraian gagal.

TINYINT

  • "0"

  • "1"

  • "-100"

  • "1,234,567" (notasi pemisah ribuan. Koma tidak boleh menjadi karakter pertama atau terakhir dari string angka)

  • "1_234_567" (gaya Java. Garis bawah tidak boleh menjadi karakter pertama atau terakhir dari string angka)

  • "0.3e2" (notasi ilmiah. Dapat diurai jika nilai aktualnya adalah bilangan bulat. Jika tidak, kesalahan dilaporkan.)

  • "-1e5" (notasi ilmiah)

  • "0xff" (heksadesimal, tidak peka huruf besar/kecil)

  • "0b1001" (biner, tidak peka huruf besar/kecil)

  • "4/2" (pecahan. Dapat diurai jika nilai aktualnya adalah bilangan bulat. Jika tidak, kesalahan dilaporkan.)

  • "1000%" (persentase. Dapat diurai jika nilai aktualnya adalah bilangan bulat. Jika tidak, kesalahan dilaporkan.)

  • "1000‰" (permille. Dapat diurai jika nilai aktualnya adalah bilangan bulat. Jika tidak, kesalahan dilaporkan.)

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

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

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

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

  • "" (String kosong diurai sebagai NULL saat dibaca ke dalam tabel.)

Catatan
  • Masukan dipangkas menggunakan operasi trim() selama penguraian.

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

  • Gaya K8s mendukung satuan basis-1000 seperti K, M, G, P, dan T, serta satuan basis-1024 seperti 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.

  • Nilai "0", "1", "-100", dan "" juga dapat diurai dalam mode naif.

  • "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 dikeluarkan sebagai string kosong ke file CSV.)

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

SMALLINT

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

INT

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

BIGINT

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

Catatan

-2<sup>63</sup> (yang merupakan -9223372036854775808) tidak termasuk dalam rentang nilai karena keterbatasan mesin SQL.

FLOAT

  • "3.14"

  • "0.314e1" (notasi ilmiah)

  • "2/5" (pecahan)

  • "123.45%" (persentase)

  • "123.45‰" (permille)

  • "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, satuan basis-1000)

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

  • "NaN" (tidak peka huruf besar/kecil)

  • "Inf" (tidak peka huruf besar/kecil)

  • "-Inf" (tidak peka huruf besar/kecil)

  • "Infinity" (tidak peka huruf besar/kecil)

  • "-Infinity" (tidak peka huruf besar/kecil)

  • "" (String kosong diurai sebagai NULL saat dibaca ke dalam tabel.)

Catatan
  • Masukan dipangkas menggunakan operasi trim() selama penguraian.

  • Nilai "3.14", "0.314e1", "NaN", "Infinity", "-Infinity", dan "" juga dapat diurai dalam mode naif.

  • "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 dikeluarkan sebagai string kosong ke file CSV.)

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

  • "3.1415926"

  • "0.314e1" (notasi ilmiah)

  • "2/5" (pecahan)

  • "123.45%" (persentase)

  • "123.45‰" (permille)

  • "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, satuan basis-1000)

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

  • "NaN" (tidak peka huruf besar/kecil)

  • "Inf" (tidak peka huruf besar/kecil)

  • "-Inf" (tidak peka huruf besar/kecil)

  • "Infinity" (tidak peka huruf besar/kecil)

  • "-Infinity" (tidak peka huruf besar/kecil)

  • "" (String kosong diurai sebagai NULL saat dibaca ke dalam tabel.)

Catatan
  • Masukan dipangkas menggunakan operasi trim() selama penguraian.

  • Nilai "3.1415926", "0.314e1", "NaN", "Infinity", "-Infinity", dan "" juga dapat diurai dalam mode naif.

  • "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 dikeluarkan sebagai string kosong ke file CSV.)

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)

  • "3.358"

  • "2/5" (pecahan)

  • "123.45%" (persentase)

  • "123.45‰" (permille)

  • "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, satuan basis-1000)

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

  • "" (String kosong diurai sebagai NULL saat dibaca ke dalam tabel.)

Catatan
  • Masukan dipangkas menggunakan operasi trim() selama penguraian.

  • Nilai "3.358" dan "" juga dapat diurai dalam mode naif.

  • "3.36" (dibulatkan)

  • "0.4"

  • "1.23" (dibulatkan)

  • "0.12" (dibulatkan)

  • "1234567.89"

  • "1234.56"

  • "1234.56"

  • "1200000"

  • "2147483648"

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

Kesalahan dilaporkan jika bagian bilangan bulat melebihi presisi-skala.

Jika bagian pecahan melebihi skala, nilai dibulatkan dan dipotong.

CHAR(n)

Contoh: CHAR(7)

  • "abcdefg"

  • "abcdefghijklmn"

  • "abc"

  • "" (String kosong diurai sebagai NULL saat dibaca ke dalam tabel.)

  • "abcdefg"

  • "abcdefg" (Sisanya dipotong.)

  • "abc____" (String "abc" diikuti oleh empat spasi, yang direpresentasikan oleh karakter _.)

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

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)

  • "abcdefg"

  • "abcdefghijklmn"

  • "abc"

  • "" (String kosong diurai sebagai NULL saat dibaca ke dalam tabel.)

  • "abcdefg"

  • "abcdefg" (Sisanya dipotong.)

  • "abc"

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

Panjang maksimum adalah 65535. Jika panjangnya melebihi n, string dipotong.

STRING

  • "abcdefg"

  • "abc"

  • "" (String kosong diurai sebagai NULL saat dibaca ke dalam tabel.)

  • "abcdefg"

  • "abc"

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

Batas panjang adalah 8 MB.

DATE

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

  • "yyyyMMdd" (misalnya, "20250221")

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

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

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

  • "" (String kosong diurai sebagai NULL saat dibaca ke dalam tabel.)

Catatan

Anda juga dapat menyesuaikan metode penguraian untuk masukan dengan mengatur odps.text.option.date.io.format. Misalnya, jika Anda mengatur format ke 'dd/MM/yyyy#yyyy--MM--dd', Anda dapat mengurai '21/02/2025' dan '2025--02--21'.

  • "2000-01-01"

  • "2000-01-01"

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

  • Tidak ada informasi jam, menit, atau detik. Mengubah zona waktu tidak memengaruhi keluaran. Format keluaran default adalah "yyyy-MM-dd".

  • Anda juga dapat menyesuaikan format penguraian dan keluaran dengan mengatur odps.text.option.date.io.format. Format keluaran menggunakan pola kustom pertama. Untuk informasi lebih lanjut tentang format, lihat DateTimeFormatter.

TIMESTAMP_NTZ

Catatan

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

  • Bagian nanodetik dapat memiliki panjang 0 hingga 9. MaxCompute mendukung format penguraian bawaan berikut:

    • "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 saat dibaca ke dalam tabel.)

  • Anda juga dapat menyesuaikan metode penguraian untuk masukan dengan mengatur odps.text.option.timestamp_ntz.io.format. Misalnya, jika Anda mengatur format ke 'ddMMyyyy-HHmmss', Anda 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 dikeluarkan sebagai string kosong ke file CSV.)

  • Ini adalah stempel waktu granularitas nanodetik. Mengubah zona waktu tidak memengaruhi keluaran. Secara default, keluaran menggunakan zona waktu UTC standar dan format "yyyy-MM-dd HH:mm:ss.SSSSSSSSS".

  • Anda juga dapat menyesuaikan format penguraian dan keluaran dengan mengatur odps.text.option.timestamp_ntz.io.format. Untuk informasi lebih lanjut tentang format, lihat DateTimeFormatter.

DATETIME

  • Bagian milidetik dapat memiliki panjang 0 hingga 3. `x` merepresentasikan offset zona waktu. Jika zona waktu sistem adalah Asia/Shanghai, MaxCompute mendukung format penguraian bawaan berikut:

    • "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 saat dibaca ke dalam tabel.)

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

Jika 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 dikeluarkan sebagai string kosong ke file CSV.)

  • Ini adalah stempel waktu granularitas milidetik. Mengubah zona waktu memengaruhi keluaran. Format keluaran default adalah "yyyy-MM-dd HH:mm:ss.SSSx".

  • Anda dapat mengubah zona waktu sistem menggunakan odps.sql.timezone untuk mengontrol offset zona waktu dari nilai keluaran.

  • Anda juga dapat menyesuaikan format penguraian dan keluaran dengan mengatur odps.text.option.datetime.io.format. Untuk informasi lebih lanjut tentang format, lihat: DateTimeFormatter.

TIMESTAMP

  • Bagian nanodetik dapat memiliki panjang 0 hingga 9. `x` merepresentasikan offset zona waktu. Jika zona waktu sistem adalah Asia/Shanghai, MaxCompute mendukung format penguraian bawaan berikut:

    • "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 saat dibaca ke dalam tabel.)

  • Anda juga dapat menyesuaikan metode penguraian untuk masukan dengan mengatur odps.text.option.timestamp.io.format. Misalnya, jika Anda mengatur format ke 'yyyyMMdd-HHmmss', Anda dapat mengurai string seperti '20240910-103055'.

Jika 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 dikeluarkan sebagai string kosong ke file CSV.)

  • Ini adalah stempel waktu granularitas nanodetik. Mengubah zona waktu memengaruhi keluaran. Format keluaran default adalah "yyyy-MM-dd HH:mm:ss.SSSSSSSSSx".

  • Anda dapat mengubah zona waktu sistem menggunakan odps.sql.timezone untuk mengontrol offset zona waktu dari nilai keluaran.

  • Anda juga dapat menyesuaikan format penguraian dan keluaran dengan mengatur odps.text.option.timestamp.io.format. Untuk informasi lebih lanjut tentang format, lihat DateTimeFormatter.

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.level ke naive di tblproperties. 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.DateTimeFormatter untuk pemrosesan. MaxCompute memiliki beberapa format penguraian default bawaan. Anda juga dapat mendefinisikan beberapa format penguraian dan satu format keluaran dengan mengatur odps.text.option.<date|datetime|timestamp|timestamp_ntz>.io.format di tblproperties. 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 dengan pattern1, pattern2, atau pattern3. Namun, saat Anda menulis data ke file, keluaran menggunakan format pattern1. 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

Catatan
  • 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, ganti aliyunodpsdefaultrole dengan 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

  1. 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.
  2. 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          |
    +------------+------------+------------+------------+------------------+-------------------+------------+----------------+
  3. 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.image

Contoh 2: Tabel partisi

  1. 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.
  2. 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');
  3. 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         |
    +------------+------------+------------+------------+------------------+-------------------+----------------+------------+
  4. 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=NE di OSS.image

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 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');
  2. 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.
  3. Gunakan klien MaxCompute untuk membaca data dari OSS. Berikut adalah perintah contoh:

    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-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          |
    +------------+------------+------------+
  4. Baca data dari tabel internal dan tulis ke tabel eksternal OSS.

    Anda dapat menjalankan perintah INSERT OVERWRITE atau INSERT INTO pada 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

  1. Buat folder 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 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/';
    2. 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/';
    3. 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.

  1. Buat folder demo-test di bucket oss-mc-test dari 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,N
  2. Buat 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"
    )
    ;
  3. 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.

  1. 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');
  2. 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.12
  3. Baca 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 |
    +------------+---------------------+---------------------+------------------------+