Tous les produits
Search
Centre de documentation

Object Storage Service:Interroger des objets

Dernière mise à jour :Sep 22, 2026

Vous pouvez utiliser l'API SelectObject pour exécuter des instructions SQL sur des objets et récupérer les résultats.

Contexte

Hadoop 3.0 permet d'exécuter des services tels que Spark, Hive et Presto sur E-MapReduce (EMR) afin de traiter les données stockées dans Object Storage Service (OSS). Les services Alibaba Cloud tels que MaxCompute et Data Lake Analytics (DLA) prennent également en charge le traitement direct des données depuis OSS.

Traditionnellement, les plateformes Big Data utilisent l'API GetObject pour télécharger des objets entiers depuis OSS avant de les filtrer et de les analyser.

L'API SelectObject résout ce problème en déportant la logique de requête, telle que les projections et les filtres, vers la couche OSS. Cela vous permet de récupérer uniquement le sous-ensemble de données nécessaire, réduisant ainsi les transferts de données, diminuant les coûts et économisant le CPU et la mémoire côté client. Cette efficacité rend l'analyse des données sur OSS plus attrayante.

Facturation

Lorsque vous utilisez l'API SelectObject pour interroger des données, vous êtes facturé en fonction du volume réel de données analysées à partir de l'objet source. Pour plus d'informations, consultez Frais de traitement des données.

Formats d'objets pris en charge

L'API SelectObject prend en charge des formats d'objets spécifiques ainsi qu'une syntaxe SQL dédiée.

  • Objets CSV conformes à la norme RFC 4180. Cela inclut les objets de type CSV, tels que TSV. Vous pouvez spécifier des délimiteurs de ligne, des délimiteurs de colonne et des caractères de guillemet personnalisés.

  • Objets JSON encodés en UTF-8. Deux formats sont pris en charge : DOCUMENT et LINES.

    • DOCUMENT : L'objet entier constitue un seul objet JSON valide.

    • LINES : L'objet est composé de plusieurs lignes, chaque ligne étant un objet JSON autonome. Les lignes sont séparées par un caractère de nouvelle ligne, tel que \n ou \r\n. Il n'est pas nécessaire de spécifier le délimiteur. Cependant, l'objet entier ne constitue pas un objet JSON valide.

  • Objets appartenant aux classes de stockage Standard et Infrequent Access. Les objets des classes de stockage Archive, Cold Archive ou Deep Cold Archive doivent être restaurés avant de pouvoir être interrogés.

  • Objets chiffrés à l'aide du chiffrement côté serveur avec des clés gérées par OSS ou une CMK gérée par KMS.

Syntaxe SQL prise en charge

  • Clauses SQL : SELECT, FROM, WHERE

  • Types de données : string, int (64 bits), double (64 bits), decimal (128 bits), timestamp et bool

  • Opérateurs : Logiques (AND, OR, NOT), Arithmétiques (+, -, *, /, %), De comparaison (>, =, <, >=, <=, !=) et Chaînes (LIKE, ||)

    Important

    L'opérateur LIKE effectue une correspondance de motif sensible à la casse.

Types de données pris en charge

Par défaut, toutes les données d'un objet CSV sont traitées comme des chaînes de caractères. Vous pouvez utiliser la fonction CAST pour effectuer des conversions de type explicites.

L'exemple suivant montre comment utiliser une requête SQL pour convertir les valeurs des colonnes _1 et _2 en entiers :Select * from OSSOBject where cast (_1 as int) > cast(_2 as int)

L'API SelectObject prend également en charge la conversion implicite de type dans une clause WHERE. Par exemple, dans l'instruction suivante, les valeurs des première et deuxième colonnes sont implicitement converties en entiers :

Select _1 from ossobject where _1 + _2 > 100

Pour les objets JSON, si vous n'utilisez pas la fonction CAST, le type de données est déterminé par le contenu de l'objet. Les types de données JSON intégrés standard incluent null, bool, int64, double et string.

Exemples SQL

