Tüm Ürünler
Search
Belge Merkezi

Object Storage Service:Query objects

Son Güncelleme:Oct 01, 2026

SelectObject API'sini kullanarak nesneler üzerinde SQL deyimleri çalıştırabilir ve sonuçları alabilirsiniz.

Genel bilgiler

Hadoop 3.0, Object Storage Service (OSS) içinde depolanan verileri işlemek üzere E-MapReduce (EMR) üzerinde Spark, Hive ve Presto gibi hizmetlerin çalıştırılmasını destekler. MaxCompute ve Data Lake Analytics (DLA) gibi Alibaba Cloud hizmetleri de verileri doğrudan OSS üzerinden işlemeyi destekler.

Geleneksel olarak büyük veri platformları, filtreleme ve analiz işlemleri öncesinde tüm nesneleri OSS'ten indirmek için GetObject API'sini kullanır.

SelectObject API, projeksiyonlar ve filtreler gibi sorgu mantığını OSS katmanına aktararak bu sorunu çözer. Bu sayede yalnızca ihtiyacınız olan veri alt kümesini alabilir, veri aktarımını azaltabilir, maliyetleri düşürebilir ve istemci tarafındaki CPU ile bellek kullanımından tasarruf edebilirsiniz. Bu verimlilik, OSS üzerindeki veri analizini daha cazip hale getirir.

Faturalama

SelectObject API'sini kullanarak veri sorguladığınızda, kaynak nesneden taranan gerçek veri miktarına göre ücretlendirilirsiniz. Daha fazla bilgi için bkz. Veri işleme ücretleri.

Desteklenen nesne biçimleri

SelectObject API, belirli nesne biçimlerini ve SQL sözdizimini destekler.

  • RFC 4180 standardına uygun CSV nesneleri. TSV gibi CSV benzeri nesneleri içerir. Özel satır sınırlayıcıları, sütun sınırlayıcıları ve tırnak karakterleri belirtebilirsiniz.

  • UTF-8 kodlamalı JSON nesneleri. DOCUMENT ve LINES olmak üzere iki biçim desteklenir.

    • DOCUMENT: Tüm nesne tek bir geçerli JSON nesnesidir.

    • LINES: Nesne, her biri kendi kendine yeterli bir JSON nesnesi olan birden çok satırdan oluşur. Satırlar \n veya \r\n gibi yeni satır karakterleriyle ayrılır. Sınırlayıcıyı belirtmeniz gerekmez. Ancak tüm nesne geçerli bir JSON nesnesi değildir.

  • Standart ve Seyrek Erişim depolama sınıflarındaki nesneler. Arşiv, Soğuk Arşiv veya Derin Soğuk Arşiv depolama sınıfındaki nesnelerin sorgulanabilmesi için önce geri yüklenmesi gerekir.

  • OSS tarafından yönetilen anahtarlarla veya KMS tarafından yönetilen bir CMK ile sunucu taraflı şifreleme kullanılarak şifrelenen nesneler.

Desteklenen SQL sözdizimi

  • SQL yan tümceleri: SELECT, FROM, WHERE

  • Veri türleri: string, int (64 bit), double (64 bit), decimal (128 bit), timestamp ve bool

  • Operatörler: Mantıksal (AND, OR, NOT), Aritmetik (+, -, *, /, %), Karşılaştırma (>, =, <, >=, <=, !=) ve Dize (LIKE, ||)

    Önemli

    LIKE operatörü büyük/küçük harfe duyarlı desen eşleşmesi gerçekleştirir.

Desteklenen veri türleri

Varsayılan olarak, bir CSV nesnesindeki tüm veriler dize olarak kabul edilir. Açık tür dönüştürmeleri yapmak için CAST işlevini kullanabilirsiniz.

Aşağıdaki örnek, _1 ve _2 sütunlarında değerleri tam sayılara dönüştürmek için bir SQL sorgusunun nasıl kullanılacağını gösterir:Select * from OSSOBject where cast (_1 as int) > cast(_2 as int)

SelectObject API ayrıca WHERE yan tümcesinde örtük tür dönüştürmeyi de destekler. Örneğin, aşağıdaki ifadede ilk ve ikinci sütunlardaki değerler örtük olarak tam sayılara dönüştürülür:

Select _1 from ossobject where _1 + _2 > 100

