Menjalankan pernyataan SQL untuk melakukan operasi pada objek dan mengembalikan hasil eksekusi.
Catatan penggunaan
Anda harus memiliki izin baca pada objek.
Jika pernyataan SQL dijalankan dengan benar, kode status HTTP 206 akan dikembalikan. Jika pernyataan SQL tidak valid atau tidak dapat mencocokkan objek yang ada, kode status HTTP 400 akan dikembalikan.
Biaya akan dikenakan berdasarkan ukuran objek yang dipindai saat Anda memanggil operasi SelectObject. Untuk informasi lebih lanjut, lihat Biaya Pemrosesan Data.
Sintaks permintaan
Operasi ini mendukung sintaks permintaan berikut untuk objek CSV dan JSON.
Sintaks permintaan untuk objek CSV
POST /object?x-oss-process=csv/select HTTP/1.1 HOST: BucketName.oss-cn-hangzhou.aliyuncs.com Date: waktu GMT Content-Length: PanjangKonten Content-MD5: NilaiMD5 Authorization: TandaTangan <?xml version="1.0" encoding="UTF-8"?> <SelectRequest> <Expression>Pernyataan SQL yang di-enkode Base64. Contoh: c2VsZWN0IGNvdW50KCopIGZyb20gb3Nzb2JqZWN0IHdoZXJlIF80ID4gNDU=</Expression> <InputSerialization> <CompressionType>None|GZIP</CompressionType> <CSV> <FileHeaderInfo> NONE|IGNORE|USE </FileHeaderInfo> <RecordDelimiter>Karakter yang di-enkode Base64</RecordDelimiter> <FieldDelimiter>Karakter yang di-enkode Base64</FieldDelimiter> <QuoteCharacter>Karakter yang di-enkode Base64</QuoteCharacter> <CommentCharacter>Karakter yang di-enkode Base64</CommentCharacter> <Range>line-range=start-end|split-range=start-end</Range> <AllowQuotedRecordDelimiter>>true|false</AllowQuotedRecordDelimiter> </CSV> </InputSerialization> <OutputSerialization> <CSV> <RecordDelimiter>Karakter yang di-enkode Base64</RecordDelimiter> <FieldDelimiter>Karakter yang di-enkode Base64</FieldDelimiter> </CSV> <KeepAllColumns>false|true</KeepAllColumns> <OutputRawData>false|true</OutputRawData> <EnablePayloadCrc>true</EnablePayloadCrc> <OutputHeader>false</OutputHeader> </OutputSerialization> <Options> <SkipPartialDataRecord>false</SkipPartialDataRecord> <MaxSkippedRecordsAllowed> jumlah maksimum catatan yang dilewati </MaxSkippedRecordsAllowed> </Options> </SelectRequest>Sintaks permintaan untuk objek JSON
POST /object?x-oss-process=json/select HTTP/1.1 HOST: BucketName.oss-cn-hangzhou.aliyuncs.com Date: waktu GMT Content-Length: PanjangKonten Content-MD5: NilaiMD5 Authorization: TandaTangan <?xml version="1.0" encoding="UTF-8"?> <SelectRequest> <Expression> Pernyataan SQL yang di-enkode Base64. Contoh: c2VsZWN0IGNvdW50KCopIGZyb20gb3Nzb2JqZWN0IHdoZXJl IF80ID4gNDU= </Expression> <InputSerialization> <CompressionType>None|GZIP</CompressionType> <JSON> <Type>DOCUMENT|LINES</Type> <Range> line-range=start-end|split-range=start-end </Range> <ParseJsonNumberAsString> true|false </ParseJsonNumberAsString> </JSON> </InputSerialization> <OutputSerialization> <JSON> <RecordDelimiter> Delimeter rekaman Base64 </RecordDelimiter> </JSON> <OutputRawData>false|true</OutputRawData> <EnablePayloadCrc>true</EnablePayloadCrc> </OutputSerialization> <Options> <SkipPartialDataRecord> false|true </SkipPartialDataRecord> <MaxSkippedRecordsAllowed> jumlah maksimum catatan yang dilewati </MaxSkippedRecordsAllowed> </Options> </SelectRequest>
Elemen permintaan
Elemen | Tipe | Deskripsi |
SelectRequest | Container | Kontainer yang menyimpan permintaan SelectObject. Node anak: Expression, InputSerialization, dan OutputSerialization Node induk: none |
Expression | String | Pernyataan SQL yang di-enkode Base64. Node anak: none Node induk: SelectRequest |
InputSerialization | Container | Opsional. Elemen ini menentukan parameter serialisasi input. Node anak: CompressionType, CSV, dan JSON Node induk: SelectRequest |
OutputSerialization | Container | Opsional. Elemen ini menentukan parameter serialisasi output. Node anak: CSV, JSON, dan OutputRawData Node induk: SelectRequest |
CSV(InputSerialization) | Container | Opsional. Elemen ini menentukan parameter serialisasi input saat objek CSV di-query. Node anak: FileHeaderInfo, RecordDelimiter, FieldDelimiter, QuoteCharacter, CommentCharacter, dan Range Node induk: InputSerialization |
CSV(OutputSerialization) | Container | Opsional. Elemen ini menentukan parameter serialisasi output saat objek CSV di-query. Node anak: RecordDelimiter dan FieldDelimiter Node induk: OutputSerialization |
JSON(InputSerialization) | Container | Opsional. Elemen ini menentukan parameter serialisasi input saat objek JSON di-query. Node anak: Type, Range, dan ParseJsonNumberAsString |
JSON(OutputSerialization) | Container | Opsional. Elemen ini menentukan parameter serialisasi output saat objek JSON di-query. Node anak: RecordDelimiter |
Type | Enumerasi | Tipe objek JSON input. Nilai valid: DOCUMENT dan LINES. |
OutputRawData | Boolean | Opsional. Elemen ini menentukan apakah akan mengekspor data mentah. Nilai default: false. Node anak: none Node induk: OutputSerialization Catatan
|
CompressionType | Enumerasi | Tipe kompresi objek. Nilai valid: None dan GZIP. Node anak: none Node induk: InputSerialization |
FileHeaderInfo | Enumerasi | Opsional. Elemen ini menentukan informasi header tentang objek CSV. Nilai valid:
Node anak: none Node induk: CSV (input) |
RecordDelimiter | String | Opsional. Elemen ini menentukan karakter pindah baris yang di-enkode Base64. Nilai default: Node anak: none Node induk: CSV (input dan output) dan JSON (output) |
FieldDelimiter | String | Opsional. Elemen ini menentukan delimeter yang ingin Anda gunakan untuk memisahkan kolom dalam objek CSV. Nilai elemen ini harus di-enkode Base64. Nilai default: Node anak: none Node induk: CSV (input dan output) |
QuoteCharacter | String | Opsional. Elemen ini menentukan karakter kutipan yang di-enkode Base64 yang ingin Anda gunakan dalam objek CSV. Nilai default: Node anak: none Node induk: CSV (input) |
CommentCharacter | String | Karakter komentar yang ingin Anda gunakan dalam objek CSV. Nilai elemen ini harus di-enkode Base64. Elemen ini kosong secara default. |
Range | String | Opsional. Elemen ini menentukan rentang query. Metode query berikut didukung: Catatan SelectMeta harus dibuat untuk objek yang di-query berdasarkan Range.
Parameter start dan end bersifat inklusif. Kedua parameter sebelumnya menggunakan format yang sama dengan parameter range dalam range get. Parameter ini hanya dapat digunakan jika objek dalam format CSV atau jika tipe JSON adalah LINES. Node anak: none Node induk: CSV (input) dan JSON (output) |
KeepAllColumns | bool | Opsional. Elemen ini menentukan apakah semua kolom dalam objek CSV disertakan dalam respons. Nilai default: false. Hanya kolom yang disertakan dalam klausa SELECT yang berisi nilai. Kolom dalam respons diurutkan dalam urutan menaik nomor kolom. Contoh:
Jika Anda mengatur KeepAllColumns ke true dan enam kolom disertakan dalam objek CSV, hasil berikut dikembalikan untuk klausa SELECT sebelumnya: Nilai kolom 1,,,,Nilai kolom 5,\n Node anak: none Node induk: OutputSerialization (CSV) |
EnablePayloadCrc | bool | Nilai CRC-32 untuk verifikasi setiap frame. Klien dapat menghitung nilai CRC-32 dari setiap payload dan membandingkannya dengan nilai CRC-32 yang disertakan untuk memverifikasi integritas data. Node anak: none Node induk: OutputSerialization |
Options | Container | Parameter opsional lainnya. Node anak: SkipPartialDataRecord dan MaxSkippedRecordsAllowed Node induk: SelectRequest |
OutputHeader | bool | Menentukan apakah informasi header tentang objek CSV disertakan di awal respons. Nilai default: false. Node anak: none Node induk: OutputSerialization |
SkipPartialDataRecord | bool | Menentukan apakah akan mengabaikan baris di mana data hilang. Jika parameter ini diatur ke false, OSS memproses data baris sebagai null tanpa melaporkan kesalahan. Jika parameter ini diatur ke true, baris yang tidak berisi data dilewati. Jika jumlah baris yang dilewati telah melebihi jumlah maksimum baris yang dapat dilewati, OSS melaporkan kesalahan dan menghentikan pemrosesan data. Nilai default: false. Node anak: none Node induk: Options |
MaxSkippedRecordsAllowed | Int | Jumlah maksimum baris yang dapat dilewati. Jika baris tidak sesuai dengan tipe yang ditentukan dalam pernyataan SQL, atau jika satu atau lebih kolom dalam baris hilang dan nilai SkipPartialDataRecord adalah true, baris tersebut dilewati. Jika jumlah baris yang dilewati telah melebihi nilai parameter ini, OSS melaporkan kesalahan dan menghentikan pemrosesan data. Catatan Jika baris dalam objek CSV tidak diformat dengan benar, OSS menghentikan pemrosesan data dan melaporkan kesalahan karena kesalahan format ini dapat mengakibatkan penguraian objek CSV yang salah. Sebagai contoh, kolom dalam baris mencakup karakter kutipan ganjil berturut-turut. Parameter ini dapat digunakan untuk memodifikasi toleransi terhadap data yang tidak teratur tetapi tidak dapat dikonfigurasikan untuk objek CSV yang tidak valid. Nilai default: 0. Node anak: none Node induk: Options |
ParseJsonNumberAsString | bool | Menentukan apakah akan mengurai bilangan bulat dan pecahan dalam objek JSON menjadi string. Presisi bilangan pecahan dalam objek JSON berkurang saat bilangan tersebut diurai. Jika Anda ingin mempertahankan data mentah, kami sarankan Anda mengatur parameter ini ke true. Untuk menggunakan bilangan yang diurai dalam perhitungan, Anda dapat menggunakan fungsi CAST dalam SQL untuk mengonversi data yang diurai ke tipe yang diperlukan seperti INT, DOUBLE, atau DECIMAL. Nilai default: false. Node anak: none Node induk: JSON |
AllowQuotedRecordDelimiter | bool | Menentukan apakah objek CSV dapat berisi pindah baris dalam tanda kutip ("). Sebagai contoh, jika nilai kolom adalah "abc\ndef" dan \n adalah pindah baris, atur parameter ini ke true. Jika parameter ini diatur ke false, Anda dapat memanggil operasi SelectObject untuk menentukan rentang dalam header permintaan untuk melakukan query multipart yang lebih efisien. Nilai default: true. Node anak: none Node induk: InputSerialization |
Badan respons
Jika kode status HTTP dalam respons adalah 4xx, permintaan gagal melewati pemeriksaan sintaks SQL atau mengandung kesalahan. Dalam hal ini, format badan pesan kesalahan yang dikembalikan sama dengan format pesan kesalahan untuk permintaan GetObject.
Jika kode status HTTP dalam respons adalah 5xx, terjadi kesalahan server internal. Dalam hal ini, format badan pesan kesalahan yang dikembalikan sama dengan format pesan kesalahan untuk permintaan GetObject.
Kode status HTTP 206 dikembalikan jika operasi berhasil.
Jika nilai header x-oss-select-output-raw adalah true, data objek kecuali data berbasis frame dikembalikan. Klien dapat memperoleh data dengan cara yang sama seperti operasi GetObject.
Jika nilai x-oss-select-output-raw adalah false, hasilnya dikembalikan sebagai frame.
Frame dikembalikan dalam format
Version|Frame-Type | Payload Length | Header Checksum | Payload | Payload Checksum<1 byte><--3 bytes--><---4 bytes----><-------4 bytes--><variable><----4bytes---------->.CatatanNilai Checksum dalam frame adalah CRC-32. Semua bilangan bulat dalam frame adalah big-endian. Saat ini, nilai Version adalah 1.
Tipe Frame
Tabel berikut menjelaskan tiga tipe frame yang didukung oleh SelectObject.
Tipe frame | Nilai | Format payload | Deskripsi |
Data Frame | 8388609 | offset | data<-8 bytes><---variable-> | Data yang dikembalikan untuk permintaan SelectObject. Nilai parameter offset adalah bilangan bulat 8-bit yang menunjukkan lokasi pemindaian saat ini (offset dari header file). Parameter ini digunakan untuk melaporkan kemajuan operasi. |
Continuous Frame | 8388612 | offset<----8 bytes--> | Frame yang digunakan untuk melaporkan kemajuan operasi dan mempertahankan koneksi HTTP. Jika tidak ada data yang dikembalikan untuk permintaan query dalam 5 detik, frame kontinu dikembalikan. |
End Frame | 8388613 | offset | total scanned bytes | http status code | error message<--8bytes-><--8bytes---------><----4 bytes--------><-variable------> | Frame akhir digunakan untuk mengembalikan status akhir operasi, termasuk byte yang dipindai dan pesan kesalahan yang mungkin terjadi.
|
Permintaan contoh
Permintaan contoh berikut digunakan untuk memanggil SelectObject untuk objek CSV dan JSON:
Permintaan contoh untuk objek CSV
POST /oss-select/bigcsv_normal.csv?x-oss-process=csv%2Fselect HTTP/1.1 Date: Fri, 25 May 2018 22:11:39 GMT Content-Type: Authorization: OSS4-HMAC-SHA256 Credential=LTAI********************/20250417/cn-hangzhou/oss/aliyun_v4_request,AdditionalHeaders=content-length,Signature=a7c3554c729d71929e0b84489addee6b2e8d5cb48595adfc51868c299c0c218e User-Agent: aliyun-sdk-dotnet/2.8.0.0(windows 16.7/16.7.0.0/x86;4.0.30319.42000) Content-Length: 748 Expect: 100-continue Connection: keep-alive Host: nama host <?xml version="1.0"?> <SelectRequest> <Expression>c2VsZWN0IGNvdW50KCopIGZyb20gb3Nzb2JqZWN0IHdoZXJlIF80ID4gNDU= </Expression> <InputSerialization> <Compression>None</Compression> <CSV> <FileHeaderInfo>Ignore</FileHeaderInfo> <RecordDelimiter>Cg==</RecordDelimiter> <FieldDelimiter>LA==</FieldDelimiter> <QuoteCharacter>Ig==</QuoteCharacter> <CommentCharacter>Iw==</CommentCharacter/> </CSV> </InputSerialization> <OutputSerialization> <CSV> <RecordDelimiter>Cg==</RecordDelimiter> <FieldDelimiter>LA==</FieldDelimiter> <QuoteCharacter>Ig==</QuoteCharacter> </CSV> <KeepAllColumns>false</KeepAllColumns> <OutputRawData>false</OutputRawData> </OutputSerialization> </SelectRequest>Permintaan contoh untuk objek JSON
POST /oss-select/sample_json.json?x-oss-process=json%2Fselect HTTP/1.1 Host: nama host Accept-Encoding: identity User-Agent: aliyun-sdk-python/2.6.0(Darwin/16.7.0/x86_64;3.5.4) Accept: */* Connection: keep-alive date: Mon, 10 Dec 2018 18:28:11 GMT authorization: OSS4-HMAC-SHA256 Credential=LTAI********************/20250417/cn-hangzhou/oss/aliyun_v4_request,AdditionalHeaders=content-length,Signature=a7c3554c729d71929e0b84489addee6b2e8d5cb48595adfc51868c299c0c218e Content-Length: 317 <SelectRequest> <Expression>c2VsZWN0ICogZnJvbSBvc3NvYmplY3Qub2JqZWN0c1sqXSB3aGVyZSBwYXJ0eSA9ICdEZW1vY3JhdCc= </Expression> <InputSerialization> <JSON> <Type>DOCUMENT</Type> </JSON> </InputSerialization> <OutputSerialization> <JSON> <RecordDelimiter>LA==</RecordDelimiter> </JSON> </OutputSerialization> <Options /> </SelectRequest>
Ekspresi reguler dalam pernyataan SQL
Dalam contoh ini, SELECT select-list from table where_opt limit_opt menunjukkan ekspresi reguler dalam pernyataan SQL.
Kata kunci berikut tidak dapat diubah: SELECT dan WHERE.
select_list: nama kolom
| indeks kolom (Contoh: _1, _2. Indeks kolom hanya berlaku untuk objek CSV.)
| jalur json (Contoh: s.contacts.firstname. Jalur json hanya berlaku untuk objek JSON.)
| fungsi(indeks kolom | nama kolom)
| fungsi(jalur json) (hanya berlaku untuk objek JSON.)
| select_list AS aliasFungsi berikut didukung: AVG, SUM, MAX, MIN, COUNT, dan CAST (fungsi konversi tipe). Anda hanya dapat menentukan asterisk (*) setelah COUNT.
table: OSSOBJECT
| OSSOBJECT jalur json (hanya berlaku untuk objek JSON.)
Jika Anda ingin melakukan operasi pada objek CSV, Anda harus menggunakan tabel OSSOBJECT. Jika Anda ingin melakukan operasi pada objek JSON termasuk objek tipe DOCUMENT dan LINES, Anda dapat menentukan jalur json setelah OSSOBJECT.
jalur json: ['string '] (Tanda kutip yang digunakan untuk mengapit string dapat dihapus jika string tidak mencakup spasi atau asterisk (*). Dalam hal ini, ['string '] setara dengan .'string '.)
| [n] (menunjukkan elemen ke-n dalam array. Nilai n dihitung mulai dari 0.)
| [*] (menunjukkan elemen anak dalam array atau objek.)
| .'string ' (Tanda kutip yang digunakan untuk mengapit string dapat dihapus jika string tidak mencakup spasi atau asterisk (*).)
| jalur json jalur json (Anda dapat menggabungkan beberapa elemen dalam jalur json seperti [n].property1.attributes[*].)Where_opt:
| WHERE expr
expr:
| nilai literal
| nama kolom
| indeks kolom
| jalur json (hanya berlaku untuk objek JSON.)
| expr op expr
| expr OR expr
| expr AND expr
| expr IS NULL
| expr IS NOT NULL
| (nama kolom | indeks kolom | jalur json) IN (nilai1, nilai2, ...)
| (nama kolom | indeks kolom | jalur json) NOT in (nilai1, nilai2, ...)
| (nama kolom | indeks kolom | jalur json) between nilai1 and nilai2
| NOT (expr)
| expr op expr
| (expr)
| cast (indeks kolom |nama kolom | jalur json | literal as INT|DOUBLE|)op: mencakup operator berikut:
>,<,>=,<=,!=,=,,,LIKE,+,-,*,/,%, dan||.cast: Anda dapat menggunakan fungsi CAST untuk mengonversi data dalam kolom dari satu tipe ke tipe lain.
Kombinasi fungsi agregasi dan limit:
Select avg(cast(_1 as int)) from ossobject limit 100. Pernyataan sebelumnya menghitung nilai rata-rata kolom pertama dalam 100 baris pertama. Fungsi ini berbeda dari pernyataan yang didukung oleh MySQL karena hanya satu baris yang dikembalikan untuk fungsi agregasi dalam operasi SelectObject. Oleh karena itu, tidak ada batasan yang dikonfigurasikan untuk ukuran data keluaran. Operasi limit dilakukan sebelum operasi agregasi saat Anda memanggil SelectObject.
Batasan pada pernyataan SQL
Berikut adalah batasan yang berlaku untuk pernyataan SQL:
Hanya objek teks yang dikodekan dalam UTF-8 dan objek teks UTF-8 yang dikompresi dalam format GZIP yang didukung. Format deflate tidak didukung untuk objek GZIP.
Hanya satu objek yang dapat di-query saat menggunakan pernyataan SQL. Klausul berikut tidak didukung: JOIN, ORDER BY, GROUP BY, dan HAVING.
Klausul WHERE tidak dapat mencakup kondisi agregasi. Sebagai contoh, klausa berikut tidak diizinkan: WHERE max(cast(age as int)) > 100.
Maksimum 1.000 kolom dapat ditentukan untuk pernyataan SQL. Nama kolom dalam pernyataan SQL dapat memiliki panjang hingga 1.024 byte.
Maksimum lima wildcard (%) didukung dalam klausa LIKE. Tanda persen (%) dan asterisk (*) adalah wildcard yang menunjukkan nol atau lebih karakter. Kata kunci ESCAPE didukung untuk klausa SQL LIKE, dan digunakan untuk mengonversi karakter khusus seperti tanda persen (%), asterisk (*), dan tanda tanya (?) menjadi string normal.
Maksimum 1.024 konstanta didukung dalam klausa IN.
Proyeksi yang ditentukan setelah SELECT dapat berupa nama kolom, indeks kolom CSV (seperti _1 atau _2), fungsi agregasi, atau fungsi CAST. Ekspresi lainnya tidak didukung, seperti select _1 + _2 from ossobject.
Ukuran kolom maksimum dan ukuran baris untuk objek CSV adalah 256 KB.
Jalur JSON yang ditentukan setelah FROM mendukung node JSON yang ukuran maksimumnya adalah 512 KB. Jalur tersebut dapat berisi hingga 10 level, dan array dapat berisi hingga 5.000 elemen. Bidang yang ditentukan setelah SELECT dan WHERE harus berasal dari node yang sesuai dengan jalur JSON yang ditentukan setelah FROM.
Dalam pernyataan SQL objek JSON, ekspresi SELECT atau WHERE tidak dapat mencakup wildcard array ([*]). Wildcard array ([*]) dapat disertakan hanya dalam jalur JSON yang ditentukan setelah FROM. Sebagai contoh, Anda dapat menggunakan select * from ossobject.contacts[*] sebagai ganti select s.contacts[*] from ossobject s.
Ukuran maksimum pernyataan SQL adalah 16 KB. Hingga 20 ekspresi dapat ditambahkan setelah WHERE. Setiap pernyataan mendukung hingga 10 level dan 100 operasi agregasi.
Penanganan kesalahan data
Berikut adalah daftar metode umum yang digunakan untuk menangani kesalahan data.
Beberapa kolom hilang di beberapa baris dalam objek CSV.
Jika SkipPartialDataRecord tidak ditentukan atau diatur ke false, OSS menghitung ekspresi dalam pernyataan SQL dengan memproses nilai kolom yang hilang sebagai null.
Jika SkipPartialDataRecord diatur ke true, OSS mengabaikan baris di mana beberapa kolom hilang. Dalam hal ini, jika MaxSkippedRecordsAllowed tidak ditentukan atau diatur ke nilai yang lebih kecil dari jumlah baris yang dilewati, OSS melaporkan kesalahan dengan mengirimkan kode status HTTP 400 atau menyertakan kode status HTTP 400 dalam frame akhir.
Anggaplah pernyataan SQL
select _1, _3 from ossobjectdieksekusi, dan data dalam baris objek CSV adalah "John, Company A".Jika SkipPartialDataRecord diatur ke false, "John,\n" dikembalikan.
Jika SkipPartialDataRecord diatur ke true, baris ini dilewati.
Beberapa kunci hilang dalam objek JSON.
Beberapa objek JSON mungkin tidak menyertakan kunci yang ditentukan dalam pernyataan SQL.
Jika SkipPartialDataRecord tidak ditentukan atau diatur ke false, OSS menghitung ekspresi dalam pernyataan SQL dengan memproses kunci yang hilang sebagai null.
Jika SkipPartialDataRecord diatur ke true, OSS melewati data dalam node JSON. Dalam hal ini, jika MaxSkippedRecordsAllowed tidak ditentukan atau diatur ke nilai yang lebih kecil dari jumlah baris yang dilewati, OSS melaporkan kesalahan dengan mengirimkan kode status HTTP 400 atau menyertakan kode status HTTP 400 dalam frame akhir.
Anggaplah pernyataan SQL
select s.firstName, s.lastName , s.age from ossobject.contacts[*] sdieksekusi, dan nilai node JSON adalah {"firstName":"John", "lastName":"Smith"}.Jika SkipPartialDataRecord tidak ditentukan atau diatur ke false, {"firstName":"John", "lastName":"Smith"} dikembalikan.
Jika SkipPartialDataRecord diatur ke true, baris ini dilewati.
CatatanUntuk kunci dalam data yang dikembalikan dari permintaan untuk objek JSON, objek JSON keluaran hanya dapat berupa LINES. Nilai Kunci dalam output dikembalikan berdasarkan aturan berikut:
Anggaplah pernyataan SQL
select * from ossobject…dieksekusi. Jika * sesuai dengan objek JSON ({...}), objek JSON dikembalikan. Jika * sesuai dengan string atau array, string atau array dikembalikan sebagai DummyKey _1.Jika {"Age":5}
select * from ossobject.Age s where s = 5digunakan, {"_1":5} dikembalikan karena nilai 5 yang sesuai dengan * bukan objek JSON. Saat pernyataan SQLselect * from ossobject s where s.Age = 5dieksekusi, {"Age":5} yang sesuai dengan * dikembalikan.Jika pernyataan SQL tidak menggunakan select * tetapi menentukan kolom, konten yang dikembalikan berada dalam format
{"{Kolom 1}": Nilai, "{Kolom 2}": Nilai...}. {Kolom n} dapat dibuat menggunakan metode berikut:Jika alias kolom ditentukan dalam klausa SELECT, alias tersebut berlaku.
Jika nama kolom adalah kunci objek JSON, kunci ini digunakan sebagai nilai kunci keluaran.
Jika kolom adalah elemen array JSON atau fungsi agregasi, awali nama kolom dengan nomor seri (mulai dari 1) dan garis bawah (_) sebagai nilai kunci keluaran.
Anggaplah {"contacts":{"Age":35, "Children":["child1", "child2", "child3"]}} digunakan:
Saat pernyataan SQL
select s.contacts.Age, s.contacts.Children[0] from ossobjectsdieksekusi, Age adalah kunci objek JSON input, dan Children[0] menunjukkan elemen pertama dari array Children dan merupakan kolom kedua dalam konten keluaran. Dalam hal ini, {"Age":35, "_2":"child1"} dikembalikan.Saat pernyataan SQL
select max(cast(s.Age as int)) from ossobject.contacts sdieksekusi dan kolom yang dipilih adalah fungsi agregasi, kolom tersebut diberi awalan _1 dan nomor serinya dalam keluaran. Dalam hal ini, {"_1":35} dikembalikan.Saat alias kolom ditentukan dalam pernyataan SQL
select s.contacts.Age, s.contacts.Children[0] as firstChild from ossobject, {"Age":35, "firstChild":"child1"} dikembalikan.
Kunci yang cocok dengan objek JSON dan pernyataan SQL bersifat peka huruf besar-kecil. Sebagai contoh, "select s. Age" dan "select s. age" berbeda.
Tipe data beberapa kolom dalam objek CSV tidak sesuai dengan tipe data yang ditentukan dalam pernyataan SQL.
Jika tipe data baris dalam objek CSV tidak sesuai dengan tipe yang ditentukan dalam pernyataan SQL, baris tersebut dilewati. Jika jumlah baris yang dilewati melebihi nilai MaxSkippedRecordsAllowed, OSS menghentikan pemrosesan data dan mengembalikan kode status HTTP 400.
Anggaplah pernyataan SQL
select _1, _3 from ossobject where _3 > 5dieksekusi. Jika nilai baris dalam objek CSV adalahJohn, Company A, To be hired, baris ini dilewati karena kolom ketiga dalam baris tersebut bukan bertipe integer.Tipe data beberapa kunci dalam objek JSON tidak sesuai dengan tipe data yang ditentukan dalam pernyataan SQL.
Anggaplah pernyataan SQL
select s.name from ossobject s where s.aliren_age > 5dieksekusi. Jika nilai node JSON adalah{"Name":"John", "Career_age": To be hired}, node ini dilewati.
Format waktu yang didukung
Tabel berikut mencantumkan format yang dapat dikonversi menjadi timestamp tanpa perlu menentukan format waktu. Sebagai contoh, string cast('20121201' as timestamp) secara otomatis diurai sebagai timestamp tanggal 1 Desember 2012.
Format | Deskripsi |
YYYYMMDD | tahun bulan hari |
YYYY/MM/DD | tahun/bulan/hari |
DD/MM/YYYY/ | hari/bulan/tahun |
YYYY-MM-DD | tahun-bulan-hari |
DD-MM-YY | hari-bulan-tahun |
DD.MM.YY | hari. bulan. tahun |
HH:MM:SS.mss | jam:menit:detik. milidetik |
HH:MM:SS | jam:menit:detik |
HH MM SS mss | jam menit detik milidetik |
HH.MM.SS.mss | jam. menit. detik. milidetik |
HHMM | jam menit |
HHMMSSmss | jam menit detik milidetik |
YYYYMMDD HH:MM:SS.mss | tahun bulan hari jam:menit:detik. milidetik |
YYYY/MM/DD HH:MM:SS.mss | tahun/bulan/hari jam:menit:detik. milidetik |
DD/MM/YYYY HH:MM:SS.mss | hari/bulan/tahun jam:menit:detik. milidetik |
YYYYMMDD HH:MM:SS | tahun bulan hari jam:menit:detik |
YYYY/MM/DD HH:MM:SS | tahun/bulan/hari jam:menit:detik |
DD/MM/YYYY HH:MM:SS | hari/bulan/tahun jam:menit:detik |
YYYY-MM-DD HH:MM:SS.mss | tahun-bulan-hari jam:menit:detik. milidetik |
DD-MM-YYYY HH:MM:SS.mss | hari-bulan-tahun jam:menit:detik. milidetik |
YYYY-MM-DD HH:MM:SS | tahun-bulan-hari jam:menit:detik |
YYYYMMDDTHH:MM:SS | tahun bulan hari T jam:menit:detik |
YYYYMMDDTHH:MM:SS.mss | tahun bulan hari T jam:menit:detik. milidetik |
DD-MM-YYYYTHH:MM:SS.mss | hari-bulan-tahun T jam:menit:detik. milidetik |
DD-MM-YYYYTHH:MM:SS | hari-bulan-tahun T jam:menit:detik |
YYYYMMDDTHHMM | tahun bulan hari T jam menit |
YYYYMMDDTHHMMSS | tahun bulan hari T jam menit detik |
YYYYMMDDTHHMMSSMSS | tahun bulan hari T jam menit detik milidetik |
ISO8601-0 | tahun-bulan-hari T jam:menit+jam:menit, atau tahun-bulan-hari T jam:menit-jam:menit "+" menunjukkan bahwa waktu lokal di zona waktu saat ini lebih lambat dari waktu UTC standar. "-" menunjukkan bahwa waktu lokal di zona waktu saat ini lebih awal dari waktu UTC standar. Dalam format ini, ISO8601-0 dapat digunakan. |
ISO8601-1 | tahun-bulan-hari T jam:menit+jam:menit, atau tahun-bulan-hari T jam:menit-jam:menit "+" menunjukkan bahwa waktu lokal di zona waktu saat ini lebih lambat dari waktu UTC standar. "-" menunjukkan bahwa waktu lokal di zona waktu saat ini lebih awal dari waktu UTC standar. Dalam format ini, ISO 8601-1 dapat digunakan. |
CommonLog | Contoh: 28/Feb/2017:12:30:51 +0700 |
RFC822 | Contoh: Tue, 28 Feb 2017 12:30:51 GMT |
?D/?M/YY | hari/bulan/tahun, di mana hari dan bulan bisa satu atau dua digit. |
?D/?M/YY ?H:?M | hari/bulan/tahun/jam:menit, di mana hari, bulan, jam, dan menit bisa satu atau dua digit. |
?D/?M/YY ?H:?M:?S | hari/bulan/tahun/jam:menit:detik, di mana hari, bulan, jam, menit, dan detik bisa satu atau dua digit. |
Tabel berikut mencantumkan format yang mungkin menyebabkan kesalahan. Anda harus menentukan format waktu saat menggunakan string dalam format ini. Sebagai contoh, pernyataan cast('20121201' as timestamp format 'YYYYDDMM') salah mengurai string 20121201 sebagai tanggal 12 Januari 2012.
Format | Deskripsi |
YYYYDDMM | tahun hari bulan |
YYYY/DD/MM | tahun/hari/bulan |
MM/DD/YYYY | bulan/hari/tahun |
YYYY-DD-MM | tahun-hari-bulan |
MM-DD-YYYY | bulan-hari-tahun |
MM.DD.YYYY | bulan.hari.tahun |
Kode Kesalahan
SelectObject mengembalikan kode kesalahan dengan menggunakan metode berikut:
Kode status HTTP disertakan dalam header respons dan kode kesalahan disertakan dalam badan respons, yang sama dengan permintaan OSS lainnya. Kode kesalahan yang dikembalikan dengan cara ini menunjukkan bahwa terjadi kesalahan input seperti pernyataan SQL yang tidak valid atau kesalahan data.
Kode kesalahan disertakan dalam frame akhir badan respons. Kode kesalahan yang dikembalikan dengan cara ini menunjukkan bahwa data tidak benar atau tidak sesuai dengan tipe data yang ditentukan dalam pernyataan SQL. Sebagai contoh, string ada di kolom yang tipenya diatur ke integer dalam pernyataan SQL. Dalam hal ini, sebagian data diproses, lalu kode status HTTP 206 dan data yang diproses dikirim ke klien.
Kode kesalahan seperti InvalidCSVLine dapat dikembalikan sebagai kode status HTTP dalam header respons atau sebagai kode status dalam frame akhir berdasarkan lokasi baris kesalahan dalam objek CSV.
KodeKesalahan | Deskripsi | Kode Status HTTP | Kode Status HTTP dalam Frame Akhir |
InvalidSqlParameter | Pesan kesalahan yang dikembalikan karena parameter SQL yang ditentukan tidak ada. Pernyataan SQL dalam permintaan adalah null, ukuran pernyataan SQL telah melebihi batas atas, atau pernyataan SQL tidak di-enkode Base64. | 400 | Tidak ada |
InvalidInputFieldDelimiter | Pesan kesalahan yang dikembalikan karena objek CSV input berisi pemisah kolom yang tidak valid. Parameter tidak di-enkode Base64, atau ukuran parameter lebih besar dari 1 byte setelah parameter didekode. | 400 | Tidak ada |
InvalidInputRecordDelimiter | Pesan kesalahan yang dikembalikan karena objek CSV input berisi pemisah baris yang tidak valid. Parameter tidak di-enkode Base64, atau ukuran parameter lebih besar dari 2 byte setelah parameter didekode. | 400 | Tidak ada |
InvalidInputQuote | Pesan kesalahan yang dikembalikan karena objek CSV input berisi karakter kutipan yang tidak valid. Parameter tidak di-enkode Base64, atau ukuran parameter lebih besar dari 1 byte setelah parameter didekode. | 400 | Tidak ada |
InvalidOutputFieldDelimiter | Pesan kesalahan yang dikembalikan karena objek CSV output berisi pemisah kolom yang tidak valid. Parameter tidak di-enkode Base64, atau ukuran parameter lebih besar dari 1 byte setelah parameter didekode. | 400 | Tidak ada |
InvalidOutputRecordDelimiter | Pesan kesalahan yang dikembalikan karena objek CSV output berisi pemisah baris yang tidak valid. Parameter tidak di-enkode Base64, atau ukuran parameter lebih besar dari 2 byte setelah parameter didekode. | 400 | Tidak ada |
UnsupportedCompressionFormat | Pesan kesalahan yang dikembalikan karena nilai parameter Compression bukan NONE atau GZIP. Nilai bersifat case-insensitive. | 400 | Tidak ada |
InvalidCommentCharacter | Pesan kesalahan yang dikembalikan karena objek CSV berisi karakter komentar yang tidak valid. Parameter tidak di-enkode Base64, atau ukuran parameter lebih besar dari 1 byte setelah parameter didekode. | 400 | Tidak ada |
InvalidRange | Pesan kesalahan yang dikembalikan karena parameter Range tidak diawali dengan line-range= atau split-range=, atau nilai rentang tidak sesuai dengan standar HTTP untuk Range. | 400 | Tidak ada |
DecompressFailure | Pesan kesalahan yang dikembalikan karena nilai Compression adalah GZIP dan objek tidak dapat diekstrak. | 400 | Tidak ada |
InvalidMaxSkippedRecordsAllowed | Pesan kesalahan yang dikembalikan karena nilai MaxSkippedRecordsAllowed bukan bilangan bulat. | 400 | Tidak ada |
SelectCsvMetaUnavailable | Pesan kesalahan yang dikembalikan karena objek tidak termasuk CSV Meta saat parameter Range ditentukan. Panggil operasi CreateSelectObjectMeta terlebih dahulu. | 400 | Tidak ada |
InvalidTextEncoding | Pesan kesalahan yang dikembalikan karena objek tidak di-enkode UTF-8. | 400 | Tidak ada |
InvalidOSSSelectParameters | Pesan kesalahan yang dikembalikan karena parameter EnablePayloadCrc dan OutputRawData diatur ke true. Hal ini menghasilkan konflik. | 400 | Tidak ada |
InternalError | Pesan kesalahan yang dikembalikan karena terjadi kesalahan sistem OSS. | 500 atau 206 | 500 atau Tidak ada |
SqlSyntaxError | Pesan kesalahan yang dikembalikan karena sintaks pernyataan SQL yang didekode Base64 tidak valid. | 400 | Tidak ada |
SqlExceedsMaxInCount | Pesan kesalahan yang dikembalikan karena jumlah nilai yang disertakan dalam klausa IN SQL telah melebihi 1.024. | 400 | Tidak ada |
SqlExceedsMaxColumnNameLength | Pesan kesalahan yang dikembalikan karena ukuran nama kolom telah melebihi 1.024 byte. | 400 | Tidak ada |
SqlInvalidColumnIndex | Pesan kesalahan yang dikembalikan karena indeks kolom dalam pernyataan SQL lebih kecil dari 1 byte atau lebih besar dari 1.000 byte panjangnya. | 400 | Tidak ada |
SqlAggregationOnNonNumericType | Pesan kesalahan yang dikembalikan karena fungsi agregasi digunakan pada kolom non-numerik. | 400 | Tidak ada |
SqlInvalidAggregationOnTimestamp | Pesan kesalahan yang dikembalikan karena fungsi agregasi SUM atau AVG digunakan pada kolom timestamp. | 400 | Tidak ada |
SqlValueTypeOfInMustBeSame | Pesan kesalahan yang dikembalikan karena nilai tipe berbeda disertakan dalam klausa IN SQL. | 400 | Tidak ada |
SqlInvalidEscapeChar | Pesan kesalahan yang dikembalikan karena karakter escape yang tidak valid seperti tanda tanya (?), tanda persen (%), atau asterisk (*) ditentukan dalam klausa LIKE SQL. | 400 | Tidak ada |
SqlOnlyOneEscapeCharIsAllowed | Pesan kesalahan yang dikembalikan karena ukuran karakter escape dalam klausa LIKE SQL lebih besar dari 1 byte panjangnya. | 400 | Tidak ada |
SqlNoCharAfterEscapeChar | Pesan kesalahan yang dikembalikan karena tidak ada karakter yang ditentukan setelah karakter escape dalam klausa LIKE SQL. | 400 | Tidak ada |
SqlInvalidLimitValue | Pesan kesalahan yang dikembalikan karena angka yang ditentukan setelah klausa Limit SQL lebih kecil dari 1. | 400 | Tidak ada |
SqlExceedsMaxWildCardCount | Pesan kesalahan yang dikembalikan karena jumlah asterisk (*) atau tanda persen (%) dalam klausa LIKE SQL telah melebihi batas atas. | 400 | Tidak ada |
SqlExceedsMaxConditionCount | Pesan kesalahan yang dikembalikan karena jumlah ekspresi kondisional dalam klausa WHERE SQL telah melebihi batas atas. | 400 | Tidak ada |
SqlExceedsMaxConditionDepth | Pesan kesalahan yang dikembalikan karena kedalaman pohon kondisional dalam klausa WHERE SQL telah melebihi batas atas. | 400 | Tidak ada |
SqlOneColumnCastToDifferentTypes | Pesan kesalahan yang dikembalikan karena kolom diubah menjadi tipe berbeda dengan menyertakan fungsi CAST dalam pernyataan SQL. | 400 | Tidak ada |
SqlOperationAppliedToDifferentTypes | Pesan kesalahan yang dikembalikan karena operator digunakan untuk dua objek tipe berbeda dalam pernyataan SQL. Sebagai contoh, kode kesalahan ini dikembalikan jika col1 dalam _col1 > 3 adalah string. | 400 | Tidak ada |
SqlInvalidColumnName | Pesan kesalahan yang dikembalikan karena nama kolom yang digunakan dalam pernyataan SQL tidak termasuk dalam header objek CSV. | 400 | Tidak ada |
SqlNotSupportedTimestampFormat | Pesan kesalahan yang dikembalikan karena format timestamp yang ditentukan dalam klausa CAST SQL tidak didukung. | 400 | Tidak ada |
SqlNotMatchTimestampFormat | Pesan kesalahan yang dikembalikan karena format timestamp yang ditentukan dalam klausa CAST SQL tidak cocok dengan string timestamp. | 400 | Tidak ada |
SqlInvalidTimestampValue | Pesan kesalahan yang dikembalikan karena tidak ada format timestamp yang ditentukan dalam klausa CAST SQL dan string yang ditentukan tidak dapat dikonversi menjadi timestamp. | 400 | Tidak ada |
SqlInvalidLikeOperand | Pesan kesalahan yang dikembalikan karena nama kolom atau indeks kolom di sisi kiri tidak ditentukan dalam klausa LIKE SQL, kolom yang ditentukan di sisi kiri bukan bertipe string, atau kolom di sisi kanan dalam klausa LIKE bertipe string. | 400 | Tidak ada |
SqlInvalidMixOfAggregationAndColumn | Pesan kesalahan yang dikembalikan karena klausa SELECT SQL mencakup nama kolom dan indeks kolom untuk fungsi agregasi dan non-agregasi. | 400 | Tidak ada |
SqlExceedsMaxAggregationCount | Pesan kesalahan yang dikembalikan karena jumlah fungsi agregasi yang disertakan dalam klausa SELECT SQL telah melebihi batas atas. | 400 | Tidak ada |
SqlInvalidMixOfStarAndColumn | Pesan kesalahan yang dikembalikan karena asterisk (*), nama kolom, dan indeks kolom disertakan dalam pernyataan SQL yang sama. | 400 | Tidak ada |
SqlInvalidKeepAllColumnsWithAggregation | Pesan kesalahan yang dikembalikan karena pernyataan SQL mencakup fungsi agregasi dan parameter KeepAllColumns diatur ke true. | 400 | Tidak ada |
SqlInvalidKeepAllColumnsWithDuplicateColumn | Pesan kesalahan yang dikembalikan karena pernyataan SQL mencakup nama kolom atau indeks kolom yang berulang dan parameter KeepAllColumns diatur ke true. | 400 | Tidak ada |
SqlInvalidSqlAfterAnalysis | Pesan kesalahan yang dikembalikan karena pernyataan SQL kompleks dan pernyataan SQL yang diurai tidak didukung. | 400 | Tidak ada |
InvalidArithmeticOperand | Pesan kesalahan yang dikembalikan karena pernyataan SQL berisi operasi aritmatika yang dilakukan pada konstanta non-numerik atau kolom. | 400 | Tidak ada |
SqlInvalidAndOperand | Pesan kesalahan yang dikembalikan karena ekspresi yang digabungkan oleh operator AND dalam pernyataan SQL bukan bertipe Boolean. | 400 | Tidak ada |
SqlInvalidOrOperand | Pesan kesalahan yang dikembalikan karena ekspresi yang digabungkan oleh operator OR dalam pernyataan SQL bukan bertipe Boolean. | 400 | Tidak ada |
SqlInvalidNotOperand | Pesan kesalahan yang dikembalikan karena ekspresi yang digabungkan oleh operator NOT dalam pernyataan SQL bukan bertipe Boolean. | 400 | Tidak ada |
SqlInvalidIsNullOperand | Pesan kesalahan yang dikembalikan karena pernyataan SQL menentukan operasi berbasis operator IS NULL yang dilakukan pada konstanta. | 400 | Tidak ada |
SqlComparerOperandTypeMismatch | Pesan kesalahan yang dikembalikan karena pernyataan SQL menentukan operasi berbasis operator perbandingan yang dilakukan pada dua objek tipe berbeda. | 400 | Tidak ada |
SqlInvalidConcatOperand | Pesan kesalahan yang dikembalikan karena pernyataan SQL berisi dua konstanta yang digabungkan oleh operator konkatenasi (||). | 400 | Tidak ada |
SqlUnsupportedSql | Pesan kesalahan yang dikembalikan karena pernyataan SQL kompleks dan ukuran rencana SQL yang dihasilkan telah melebihi batas atas. | 400 | Tidak ada |
HeaderInfoExceedsMaxSize | Pesan kesalahan yang dikembalikan karena ukuran informasi header yang ditentukan dalam pernyataan SQL telah melebihi batas atas. | 400 | Tidak ada |
OutputExceedsMaxSize | Pesan kesalahan yang dikembalikan karena ukuran baris dalam output telah melebihi batas atas. | 400 | Tidak ada |
InvalidCsvLine | Pesan kesalahan yang dikembalikan karena baris dalam objek CSV tidak valid atau ukuran baris telah melebihi batas atas, atau karena jumlah baris yang dilewati telah melebihi nilai MaxSkippedRecordsAllowed. | 400 atau 206 | 400 atau Tidak ada |
NegativeRowIndex | Pesan kesalahan yang dikembalikan karena nilai indeks array dalam pernyataan SQL adalah angka negatif. | 400 | Tidak ada |
ExceedsMaxNestedColumnDepth | Pesan kesalahan yang dikembalikan karena jumlah level bersarang dari objek JSON dalam pernyataan SQL telah melebihi batas atas. | 400 | Tidak ada |
NestedColumnNotSupportInCsv | Pesan kesalahan yang dikembalikan karena pernyataan SQL berisi kolom bersarang yang mencakup titik (.) atau array yang mencakup tanda kurung ([]). Karakter sebelumnya tidak didukung untuk pernyataan SQL objek CSV. | 400 | Tidak ada |
TableRootNodeOnlySupportInJson | Pesan kesalahan yang dikembalikan karena jalur node akar tidak ditentukan setelah From ossobject dalam objek JSON. | 400 | Tidak ada |
JsonNodeExceedsMaxSize | Pesan kesalahan yang dikembalikan karena ukuran node akar dalam objek JSON telah melebihi batas atas. | 400 atau 206 | 400 atau Tidak ada |
InvalidJsonData | Pesan kesalahan yang dikembalikan karena data JSON diformat dengan salah. | 400 atau 206 | 400 atau Tidak ada |
ExceedsMaxJsonArraySize | Pesan kesalahan yang dikembalikan karena jumlah elemen dalam array di node akar objek JSON telah melebihi batas atas. | 400 atau 206 | 400 atau Tidak ada |
WildCardNotAllowed | Pesan kesalahan akan muncul karena tanda bintang (*) tidak dapat digunakan dalam klausa SQL SELECT atau klausa SQL WHERE untuk objek JSON. Sebagai contoh, kesalahan akan terjadi jika Anda mengeksekusi pernyataan berikut: | 400 | Tidak ada |
JsonNodeExceedsMaxDepth | Pesan kesalahan yang dikembalikan karena kedalaman node akar objek JSON telah melebihi batas atas. | 400 atau 206 | 400 atau Tidak ada |
ossutil
Untuk informasi tentang perintah ossutil yang sesuai dengan operasi SelectObject, lihat select-object.