すべてのプロダクト
Search
ドキュメントセンター

Object Storage Service:オブジェクトのクエリ

最終更新日:May 07, 2026

SelectObject API を使用して、オブジェクトに対して SQL ステートメントを実行し、その結果を取得できます。

背景情報

Hadoop 3.0 では、E-MapReduce (EMR) 上で Spark や Hive、Presto などのサービスを実行し、Object Storage Service (OSS) に保存されたデータを処理できます。MaxCompute や Data Lake Analytics (DLA) などの Alibaba Cloud サービスも、OSS から直接データを処理することをサポートしています。

従来、ビッグデータプラットフォームは、フィルタリングおよび分析を行う前に、GetObject API を使用して OSS からオブジェクト全体をダウンロードしていました。

SelectObject API は、プロジェクションやフィルターなどのクエリロジックを OSS レイヤーにプッシュダウンすることでこの課題を解決します。これにより、必要なデータのサブセットのみを取得でき、データ転送量を削減し、コストを下げ、クライアント側の CPU およびメモリ負荷を軽減できます。この効率性により、OSS 上でのデータ分析がより魅力的になります。

課金

SelectObject API を使用してデータをクエリする場合、ソースオブジェクトからスキャンされた実際のデータ量に基づいて課金されます。詳細については、「データ処理料金」をご参照ください。

サポートされるオブジェクトフォーマット

SelectObject API は、特定のオブジェクトフォーマットおよび SQL 構文をサポートしています。

  • RFC 4180 に準拠した CSV オブジェクト。TSV など、CSV に類似したオブジェクトも含まれます。カスタムの行区切り文字、列区切り文字、引用符を指定できます。

  • UTF-8 でエンコードされた JSON オブジェクト。DOCUMENT 形式と LINES 形式の 2 種類がサポートされています。

    • DOCUMENT:オブジェクト全体が 1 つの有効な JSON オブジェクトです。

    • LINES:オブジェクトは複数の行で構成され、各行が自己完結型の JSON オブジェクトです。行は \n や \r\n などの改行文字で区切られています。デリミタを指定する必要はありません。ただし、オブジェクト全体は有効な JSON オブジェクトではありません。

  • 標準ストレージおよび低頻度アクセスストレージクラスのオブジェクト。アーカイブ、コールドアーカイブ、ディープコールドアーカイブストレージクラスのオブジェクトは、クエリを実行する前に復元する必要があります。

  • OSS マネージドキーまたは KMS で管理される CMK を使用したサーバ側暗号化で暗号化されたオブジェクト。

サポートされる SQL 構文

  • SQL 句:SELECT、FROM、WHERE

  • データの型:string、int(64 ビット)、double(64 ビット)、decimal(128 ビット)、timestamp、bool

  • 演算子:論理(AND、OR、NOT)、算術(+、-、*、/、%)、比較(>、=、<、>=、<=、!=)、文字列(LIKE、||)

    重要

    LIKE 演算子は大文字小文字を区別するパターンマッチングを実行します。

サポートされるデータの型

デフォルトでは、CSV オブジェクト内のすべてのデータは文字列として扱われます。明示的な型変換を行うには、CAST 関数を使用できます。

次の例は、SQL クエリを使用して _1 列および _2 列の値を整数にキャストする方法を示しています。Select * from OSSOBject where cast (_1 as int) > cast(_2 as int)

SelectObject API は、WHERE 句内での暗黙の型変換もサポートしています。たとえば、次のステートメントでは、第 1 列および第 2 列の値が暗黙的に整数に変換されます。

Select _1 from ossobject where _1 + _2 > 100

JSON オブジェクトの場合、CAST 関数を使用しない場合、データの型はオブジェクトの内容によって決定されます。標準的な組み込み JSON データの型には、null、bool、int64、double、string が含まれます。

SQL の使用例