JSON nesneleri için CAST işlevini kullanmazsanız veri türü nesnenin içeriğine göre belirlenir. Standart yerleşik JSON veri türleri arasında null, bool, int64, double ve string bulunur.

SQL örnekleri

Bu bölümde CSV ve JSON nesneleri için SQL örnekleri sunulmaktadır.

  • CSV


    Kullanım durumu


    SQL deyimi


    İlk 10 satır veriyi döndürün.


    select * from ossobject limit 10


    Birinci sütundaki değer üçüncü sütundaki değerden büyük olduğunda, birinci ve üçüncü sütunlardan tam sayıları döndürün.


    select _1, _3 from ossobject where cast(_1 as int) > cast(_3 as int)


    Birinci sütunda 'Chen' ile başlayan kayıtların sayısını döndürün. (Not: 'like' ifadesinden sonraki Çince karakter UTF-8 olarak kodlanmalıdır.)


    select count(*) from ossobject where _1 like 'Chen%'


    İkinci sütundaki zaman damgası 2018-08-09 11:30:25'ten sonra olan ve üçüncü sütundaki değer 200'den büyük olan tüm kayıtları döndürün.


    select * from ossobject where _2 > cast('2018-08-09 11:30:25' as timestamp) and _3 > 200


    İkinci sütundaki ondalık sayıların ortalamasını, toplamını, maksimum ve minimum değerlerini döndürün.


    select AVG(cast(_6 as double)), SUM(cast(_6 as double)), MAX(cast(_6 as double)), MIN(cast(_6 as double)) from ossobject


    Birinci ve üçüncü sütunlardan birleştirilen dize 'Tom' ile başlayıp 'Anderson' ile biten tüm kayıtları döndürün.


    select * from ossobject where (_1 || _3) like 'Tom%Anderson'


    Birinci sütundaki değer 3'e bölünebilen tüm kayıtları döndürün.


    select * from ossobject where (_1 % 3) = 0


    Birinci sütundaki değer 1995 ile 2012 arasında olan tüm kayıtları döndürün.


    select * from ossobject where _1 between 1995 and 2012


    Beşinci sütundaki değer 'N', 'M', 'G' veya 'L' olan tüm kayıtları döndürün.


    select * from ossobject where _5 in ('N', 'M', 'G', 'L')


    İkinci ve üçüncü sütunlardaki değerlerin çarpımı, 100 ile beşinci sütundaki değerin toplamından büyük olan tüm kayıtları döndürün.


    select from ossobject where _2 _3 > _5 + 100

  • JSON

    Aşağıdaki JSON nesnesine sahip olduğunuzu varsayalım:

    {
      "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
    },... # Additional contact nodes omitted for brevity.
    ]}

    Aşağıdaki tabloda SQL örnekleri verilmiştir.

    Kullanım durumu

    SQL deyimi

    Yaş değeri 27 olan tüm kayıtları döndürün.

    select from ossobject.contacts[] s where s.age = 27

    Tüm ev telefon numaralarını döndürün.

    select s.number from ossobject.contacts[].phoneNumbers[] s where s.type = "home"

    Eşi null olan tüm kayıtları döndürün.

    select * from ossobject s where s.spouse is null

    Çocuğu olmayan tüm kayıtları döndürün.

    select * from ossobject s where s.children[0] is null

    Not

    Boş bir diziyi temsil etmek için özel bir sözdizimi yoktur. Bunun yerine önceki deyimi kullanın.

Kullanım durumları