Cette section propose des exemples SQL pour les objets CSV et JSON.

  • CSV

    Cas d'utilisation

    Instruction SQL

    Renvoyer les 10 premières lignes de données.

    select * from ossobject limit 10

    Renvoyer les entiers des première et troisième colonnes lorsque la valeur de la première colonne est supérieure à celle de la troisième.

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

    Renvoyer le nombre d'enregistrements de la première colonne commençant par « Chen ». (Remarque : Le caractère chinois après « like » doit être encodé en UTF-8.)

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

    Renvoyer tous les enregistrements dont l'horodatage de la deuxième colonne est postérieur au 09/08/2018 11:30:25 et dont la valeur de la troisième colonne est supérieure à 200.

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

    Renvoyer la moyenne, la somme, le maximum et le minimum des nombres à virgule flottante de la deuxième colonne.

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

    Renvoyer tous les enregistrements où la chaîne concaténée des première et troisième colonnes commence par « Tom » et se termine par « Anderson ».

    select * from ossobject where (_1

    _3) like 'Tom%Anderson'

    Renvoyer tous les enregistrements dont la valeur de la première colonne est divisible par 3.

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

    Renvoyer tous les enregistrements dont la valeur de la première colonne est comprise entre 1995 et 2012.

    select * from ossobject where _1 between 1995 and 2012

    Renvoyer tous les enregistrements dont la valeur de la cinquième colonne est « N », « M », « G » ou « L ».

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

    Renvoyer tous les enregistrements où le produit des valeurs des deuxième et troisième colonnes est supérieur à la somme de 100 et de la valeur de la cinquième colonne.

    select from ossobject where _2 _3 > _5 + 100

  • JSON

    Supposons que vous disposiez de l'objet JSON suivant :

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

    Le tableau suivant présente des exemples SQL.

    Cas d'utilisation

    Instruction SQL

    Renvoyer tous les enregistrements dont la valeur de age est 27.

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

    Renvoyer tous les numéros de téléphone domicile.

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

    Renvoyer tous les enregistrements dont le conjoint (spouse) est null.

    select * from ossobject s where s.spouse is null

    Renvoyer tous les enregistrements sans enfants.

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

    Remarque

    Il n'existe pas de syntaxe dédiée pour représenter un tableau vide. Utilisez plutôt l'instruction précédente.

Cas d'utilisation

Les cas d'utilisation courants de SelectObject incluent l'interrogation parallèle de grands objets, l'interrogation d'objets JSON et l'analyse de fichiers journaux.

  • Interroger de grands objets en parallèle

    À l'instar de la fonctionnalité de téléchargement multipart par plage d'octets fournie par l'API GetObject, l'API SelectObject prend en charge les requêtes parallèles. Vous pouvez diviser les données de deux manières :

    • Par ligne : Cette méthode de division des données est courante. Toutefois, pour des données clairsemées, la division par ligne peut entraîner une charge déséquilibrée entre les workers de requête.

    • Par split : Un split est un concept OSS relatif au partitionnement des données. Un split contient plusieurs lignes et chaque split a approximativement la même taille.

    Remarque

    La division des données par split est plus efficace que la division par ligne.

    Si vous pouvez confirmer que les colonnes de votre objet CSV ne contiennent pas de caractères de nouvelle ligne, la division par plage d'octets est plus simple car elle ne nécessite pas la création de métadonnées. Si les colonnes contiennent des caractères de nouvelle ligne ou si vous interrogez un objet JSON, suivez ces étapes :

    1. Appelez l'API CreateSelectObjectMeta pour obtenir le nombre total de splits pour l'objet. Afin de réduire le temps d'analyse, nous vous recommandons d'appeler cette API de manière asynchrone avant de démarrer la requête.

    2. En fonction de vos ressources côté client, déterminez le degré de parallélisme (n). Ensuite, divisez le nombre total de splits par n pour calculer le nombre de splits que chaque requête parallèle doit traiter.

    3. Dans le corps de la requête, spécifiez la plage de splits à interroger, par exemple split-range=1-20.

    4. Fusionnez les résultats de toutes les requêtes parallèles.

  • Interroger des objets JSON

    Lorsque vous interrogez des objets JSON, restreignez le chemin JSON dans la clause FROM pour améliorer les performances.

    Prenons l'exemple d'objet JSON suivant :

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

    Pour trouver toutes les adresses postales dont le code postal commence par « 10021 », vous pouvez rédiger l'instruction SQL soit comme select s.address.streetAddress from ossobject.contacts[*] s where s.address.postalCode like '10021%' soit comme select s.streetAddress from ossobject.contacts[*].address s where s.postalCode like '10021%'.

    La deuxième instruction, select s.streetAddress from ossobject.contacts[*].address s where s.postalCode like '10021%', offre de meilleures performances car son chemin JSON est plus précis.

  • Gérer les nombres à virgule flottante haute précision dans les objets JSON

    Lorsque vous devez effectuer des calculs avec des nombres à virgule flottante haute précision dans un objet JSON, nous vous recommandons de définir l'option ParseJsonNumberAsString sur true puis de convertir la valeur au type decimal. Par exemple, si un attribut a a pour valeur 123456789.123456789, vous pouvez utiliser l'instruction select s.a from ossobject s where cast(s.a as decimal) > 123456789.12345 pour conserver la précision des données d'origine.

