All Products
Search
Document Center

Object Storage Service:Query objek

Last Updated:May 07, 2026

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: Logika (AND, OR, NOT), Aritmetika (+, -, *, /, %), Perbandingan (>, =, <, >=, <=, !=), dan String (LIKE, ||)

    Penting

    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.

    SELECT * FROM ossobject WHERE _2 * _3 > _5 + 100

  • JSON

    Asumsikan Anda memiliki objek JSON berikut:

    {
      "contacts":[
    {
      "firstName": "John",
      "lastName": "Smith",
      "isAlive": true,
      "age": 27,
      "address": {
        "streetAddress": "21 2nd Street",
        "city": "New York",
        "state": "NY",
        "postalCode": "10021-3100"
      },
      "phoneNumbers": [
        {
          "type": "home",
          "number": "212 555-1234"
        },
        {
          "type": "office",
          "number": "646 555-4567"
        },
        {
          "type": "mobile",
          "number": "123 456-7890"
        }
      ],
      "children": [],
      "spouse": null
    },... # Node kontak tambahan dihilangkan demi singkatnya.
    ]}

    Tabel berikut menyediakan contoh SQL.

    Kasus Penggunaan

    Pernyataan SQL

    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:

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

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

    3. Dalam badan permintaan, tentukan rentang split yang akan dikueri, misalnya split-range=1-20.

    4. Gabungkan hasil dari semua kueri paralel.

  • Mengkueri objek JSON

    Saat mengkueri objek JSON, persempit jalur JSON (JSON path) dalam klausa FROM untuk meningkatkan kinerja.

    Pertimbangkan contoh objek JSON berikut:

    {
      "contacts":[
    {
      "firstName": "John",
      "lastName": "Smith",
      "address": {
        "streetAddress": "21 2nd Street",
        "city": "New York",
        "state": "NY",
        "postalCode": "10021-3100"
      },
      "phoneNumbers": [
        {
          "type": "home",
          "number": "212 555-1234"
        },
        {
          "type": "office",
          "number": "646 555-4567"
        },
        {
          "type": "mobile",
          "number": "123 456-7890"
        }
      ]
    }
    ]}

    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.

  1. Masuk ke Konsol OSS.

  2. Di panel navigasi kiri, klik Buckets. Pada halaman yang muncul, klik nama bucket target.

  3. Di panel navigasi kiri, pilih Object Management > Objects.

  4. Temukan objek target dan pilih more > Select Content di kolom Actions.

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

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

  7. 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
  8. 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(&region, "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.