SelectObject için yaygın kullanım durumları arasında büyük nesnelerin paralel olarak sorgulanması, JSON nesnelerinin sorgulanması ve günlük dosyalarının analizi yer alır.

  • Büyük nesneleri paralel olarak sorgulama

    GetObject API tarafından sağlanan byte-range çok parçalı indirme özelliğine benzer şekilde, SelectObject API paralel sorguları destekler. Verileri iki yoldan biriyle bölebilirsiniz:

    • Satıra göre: Bu, verileri bölmenin yaygın bir yöntemidir. Ancak seyrek veriler için satıra göre bölme, sorgu çalışanları arasında dengesiz bir yüke neden olabilir.

    • Parçaya göre: Parça, veri parçalama için bir OSS kavramıdır. Bir parça birden çok satır içerir ve her parça yaklaşık olarak aynı boyuttadır.

    Not

    Verileri parçaya göre bölmek, satıra göre bölmekten daha verimlidir.

    CSV nesnenizdeki sütunların yeni satır karakterleri içermediğini doğrulayabiliyorsanız, meta veri oluşturmayı gerektirmediği için bayt aralığına göre bölme daha basittir. Sütunlar yeni satır karakterleri içeriyorsa veya bir JSON nesnesi sorguluyorsanız aşağıdaki adımları izleyin:

    1. Nesne için toplam parça sayısını almak için CreateSelectObjectMeta API'sini çağırın. Tarama süresini azaltmak için sorguyu başlatmadan önce bu API'yi eşzamansız olarak çağırmanızı öneririz.

    2. İstemci tarafındaki kaynaklarınıza bağlı olarak paralellik derecesini (n) belirleyin. Ardından, her bir paralel sorgunun işlemesi gereken parça sayısını hesaplamak için toplam parça sayısını n'ye bölün.

    3. İstek gövdesinde sorgulanacak parça aralığını belirtin, örneğin split-range=1-20.

    4. Tüm paralel sorgulardan gelen sonuçları birleştirin.

  • JSON nesnelerini sorgulama

    JSON nesnelerini sorgularken performansı artırmak için FROM yan tümcesindeki JSON yolunu daraltın.

    Aşağıdaki JSON nesne örneğini göz önünde bulundurun:

    {
      "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"
        }
      ]
    }
    ]}

    Posta kodu '10021' ile başlayan tüm sokak adreslerini bulmak için SQL deyimini select s.address.streetAddress from ossobject.contacts[*] s where s.address.postalCode like '10021%' veya select s.streetAddress from ossobject.contacts[*].address s where s.postalCode like '10021%' şeklinde yazabilirsiniz.

    JSON yolu daha kesin olduğu için ikinci deyim select s.streetAddress from ossobject.contacts[*].address s where s.postalCode like '10021%' daha iyi performans gösterir.

  • JSON nesnelerinde yüksek hassasiyetli ondalık sayıları işleme

    Bir JSON nesnesinde yüksek hassasiyetli ondalık sayılarla hesaplama yapmanız gerektiğinde, ParseJsonNumberAsString seçeneğini true olarak ayarlamanız ve ardından değeri decimal türüne dönüştürmenizi öneririz. Örneğin, bir a özniteliğinin değeri 123456789.123456789 ise, orijinal verinin hassasiyetini korumak için select s.a from ossobject s where cast(s.a as decimal) > 123456789.12345 deyimini kullanabilirsiniz.

Yordam

OSS konsolu

Önemli

OSS konsolunda, boyutu 128 MB'ı aşmayan bir nesneden en fazla 40 MB veri çıkarabilirsiniz.

  1. OSS konsoluna giriş yapın.

  2. Sol gezinme bölmesinde Buckets öğesine tıklayın. Görüntülenen sayfada hedef paketin adına tıklayın.

  3. Sol gezinme bölmesinde Object Management > Objects seçeneklerini seçin.

  4. Hedef nesneyi bulun ve İşlemler sütununda more > Select Content seçeneğini seçin.

  5. Select Content panelinde parametreleri aşağıdaki açıklamalara göre yapılandırın.


    Parametre


    Açıklama


    Object Type


    Yalnızca CSV ve JSON nesne türleri desteklenir.


    Delimiter


    Bu parametre yalnızca CSV nesneleri için geçerlidir. Virgül (,) veya özel bir sınırlayıcı seçebilirsiniz.


    Title Row


    Bu parametre yalnızca CSV nesneleri için geçerlidir. Nesnenin ilk satırının sütun üst bilgilerini içerip içermediğini belirtin.


    JSON Format


    Bu parametre yalnızca JSON nesneleri için geçerlidir. JSON nesnenize uygun biçimi seçin.


    Compression Format


    Nesnenizin sıkıştırılmış olup olmadığını belirtin. Yalnızca GZIP sıkıştırması desteklenir.

  6. Preview düğmesine tıklayın.

    Önemli

    Standart depolama sınıfındaki bir nesneyi önizlemek SelectObject tarama ücretlerine tabidir. Seyrek Erişim, Arşiv, Soğuk Arşiv veya Derin Soğuk Arşiv depolama sınıflarındaki nesneler için önizleme hem SelectObject tarama ücretlerine hem de veri alma ücretlerine tabidir. Daha fazla bilgi için bkz. Veri işleme ücretleri.

  7. Next düğmesine tıklayın, ardından bir SQL deyimi girin ve çalıştırın.

    Üç sütunu olan People adlı bir CSV nesneniz olduğunu varsayalım: Name, Company ve Age.

    • Yaşı 50'den büyük ve adı 'Lora' ile başlayan kişileri bulmak için aşağıdaki SQL deyimini çalıştırabilirsiniz. Deyimde _1, _2 ve _3 sırasıyla birinci, ikinci ve üçüncü sütunları temsil eden sütun dizinleridir.

      select * from ossobject where _1 like 'Lora*' and _3 > 50
    • Nesnedeki satır sayısını saymak ve maksimum ile minimum yaşları bulmak için aşağıdaki SQL deyimini çalıştırabilirsiniz:

      select count(*), max(cast(_3 as int)), min(cast(_3 as int)) from ossobject
  8. Çalıştırma sonuçlarını görüntüleyin.

    Seçilen içeriği yerel olarak kaydetmek için Download düğmesine de tıklayabilirsiniz.