このセクションでは、CSV および JSON オブジェクト向けの SQL 使用例を紹介します。

  • CSV

    ユースケース

    SQL ステートメント

    データの最初の 10 行を返します。

    select * from ossobject limit 10

    第 1 列の値が第 3 列の値より大きい場合に、第 1 列および第 3 列の整数を返します。

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

    第 1 列が「陳」で始まるレコードの件数を返します。(注:LIKE の後の中国語文字は UTF-8 でエンコードされている必要があります。)

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

    第 2 列のタイムスタンプが 2018-08-09 11:30:25 より後であり、かつ第 3 列の値が 200 より大きいすべてのレコードを返します。

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

    第 2 列の浮動小数点数の平均値、合計値、最大値、最小値を返します。

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

    第 1 列および第 3 列を連結した文字列が「Tom」で始まり、「Anderson」で終わるすべてのレコードを返します。

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

    第 1 列の値が 3 で割り切れるすべてのレコードを返します。

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

    第 1 列の値が 1995 から 2012 の範囲内であるすべてのレコードを返します。

    select * from ossobject where _1 between 1995 and 2012

    第 5 列の値が「N」、「M」、「G」、または「L」であるすべてのレコードを返します。

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

    第 2 列および第 3 列の値の積が、第 5 列の値と 100 の和より大きいすべてのレコードを返します。

    select * from ossobject where _2 * _3 > _5 + 100

  • JSON

    次の JSON オブジェクトがあると仮定します。

    {
      "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
    },... # 追加の連絡先ノードは簡潔にするため省略。
    ]}

    次の表に SQL の使用例を示します。

    ユースケース

    SQL ステートメント

    age の値が 27 であるすべてのレコードを返します。

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

    すべての自宅電話番号を返します。

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

    配偶者が null であるすべてのレコードを返します。

    select * from ossobject s where s.spouse is null

    子供がいないすべてのレコードを返します。

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

    説明

    空の配列を表す専用の構文はありません。代わりに上記のステートメントを使用してください。

ユースケース

SelectObject の一般的なユースケースには、ラージオブジェクトの並列クエリ、JSON オブジェクトのクエリ、ログファイルの分析が含まれます。

  • ラージオブジェクトの並列クエリ

    GetObject API が提供するバイト範囲マルチパートダウンロード機能と同様に、SelectObject API はパラレルクエリをサポートしています。データの分割方法は次の 2 通りがあります。

    • 行単位:これはデータ分割の一般的な方法です。ただし、スパースデータの場合、行単位での分割はクエリワーカー間の負荷が不均衡になる可能性があります。

    • スプリット単位:スプリットは OSS におけるデータシャーディングの概念です。スプリットには複数の行が含まれ、各スプリットのサイズはほぼ同じになります。

    説明

    スプリット単位でのデータ分割は、行単位よりも効率的です。

    CSV オブジェクトの列に改行文字が含まれていないことが確認できる場合は、メタデータ作成が不要なため、バイト範囲による分割の方がシンプルです。列に改行文字が含まれている場合や JSON オブジェクトをクエリする場合は、次の手順に従ってください。

    1. CreateSelectObjectMeta API を呼び出して、オブジェクトのスプリット総数を取得します。スキャン時間を短縮するために、クエリ開始前にこの API を非同期で呼び出すことを推奨します。

    2. クライアント側のリソースに基づいて並列処理の次数(n)を決定し、スプリット総数を n で割って、各並列クエリが処理すべきスプリット数を計算します。

    3. リクエストボディで、クエリするスプリットの範囲(例:split-range=1-20)を指定します。

    4. すべての並列クエリの結果をマージします。

  • JSON オブジェクトのクエリ

    JSON オブジェクトをクエリする際は、FROM 句で JSON パスを絞り込むことでパフォーマンスを向上させることができます。

    次の JSON オブジェクトの例を考えてみましょう。

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

    郵便番号が「10021」で始まるすべての住所を検索するには、 select s.address.streetAddress from ossobject.contacts[*] s where s.address.postalCode like '10021%' または select s.streetAddress from ossobject.contacts[*].address s where s.postalCode like '10021%' のいずれかの SQL ステートメントを記述できます。

    後者のステートメント select s.streetAddress from ossobject.contacts[*].address s where s.postalCode like '10021%' は JSON パスがより正確であるため、パフォーマンスが優れています。

  • JSON オブジェクト内の高精度浮動小数点数の処理

    JSON オブジェクト内の高精度浮動小数点数で計算を行う必要がある場合は、ParseJsonNumberAsString オプションを true に設定し、その後値を decimal 型にキャストすることを推奨します。たとえば、属性 a の値が 123456789.123456789 の場合、select s.a from ossobject s where cast(s.a as decimal) > 123456789.12345 というステートメントを使用して、元のデータの精度を維持できます。

