Anda dapat menggunakan API SelectObject untuk mengeksekusi pernyataan SQL pada objek dan mengambil hasilnya.
Latar Belakang
Hadoop 3.0 mendukung menjalankan layanan seperti Spark, Hive, dan Presto di E-MapReduce (EMR) untuk memproses data yang disimpan di Object Storage Service (OSS). Layanan Alibaba Cloud seperti MaxCompute dan Data Lake Analytics (DLA) juga mendukung pemrosesan data langsung dari OSS.
Secara tradisional, platform data besar menggunakan API GetObject untuk mengunduh seluruh objek dari OSS sebelum difilter dan dianalisis.
API SelectObject mengatasi masalah ini dengan mendorong logika kueri, seperti proyeksi dan filter, ke lapisan OSS. Hal ini memungkinkan Anda hanya mengambil subset data yang dibutuhkan, sehingga mengurangi transfer data, menurunkan biaya, serta menghemat CPU dan memori di sisi client. Efisiensi ini membuat analisis data di OSS menjadi lebih menarik.
Penagihan
Saat menggunakan API SelectObject untuk mengkueri data, Anda dikenai biaya berdasarkan jumlah aktual data yang dipindai dari objek sumber. Untuk informasi selengkapnya, lihat Biaya pemrosesan data.
Format objek yang didukung
API SelectObject mendukung format objek dan sintaksis SQL tertentu.
Objek CSV yang sesuai dengan RFC 4180, termasuk objek mirip CSV seperti TSV. Anda dapat menentukan pemisah baris, pemisah kolom, dan karakter quote khusus.
Objek JSON yang dikodekan dalam UTF-8. Dua format didukung: DOCUMENT dan LINES.
DOCUMENT: Seluruh objek merupakan satu objek JSON yang valid.
LINES: Objek terdiri dari beberapa baris, di mana setiap baris merupakan objek JSON mandiri yang dipisahkan oleh karakter newline seperti \n atau \r\n. Anda tidak perlu menentukan delimiter, tetapi seluruh objek bukanlah objek JSON yang valid.
Objek dalam kelas penyimpanan Standard dan Infrequent Access. Objek dalam kelas penyimpanan Archive, Cold Archive, atau Deep Cold Archive harus dipulihkan terlebih dahulu sebelum dapat dikueri.
Objek yang dienkripsi menggunakan enkripsi sisi server dengan kunci yang dikelola OSS atau CMK yang dikelola oleh KMS.
Sintaksis SQL yang didukung
Klausa SQL: SELECT, FROM, WHERE
Tipe data: string, int (64-bit), double (64-bit), decimal (128-bit), timestamp, dan bool
Operator LIKE melakukan pencocokan pola yang peka huruf besar/kecil (case-sensitive).
Tipe data yang didukung
Secara default, semua data dalam objek CSV diperlakukan sebagai string. Anda dapat menggunakan fungsi CAST untuk melakukan konversi tipe eksplisit.
Contoh berikut menunjukkan cara menggunakan kueri SQL untuk mengonversi nilai di kolom _1 dan _2 menjadi integer:SELECT * FROM ossobject WHERE CAST(_1 AS int) > CAST(_2 AS int)
API SelectObject juga mendukung konversi tipe implisit dalam klausa WHERE. Misalnya, dalam pernyataan berikut, nilai di kolom pertama dan kedua secara implisit dikonversi menjadi integer:
SELECT _1 FROM ossobject WHERE _1 + _2 > 100
Untuk objek JSON, jika Anda tidak menggunakan fungsi CAST, tipe data ditentukan oleh konten objek. Tipe data JSON bawaan standar meliputi null, bool, int64, double, dan string.
Contoh SQL
Bagian ini menyediakan contoh SQL untuk objek CSV dan JSON.
CSV
Kasus Penggunaan
Pernyataan SQL
Mengembalikan 10 baris data pertama.
SELECT * FROM ossobject LIMIT 10
Mengembalikan bilangan bulat dari kolom pertama dan ketiga di mana nilai pada kolom pertama lebih besar daripada nilai pada kolom ketiga.
SELECT _1, _3 FROM ossobject WHERE CAST(_1 AS int) > CAST(_3 AS int)
Mengembalikan jumlah catatan pada kolom pertama yang dimulai dengan '陈'. (Catatan: Karakter Tionghoa setelah 'LIKE' harus dikodekan dalam UTF-8.)
SELECT COUNT(*) FROM ossobject WHERE _1 LIKE 'Chen%'
Mengembalikan semua catatan di mana timestamp pada kolom kedua lebih baru dari 2018-08-09 11:30:25 dan nilai pada kolom ketiga lebih besar dari 200.
SELECT * FROM ossobject WHERE _2 > CAST('2018-08-09 11:30:25' AS timestamp) AND _3 > 200
Mengembalikan rata-rata, jumlah, maksimum, dan minimum bilangan titik mengambang pada kolom kedua.
SELECT AVG(CAST(_6 AS double)), SUM(CAST(_6 AS double)), MAX(CAST(_6 AS double)), MIN(CAST(_6 AS double)) FROM ossobject
Mengembalikan semua catatan di mana string gabungan dari kolom pertama dan ketiga dimulai dengan 'Tom' dan diakhiri dengan 'Anderson'.
SELECT * FROM ossobject WHERE (_1 || _3) LIKE 'Tom%Anderson'
Mengembalikan semua catatan di mana nilai pada kolom pertama habis dibagi 3.
SELECT * FROM ossobject WHERE (_1 % 3) = 0
Mengembalikan semua catatan di mana nilai pada kolom pertama berada di antara 1995 dan 2012.
SELECT * FROM ossobject WHERE _1 BETWEEN 1995 AND 2012
Mengembalikan semua catatan di mana nilai pada kolom kelima adalah 'N', 'M', 'G', atau 'L'.
SELECT * FROM ossobject WHERE _5 IN ('N', 'M', 'G', 'L')
Mengembalikan semua catatan di mana hasil perkalian nilai pada kolom kedua dan ketiga lebih besar daripada jumlah 100 dan nilai pada kolom kelima.
Mengembalikan semua catatan di mana nilai age adalah 27.
SELECT * FROM ossobject.contacts[*] s WHERE s.age = 27
Mengembalikan semua nomor telepon rumah.
SELECT s.number FROM ossobject.contacts[*].phoneNumbers[*] s WHERE s.type = "home"
Mengembalikan semua catatan di mana spouse bernilai null.
SELECT * FROM ossobject s WHERE s.spouse IS NULL
Mengembalikan semua catatan tanpa anak.
SELECT * FROM ossobject s WHERE s.children[0] IS NULL
Catatan
Tidak ada sintaksis khusus untuk merepresentasikan array kosong. Gunakan pernyataan di atas sebagai gantinya.
Kasus Penggunaan
Kasus penggunaan umum untuk SelectObject meliputi mengkueri objek besar secara paralel, mengkueri objek JSON, dan menganalisis file log.
Mengkueri objek besar secara paralel
Serupa dengan fitur unduh multipart berbasis rentang byte yang disediakan oleh API GetObject, API SelectObject mendukung kueri paralel. Anda dapat membagi data dengan dua cara:
Berdasarkan baris: Ini adalah metode umum untuk membagi data. Namun, untuk data sparse, pembagian berdasarkan baris dapat menyebabkan beban tidak seimbang di antara worker kueri.
Berdasarkan split: Split adalah konsep OSS untuk sharding data. Satu split berisi beberapa baris, dan setiap split memiliki ukuran yang kira-kira sama.
Catatan
Membagi data berdasarkan split lebih efisien daripada berdasarkan baris.
Jika Anda dapat memastikan bahwa kolom dalam objek CSV Anda tidak mengandung karakter newline, pembagian berdasarkan rentang byte lebih sederhana karena tidak memerlukan pembuatan metadata. Jika kolom mengandung karakter newline atau jika Anda mengkueri objek JSON, ikuti langkah-langkah berikut:
Panggil API CreateSelectObjectMeta untuk mendapatkan jumlah total split untuk objek tersebut. Untuk mengurangi waktu pemindaian, kami menyarankan memanggil API ini secara asinkron sebelum memulai kueri.
Berdasarkan sumber daya sisi client Anda, tentukan tingkat paralelisme (n). Kemudian, bagi jumlah total split dengan n untuk menghitung berapa banyak split yang harus diproses oleh setiap kueri paralel.
Dalam badan permintaan, tentukan rentang split yang akan dikueri, misalnya split-range=1-20.
Gabungkan hasil dari semua kueri paralel.
Mengkueri objek JSON
Saat mengkueri objek JSON, persempit jalur JSON (JSON path) dalam klausa FROM untuk meningkatkan kinerja.
Untuk menemukan semua alamat jalan di mana kode pos dimulai dengan '10021', Anda dapat menulis pernyataan SQL sebagai SELECT s.address.streetAddress FROM ossobject.contacts[*] s WHERE s.address.postalCode LIKE '10021%' atau SELECT s.streetAddress FROM ossobject.contacts[*].address s WHERE s.postalCode LIKE '10021%'.
Pernyataan kedua, SELECT s.streetAddress FROM ossobject.contacts[*].address s WHERE s.postalCode LIKE '10021%', memiliki kinerja lebih baik karena jalur JSON-nya lebih tepat.
Menangani bilangan titik mengambang presisi tinggi dalam objek JSON
Saat Anda perlu melakukan perhitungan dengan bilangan titik mengambang presisi tinggi dalam objek JSON, kami menyarankan mengatur opsi ParseJsonNumberAsString ke true lalu mengonversi nilai tersebut ke tipe decimal. Misalnya, jika atribut a memiliki nilai 123456789.123456789, Anda dapat menggunakan pernyataan SELECT s.a FROM ossobject s WHERE CAST(s.a AS decimal) > 123456789.12345 untuk mempertahankan presisi data aslinya.
Prosedur
Konsol OSS
Penting
Di Konsol OSS, Anda dapat mengekstrak maksimal 40 MB data dari objek yang ukurannya tidak lebih dari 128 MB.
Di panel navigasi kiri, klik Buckets. Pada halaman yang muncul, klik nama bucket target.
Di panel navigasi kiri, pilih Object Management > Objects.
Temukan objek target dan pilih > Select Content di kolom Actions.
Di panel Select Content, konfigurasikan parameter berdasarkan deskripsi berikut.
Parameter
Deskripsi
Object Type
Hanya tipe objek CSV dan JSON yang didukung.
Delimiter
Parameter ini hanya berlaku untuk objek CSV. Anda dapat memilih koma (,) atau delimiter khusus.
Title Row
Parameter ini hanya berlaku untuk objek CSV. Tentukan apakah baris pertama objek berisi header kolom.
JSON Format
Parameter ini hanya berlaku untuk objek JSON. Pilih format yang sesuai dengan objek JSON Anda.
Compression Format
Tentukan apakah objek Anda dikompresi. Hanya kompresi GZIP yang didukung.
Klik Preview.
Penting
Pratinjau objek dalam kelas penyimpanan Standard dikenai biaya pemindaian SelectObject. Untuk objek dalam kelas penyimpanan Infrequent Access, Archive, Cold Archive, atau Deep Cold Archive, pratinjau dikenai biaya pemindaian SelectObject dan biaya pengambilan data. Untuk informasi selengkapnya, lihat Biaya pemrosesan data.
Klik Next, lalu masukkan dan eksekusi pernyataan SQL.
Asumsikan Anda memiliki objek CSV bernama People dengan tiga kolom: Name, Company, dan Age.
Untuk menemukan orang yang berusia lebih dari 50 tahun dan namanya dimulai dengan 'Lora', Anda dapat menjalankan pernyataan SQL berikut. Dalam pernyataan tersebut, _1, _2, dan _3 adalah indeks kolom yang masing-masing merepresentasikan kolom pertama, kedua, dan ketiga.
select * from ossobject where _1 like 'Lora*' and _3 > 50
Untuk menghitung jumlah baris dalam objek dan menemukan usia maksimum serta minimum, Anda dapat menjalankan pernyataan SQL berikut:
select count(*), max(cast(_3 as int)), min(cast(_3 as int)) from ossobject
Lihat hasil eksekusi.
Anda juga dapat mengklik Download untuk menyimpan konten yang dipilih secara lokal.
OSS SDKs
Anda dapat mengkueri objek menggunakan OSS SDK untuk Java, Python, dan Go.
import com.aliyun.oss.ClientBuilderConfiguration;
import com.aliyun.oss.common.comm.SignVersion;
import com.aliyun.oss.model.*;
import com.aliyun.oss.OSS;
import com.aliyun.oss.common.auth.*;
import com.aliyun.oss.OSSClientBuilder;
import java.io.BufferedReader;
import java.io.ByteArrayInputStream;
import java.io.InputStreamReader;
/**
* Contoh pembuatan metadata select object dan select object.
*
*/
public class SelectObjectSample {
// Tentukan endpoint wilayah tempat bucket berada. Misalnya, jika bucket berada di wilayah China (Hangzhou), atur endpoint ke https://oss-cn-hangzhou.aliyuncs.com.
private static String endpoint = "https://oss-cn-hangzhou.aliyuncs.com";
// Tentukan nama bucket. Contoh: examplebucket.
private static String bucketName = "examplebucket";
public static void main(String[] args) throws Exception {
// Dapatkan kredensial akses dari variabel lingkungan. Sebelum menjalankan kode contoh, pastikan variabel lingkungan OSS_ACCESS_KEY_ID dan OSS_ACCESS_KEY_SECRET telah dikonfigurasi.
EnvironmentVariableCredentialsProvider credentialsProvider = CredentialsProviderFactory.newEnvironmentVariableCredentialsProvider();
// Tentukan wilayah tempat bucket berada. Misalnya, jika bucket berada di wilayah China (Hangzhou), atur wilayah ke cn-hangzhou.
String region = "cn-hangzhou";
// Buat instance OSSClient.
// Panggil metode shutdown untuk melepaskan sumber daya terkait saat OSSClient tidak lagi digunakan.
ClientBuilderConfiguration clientBuilderConfiguration = new ClientBuilderConfiguration();
clientBuilderConfiguration.setSignatureVersion(SignVersion.V4);
OSS ossClient = OSSClientBuilder.create()
.endpoint(endpoint)
.credentialsProvider(credentialsProvider)
.clientConfiguration(clientBuilderConfiguration)
.region(region)
.build();
// Tentukan path lengkap objek yang ingin Anda kueri, lalu kueri data objek tersebut menggunakan pernyataan SELECT. Jangan sertakan nama bucket dalam path lengkap.
// Tentukan path lengkap objek CSV.
selectCsvSample("test.csv", ossClient);
// Tentukan path lengkap objek JSON.
selectJsonSample("test.json", ossClient);
ossClient.shutdown();
}
private static void selectCsvSample(String key, OSS ossClient) throws Exception {
// Tentukan konten objek yang ingin Anda unggah.
String content = "name,school,company,age\r\n" +
"Lora Francis,School A,Staples Inc,27\r\n" +
"Eleanor Little,School B,\"Conectiv, Inc\",43\r\n" +
"Rosie Hughes,School C,Western Gas Resources Inc,44\r\n" +
"Lawrence Ross,School D,MetLife Inc.,24";
ossClient.putObject(bucketName, key, new ByteArrayInputStream(content.getBytes()));
SelectObjectMetadata selectObjectMetadata = ossClient.createSelectObjectMetadata(
new CreateSelectObjectMetadataRequest(bucketName, key)
.withInputSerialization(
new InputSerialization().withCsvInputFormat(
// Tentukan delimiter yang digunakan untuk memisahkan catatan berbeda dalam konten. Contoh: \r\n.
new CSVFormat().withHeaderInfo(CSVFormat.Header.Use).withRecordDelimiter("\r\n"))));
System.out.println(selectObjectMetadata.getCsvObjectMetadata().getTotalLines());
System.out.println(selectObjectMetadata.getCsvObjectMetadata().getSplits());
SelectObjectRequest selectObjectRequest =
new SelectObjectRequest(bucketName, key)
.withInputSerialization(
new InputSerialization().withCsvInputFormat(
new CSVFormat().withHeaderInfo(CSVFormat.Header.Use).withRecordDelimiter("\r\n")))
.withOutputSerialization(new OutputSerialization().withCsvOutputFormat(new CSVFormat()));
// Gunakan pernyataan SELECT untuk mengkueri semua catatan yang nilainya lebih besar dari 40 pada kolom ke-4.
selectObjectRequest.setExpression("select * from ossobject where _4 > 40");
OSSObject ossObject = ossClient.selectObject(selectObjectRequest);
// Baca konten objek.
BufferedReader reader = new BufferedReader(new InputStreamReader(ossObject.getObjectContent()));
while (true) {
String line = reader.readLine();
if (line == null) {
break;
}
System.out.println(line);
}
reader.close();
ossClient.deleteObject(bucketName, key);
}
private static void selectJsonSample(String key, OSS ossClient) throws Exception {
// Tentukan konten objek yang ingin Anda unggah.
final String content = "{\n" +
"\t\"name\": \"Lora Francis\",\n" +
"\t\"age\": 27,\n" +
"\t\"company\": \"Staples Inc\"\n" +
"}\n" +
"{\n" +
"\t\"name\": \"Eleanor Little\",\n" +
"\t\"age\": 43,\n" +
"\t\"company\": \"Conectiv, Inc\"\n" +
"}\n" +
"{\n" +
"\t\"name\": \"Rosie Hughes\",\n" +
"\t\"age\": 44,\n" +
"\t\"company\": \"Western Gas Resources Inc\"\n" +
"}\n" +
"{\n" +
"\t\"name\": \"Lawrence Ross\",\n" +
"\t\"age\": 24,\n" +
"\t\"company\": \"MetLife Inc.\"\n" +
"}";
ossClient.putObject(bucketName, key, new ByteArrayInputStream(content.getBytes()));
SelectObjectRequest selectObjectRequest =
new SelectObjectRequest(bucketName, key)
.withInputSerialization(new InputSerialization()
.withCompressionType(CompressionType.NONE)
.withJsonInputFormat(new JsonFormat().withJsonType(JsonType.LINES)))
.withOutputSerialization(new OutputSerialization()
.withCrcEnabled(true)
.withJsonOutputFormat(new JsonFormat()))
.withExpression("select * from ossobject as s where s.age > 40"); // Gunakan pernyataan SELECT untuk mengkueri data dalam objek.
OSSObject ossObject = ossClient.selectObject(selectObjectRequest);
// Baca konten objek.
BufferedReader reader = new BufferedReader(new InputStreamReader(ossObject.getObjectContent()));
while (true) {
String line = reader.readLine();
if (line == null) {
break;
}
System.out.println(line);
}
reader.close();
ossClient.deleteObject(bucketName, key);
}
}
import oss2
from oss2.credentials import EnvironmentVariableCredentialsProvider
def select_call_back(consumed_bytes, total_bytes = None):
print('Consumed Bytes:' + str(consumed_bytes) + '\n')
# Dapatkan kredensial akses dari variabel lingkungan. Sebelum menjalankan kode contoh, pastikan variabel lingkungan OSS_ACCESS_KEY_ID dan OSS_ACCESS_KEY_SECRET telah dikonfigurasi.
auth = oss2.ProviderAuthV4(EnvironmentVariableCredentialsProvider())
# Tentukan endpoint wilayah tempat bucket berada. Misalnya, jika bucket berada di wilayah China (Hangzhou), atur endpoint ke https://oss-cn-hangzhou.aliyuncs.com.
endpoint = "https://oss-cn-hangzhou.aliyuncs.com"
# Tentukan ID wilayah yang sesuai dengan endpoint. Contoh: cn-hangzhou. Parameter ini wajib jika Anda menggunakan algoritma signature V4.
region = "cn-hangzhou"
# Tentukan nama bucket Anda.
bucket = oss2.Bucket(auth, endpoint, "yourBucketName", region=region)
key ='python_select.csv'
content ='Tom Hanks,USA,45\r\n'*1024
filename ='python_select.csv'
# Unggah file CSV.
bucket.put_object(key, content)
# Konfigurasikan parameter untuk operasi SelectObject.
csv_meta_params = {'RecordDelimiter': '\r\n'}
select_csv_params = {'CsvHeaderInfo': 'None',
'RecordDelimiter': '\r\n',
'LineRange': (500, 1000)}
csv_header = bucket.create_select_object_meta(key, csv_meta_params)
print(csv_header.rows)
print(csv_header.splits)
result = bucket.select_object(key, "select * from ossobject where _3 > 44", select_call_back, select_csv_params)
select_content = result.read()
print(select_content)
result = bucket.select_object_to_file(key, filename,
"select * from ossobject where _3 > 44", select_call_back, select_csv_params)
bucket.delete_object(key)
###JSON DOCUMENT
key = 'python_select.json'
content = "{\"contacts\":[{\"key1\":1,\"key2\":\"hello world1\"},{\"key1\":2,\"key2\":\"hello world2\"}]}"
filename = 'python_select.json'
# Unggah objek JSON DOCUMENT.
bucket.put_object(key, content)
select_json_params = {'Json_Type': 'DOCUMENT'}
result = bucket.select_object(key, "select s.key2 from ossobject.contacts[*] s where s.key1 = 1", None, select_json_params)
select_content = result.read()
print(select_content)
result = bucket.select_object_to_file(key, filename,
"select s.key2 from ossobject.contacts[*] s where s.key1 = 1", None, select_json_params)
bucket.delete_object(key)
###JSON LINES
key = 'python_select_lines.json'
content = "{\"key1\":1,\"key2\":\"hello world1\"}\n{\"key1\":2,\"key2\":\"hello world2\"}"
filename = 'python_select.json'
# Unggah objek JSON LINES.
bucket.put_object(key, content)
select_json_params = {'Json_Type': 'LINES'}
json_header = bucket.create_select_object_meta(key,select_json_params)
print(json_header.rows)
print(json_header.splits)
result = bucket.select_object(key, "select s.key2 from ossobject s where s.key1 = 1", None, select_json_params)
select_content = result.read()
print(select_content)
result = bucket.select_object_to_file(key, filename,
"select s.key2 from ossobject s where s.key1 = 1", None, select_json_params)
bucket.delete_object(key)
package main
import (
"context"
"flag"
"io"
"log"
"github.com/aliyun/alibabacloud-oss-go-sdk-v2/oss"
"github.com/aliyun/alibabacloud-oss-go-sdk-v2/oss/credentials"
)
// Definisikan variabel global.
var (
region string // Wilayah penyimpanan.
bucketName string // Nama bucket.
objectName string // Nama objek.
)
// Fungsi init digunakan untuk menginisialisasi parameter baris perintah.
func init() {
flag.StringVar(®ion, "region", "", "Wilayah tempat bucket berada.")
flag.StringVar(&bucketName, "bucket", "", "Nama bucket.")
flag.StringVar(&objectName, "object", "", "Nama objek.")
}
func main() {
// Parsing parameter baris perintah.
flag.Parse()
// Periksa apakah nama bucket kosong.
if len(bucketName) == 0 {
flag.PrintDefaults()
log.Fatalf("parameter tidak valid, nama bucket wajib diisi")
}
// Periksa apakah wilayah kosong.
if len(region) == 0 {
flag.PrintDefaults()
log.Fatalf("parameter tidak valid, wilayah wajib diisi")
}
// Periksa apakah nama objek kosong.
if len(objectName) == 0 {
flag.PrintDefaults()
log.Fatalf("parameter tidak valid, nama objek wajib diisi")
}
// Muat konfigurasi default dan atur penyedia kredensial serta wilayah.
cfg := oss.LoadDefaultConfig().
WithCredentialsProvider(credentials.NewEnvironmentVariableCredentialsProvider()).
WithRegion(region)
// Buat client OSS.
client := oss.NewClient(cfg)
// Buat permintaan untuk memilih objek.
request := &oss.SelectObjectRequest{
Bucket: oss.Ptr(bucketName), // Nama bucket.
Key: oss.Ptr(objectName), // Nama objek.
SelectRequest: &oss.SelectRequest{
Expression: oss.Ptr("select * from ossobject limit 10"), // Definisikan ekspresi SQL untuk mengkueri 10 baris data pertama dalam objek.
InputSerializationSelect: oss.InputSerializationSelect{
CsvBodyInput: &oss.CSVSelectInput{
FileHeaderInfo: oss.Ptr("Use"),
},
},
OutputSerializationSelect: oss.OutputSerializationSelect{
OutputHeader: oss.Ptr(true),
},
},
}
// Eksekusi permintaan untuk memilih objek.
result, err := client.SelectObject(context.TODO(), request)
if err != nil {
log.Fatalf("gagal memilih objek %v", err)
}
content, err := io.ReadAll(result.Body)
if err != nil {
log.Fatalf("gagal membaca objek %v", err)
}
// Cetak hasil pemilihan objek.
log.Printf("hasil select object:%#v\n", string(content))
}
CLI ossutil
Anda dapat menggunakan tool baris perintah ossutil untuk mengkueri objek. Untuk instruksi instalasi, lihat Instal ossutil.
Perintah berikut mengeksekusi pernyataan SQL pada objek bernama exampleobject di bucket bernama examplebucket. Permintaan menggunakan sintaksis CSV.
ossutil api select-object --bucket examplebucket --key exampleobject --select-request "{\"Expression\":\"c2VsZWN0IFllYXIsU3RhdGVBYmJyLCBDaXR5TmFtZSwgU2hvcnRfUXVlc3Rpb25fVGV4dCBmcm9tIG9zc29iamVjdA==\",\"InputSerialization\":{\"CSV\":{\"FileHeaderInfo\":\"Use\",\"Range\":\"line-range=0-100\"}},\"OutputSerialization\":{\"JSON\":{\"RecordDelimiter\":\",\"}}}"
Untuk informasi selengkapnya tentang perintah ini, lihat select-object.
Referensi API
Operasi yang dijelaskan di atas didasarkan pada API SelectObject dasar. Jika Anda memiliki kebutuhan lanjutan, Anda dapat membuat permintaan REST API langsung. Saat membuat permintaan langsung, Anda harus menghitung signature otentikasi secara manual. Untuk informasi selengkapnya, lihat SelectObject.