OSS SDK'ları

Java, Python ve Go için OSS SDK'larını kullanarak nesneleri sorgulayabilirsiniz.

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;

/**
 * Examples of create select object metadata and select object.
 *
 */
public class SelectObjectSample {
    // Specify the endpoint of the region in which the bucket is located. For example, if the bucket is located in the China (Hangzhou) region, set the endpoint to https://oss-cn-hangzhou.aliyuncs.com. 
    private static String endpoint = "https://oss-cn-hangzhou.aliyuncs.com";
    // Specify the name of the bucket. Example: examplebucket. 
    private static String bucketName = "examplebucket";

    public static void main(String[] args) throws Exception {
      
      	// Obtain access credentials from environment variables. Before you run the sample code, make sure that the OSS_ACCESS_KEY_ID and OSS_ACCESS_KEY_SECRET environment variables are configured. 
        EnvironmentVariableCredentialsProvider credentialsProvider = CredentialsProviderFactory.newEnvironmentVariableCredentialsProvider();
        // Specify the region in which the bucket is located. For example, if the bucket is located in the China (Hangzhou) region, set the region to cn-hangzhou.
        String region = "cn-hangzhou";

        // Create an OSSClient instance. 
        // Call the shutdown method to release associated resources when the OSSClient is no longer in use.
        ClientBuilderConfiguration clientBuilderConfiguration = new ClientBuilderConfiguration();
        clientBuilderConfiguration.setSignatureVersion(SignVersion.V4);        
        OSS ossClient = OSSClientBuilder.create()
        .endpoint(endpoint)
        .credentialsProvider(credentialsProvider)
        .clientConfiguration(clientBuilderConfiguration)
        .region(region)               
        .build();
        // Specify the full path of the object that you want to query, and then query the data of the object by using SELECT statements. Do not include the bucket name in the full path. 
        // Specify the full path of the CSV object. 
        selectCsvSample("test.csv", ossClient);
        // Specify the full path of the JSON object. 
        selectJsonSample("test.json", ossClient);
        ossClient.shutdown();
    }