操作手順

OSS コンソール

重要

OSS コンソールでは、128 MB 以下のオブジェクトから最大 40 MB のデータを抽出できます。

  1. OSS コンソールにログインします。

  2. 左側のナビゲーションウィンドウでバケットをクリックします。表示されたページで、対象のバケット名をクリックします。

  3. 左側のナビゲーションウィンドウで、オブジェクト管理 > オブジェクトを選択します。

  4. 対象のオブジェクトを見つけ、**[操作]** 列でmore > コンテンツを選択を選択します。

  5. コンテンツの選択パネルで、次の説明に基づいてパラメーターを設定します。

    パラメーター

    説明

    オブジェクトタイプ

    CSV および JSON オブジェクトタイプのみがサポートされています。

    デリミタ

    このパラメーターは CSV オブジェクトにのみ適用されます。カンマ(,)またはカスタムデリミタを選択できます。

    ヘッダ行

    このパラメーターは CSV オブジェクトにのみ適用されます。オブジェクトの最初の行に列ヘッダーが含まれているかどうかを指定します。

    JSON フォーマット

    このパラメーターは JSON オブジェクトにのみ適用されます。JSON オブジェクトに一致するフォーマットを選択します。

    圧縮フォーマット

    オブジェクトが圧縮されているかどうかを指定します。GZIP 圧縮のみがサポートされています。

  6. プレビューをクリックします。

    重要

    標準ストレージクラスのオブジェクトをプレビューする場合、SelectObject スキャン料金が発生します。低頻度アクセス、アーカイブ、コールドアーカイブ、ディープコールドアーカイブストレージクラスのオブジェクトをプレビューする場合、SelectObject スキャン料金に加えてデータ取得料金が発生します。詳細については、「データ処理料金」をご参照ください。

  7. 次へをクリックして、SQL ステートメントを入力・実行します。

    People という名前の CSV オブジェクトがあり、NameCompanyAge の 3 つの列が含まれていると仮定します。

    • 50 歳を超え、かつ名前が「Lora」で始まる人物を検索するには、次の SQL ステートメントを実行します。このステートメントでは、_1_2_3 はそれぞれ第 1、第 2、第 3 列を表す列インデックスです。

      select * from ossobject where _1 like 'Lora*' and _3 > 50
    • オブジェクト内の行数をカウントし、年齢の最大値と最小値を求めるには、次の SQL ステートメントを実行します。

      select count(*), max(cast(_3 as int)), min(cast(_3 as int)) from ossobject
  8. 実行結果を表示します。

    また、ダウンロードをクリックして、選択したコンテンツをローカルに保存することもできます。

OSS SDK

Java、Python、Go 向けの OSS SDK を使用してオブジェクトをクエリできます。

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

コマンドラインツール ossutil を使用してオブジェクトをクエリできます。インストール手順については、「ossutil のインストール」をご参照ください。

次のコマンドは、examplebucket バケット内の exampleobject という名前のオブジェクトに対して SQL ステートメントを実行します。このリクエストは 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\":\",\"}}}"

このコマンドの詳細については、「select-object」をご参照ください。

API リファレンス

上記の操作は、基盤となる SelectObject API に基づいています。高度な要件がある場合は、REST API リクエストを直接実行できます。直接リクエストを実行する場合、認証署名を手動で計算する必要があります。詳細については、「SelectObject」をご参照ください。