Procédure

Console OSS

Important

Dans la console OSS, vous pouvez extraire un maximum de 40 Mo de données à partir d'un objet dont la taille ne dépasse pas 128 Mo.

  1. Connectez-vous à la console OSS.

  2. Dans le volet de navigation de gauche, cliquez sur Buckets. Sur la page qui s'affiche, cliquez sur le nom du bucket cible.

  3. Dans le volet de navigation de gauche, choisissez Object Management > Objects.

  4. Recherchez l'objet cible et choisissez more > Select Content dans la colonne Actions.

  5. Dans le panneau Select Content, configurez les paramètres selon les descriptions suivantes.

    Paramètre

    Description

    Object Type

    Seuls les types d'objets CSV et JSON sont pris en charge.

    Delimiter

    Ce paramètre s'applique uniquement aux objets CSV. Vous pouvez sélectionner une virgule (,) ou un délimiteur personnalisé.

    Title Row

    Ce paramètre s'applique uniquement aux objets CSV. Indiquez si la première ligne de l'objet contient les en-têtes de colonne.

    JSON Format

    Ce paramètre s'applique uniquement aux objets JSON. Sélectionnez le format correspondant à votre objet JSON.

    Compression Format

    Indiquez si votre objet est compressé. Seule la compression GZIP est prise en charge.

  6. Cliquez sur Preview.

    Important

    L'aperçu d'un objet de la classe de stockage Standard entraîne des frais d'analyse SelectObject. Pour les objets des classes de stockage Infrequent Access, Archive, Cold Archive ou Deep Cold Archive, l'aperçu engendre à la fois des frais d'analyse SelectObject et des frais de récupération des données. Pour plus d'informations, consultez Frais de traitement des données.

  7. Cliquez sur Next, puis saisissez et exécutez une instruction SQL.

    Supposons que vous disposiez d'un objet CSV nommé People avec trois colonnes : Name, Company et Age.

    • Pour trouver les personnes âgées de plus de 50 ans dont le nom commence par « Lora », vous pouvez exécuter l'instruction SQL suivante. Dans cette instruction, _1, _2 et _3 sont des index de colonne représentant respectivement la première, la deuxième et la troisième colonne.

      select * from ossobject where _1 like 'Lora*' and _3 > 50
    • Pour compter le nombre de lignes dans l'objet et trouver les âges maximum et minimum, vous pouvez exécuter l'instruction SQL suivante :

      select count(*), max(cast(_3 as int)), min(cast(_3 as int)) from ossobject
  8. Consultez les résultats d'exécution.

    Vous pouvez également cliquer sur Download pour enregistrer le contenu sélectionné localement.

Kits SDK OSS

Vous pouvez interroger des objets à l'aide des kits SDK OSS pour Java, Python et 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;

/**
 * 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))
}

CLI ossutil

Vous pouvez utiliser l'outil de ligne de commande ossutil pour interroger des objets. Pour les instructions d'installation, consultez Installer ossutil.

La commande suivante exécute une instruction SQL sur l'objet nommé exampleobject dans le bucket nommé examplebucket. La requête utilise la syntaxe 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\":\",\"}}}"

Pour plus d'informations sur cette commande, consultez select-object.

Référence API

Les opérations décrites ci-dessus sont basées sur l'API SelectObject sous-jacente. Si vous avez des besoins avancés, vous pouvez effectuer des requêtes REST API directes. Lors de requêtes directes, vous devez calculer manuellement la signature d'authentification. Pour plus d'informations, consultez SelectObject.