    private static void selectCsvSample(String key, OSS ossClient) throws Exception {
        // Specify the content of the object that you want to upload. 
        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(
                                        // Specify the delimiter that is used to separate different records in the content. Example: \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()));
        // Use a SELECT statement to query all records whose values are greater than 40 in the 4th column. 
        selectObjectRequest.setExpression("select * from ossobject where _4 > 40");
        OSSObject ossObject = ossClient.selectObject(selectObjectRequest);

        // Read the content of the object. 
        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 {
        // Specify the content of the object that you want to upload. 
        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"); // Use the SELECT statement to query data in the object. 

        OSSObject ossObject = ossClient.selectObject(selectObjectRequest);

        // Read the content of the object. 
        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')

# Obtain access credentials from environment variables. Before you run the sample code, make sure that the OSS_ACCESS_KEY_ID and OSS_ACCESS_KEY_SECRET environment variables are configured. 
auth = oss2.ProviderAuthV4(EnvironmentVariableCredentialsProvider())

# Specify the endpoint of the region in which the bucket is located. For example, if the bucket is located in the China (Hangzhou) region, set the endpoint to https://oss-cn-hangzhou.aliyuncs.com. 
endpoint = "https://oss-cn-hangzhou.aliyuncs.com"

# Specify the ID of the region that maps to the endpoint. Example: cn-hangzhou. This parameter is required if you use the signature algorithm V4.
region = "cn-hangzhou"

# Specify the name of your bucket.
bucket = oss2.Bucket(auth, endpoint, "yourBucketName", region=region)

key ='python_select.csv'
content ='Tom Hanks,USA,45\r\n'*1024
filename ='python_select.csv'

# Upload a CSV file. 
bucket.put_object(key, content)
# Configure the parameters for the SelectObject operation. 
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'
# Upload a JSON DOCUMENT object. 
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'
# Upload a JSON LINES object. 
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"
)

// Define global variables.
var (
	region     string // The storage region.
	bucketName string // The bucket name.
	objectName string // The object name.
)

// The init function is used to initialize command line parameters.
func init() {
	flag.StringVar(&region, "region", "", "The region in which the bucket is located.")
	flag.StringVar(&bucketName, "bucket", "", "The name of the bucket.")
	flag.StringVar(&objectName, "object", "", "The name of the object.")
}

func main() {
	// Parse command line parameters.
	flag.Parse()

	// Check whether the bucket name is empty.
	if len(bucketName) == 0 {
		flag.PrintDefaults()
		log.Fatalf("invalid parameters, bucket name required")
	}

	// Check whether the region is empty.
	if len(region) == 0 {
		flag.PrintDefaults()
		log.Fatalf("invalid parameters, region required")
	}

	// Check whether the object name is empty.
	if len(objectName) == 0 {
		flag.PrintDefaults()
		log.Fatalf("invalid parameters, object name required")
	}

	// Load the default configurations and set the credential provider and region.
	cfg := oss.LoadDefaultConfig().
		WithCredentialsProvider(credentials.NewEnvironmentVariableCredentialsProvider()).
		WithRegion(region)

	// Create an OSS client.
	client := oss.NewClient(cfg)

	// Create a request to select an object.
	request := &oss.SelectObjectRequest{
		Bucket: oss.Ptr(bucketName), // The bucket name.
		Key:    oss.Ptr(objectName), // The object name.
		SelectRequest: &oss.SelectRequest{
			Expression: oss.Ptr("select * from ossobject limit 10"), // Define an SQL expression to query the first 10 rows of data in the object.
			InputSerializationSelect: oss.InputSerializationSelect{
				CsvBodyInput: &oss.CSVSelectInput{
					FileHeaderInfo: oss.Ptr("Use"),
				},
			},
			OutputSerializationSelect: oss.OutputSerializationSelect{
				OutputHeader: oss.Ptr(true),
			},
		},
	}

	// Execute the request to select the object.
	result, err := client.SelectObject(context.TODO(), request)
	if err != nil {
		log.Fatalf("failed to select object %v", err)
	}

	content, err := io.ReadAll(result.Body)
	if err != nil {
		log.Fatalf("failed to read object %v", err)
	}

	// Print the result of selecting the object.
	log.Printf("select object result:%#v\n", string(content))
}

ossutil CLI

Nesneleri sorgulamak için komut satırı aracı ossutil'i kullanabilirsiniz. Kurulum talimatları için bkz. Install ossutil.

Aşağıdaki komut, examplebucket adlı paketteki exampleobject adlı nesne üzerinde bir SQL deyimi yürütür. İstek CSV sözdizimini kullanır.

ossutil api select-object --bucket examplebucket --key exampleobject --select-request "{\"Expression\":\"c2VsZWN0IFllYXIsU3RhdGVBYmJyLCBDaXR5TmFtZSwgU2hvcnRfUXVlc3Rpb25fVGV4dCBmcm9tIG9zc29iamVjdA==\",\"InputSerialization\":{\"CSV\":{\"FileHeaderInfo\":\"Use\",\"Range\":\"line-range=0-100\"}},\"OutputSerialization\":{\"JSON\":{\"RecordDelimiter\":\",\"}}}"

Bu komutla ilgili daha fazla bilgi için bkz. select-object.

API başvurusu

Yukarıda açıklanan işlemler temel SelectObject API'sine dayanır. Gelişmiş gereksinimleriniz varsa doğrudan REST API istekleri yapabilirsiniz. Doğrudan istek yaptığınızda kimlik doğrulama imzasını manuel olarak hesaplamanız gerekir. Daha fazla bilgi için bkz. SelectObject.