Este tópico descreve como usar a operação SelectObject no OSS SDK for Python para consultar objetos nos formatos CSV e JSON.
Observações
Os exemplos deste tópico utilizam o endpoint público da região China (Hangzhou). Para acessar o OSS a partir de outros serviços da Alibaba Cloud na mesma região, utilize um endpoint interno. Para mais informações sobre regiões e endpoints do OSS, consulte Regiões e endpoints.
Este tópico demonstra a criação de uma instância OSSClient com um endpoint do OSS. Para configurações alternativas, como uso de domínio personalizado ou autenticação via Security Token Service (STS), consulte Inicialização.
A consulta de objetos exige a permissão
oss:GetObject. Para mais detalhes, consulte Conceder uma política personalizada.A operação SelectObject aceita consultas apenas em objetos nos formatos CSV e JSON.
Exemplos
O código a seguir exemplifica a consulta de objetos CSV e JSON:
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)
SelectObject em Python
Esta seção detalha os elementos da operação SelectObject em Python: select_object, select_object_to_file e create_select_object_meta.
-
select_object
-
O exemplo a seguir mostra como especificar parâmetros para select_object:
def select_object(self, key, sql, progress_callback=None, select_params=None byte_range=None headers=None ):Esse trecho de código executa uma instrução SQL no objeto identificado pela chave especificada e retorna os resultados da consulta.
sql: instrução SQL sem codificação Base64.
Progress_callback: opcional. Define uma função de callback para reportar o progresso da consulta.
select_params: parâmetros e ações da operação SelectObject.
headers: informações de cabeçalho incluídas na requisição. Funcionam da mesma forma que na operação GetObject. Por exemplo, configure o campo bytes no cabeçalho para definir o intervalo de consulta em um objeto CSV.
-
A tabela a seguir descreve os parâmetros aceitos por select_params.
Parâmetro
Descrição
Json_Type
-
Se omitido, o objeto é tratado como CSV por padrão.
-
Defina como DOCUMENT para objetos JSON Document.
-
Defina como LINES para objetos JSON LINES.
CsvHeaderInfo
Informações de cabeçalho do objeto CSV.
Valores válidos: None, Ignore e Use.
-
None: O objeto não possui cabeçalho configurado.
-
Ignore: O objeto tem cabeçalho, mas ele é ignorado durante a execução da instrução SQL.
-
Use: O objeto tem cabeçalho e os nomes das colunas são utilizados na execução da instrução SQL.
CommentCharacter
Caractere de comentário no objeto CSV. Aceita apenas um caractere. O valor padrão é None, indicando que comentários não são permitidos.
RecordDelimiter
Delimitador de linha do objeto CSV. Aceita um ou dois caracteres. Valor padrão: \n.
OutputRecordDelimiter
Delimitador de linha no resultado da instrução SELECT. Valor padrão: \n.
FieldDelimiter
Delimitador de coluna do objeto CSV. Aceita apenas um caractere. O valor padrão é vírgula (,).
OutputFieldDelimiter
Delimitador de coluna no resultado da instrução SELECT. O valor padrão é vírgula (,).
QuoteCharacter
Caractere de aspas para as colunas do objeto CSV. Aceita apenas um caractere. O valor padrão é aspas duplas ("). Delimitadores de linha e coluna entre aspas são tratados como caracteres normais.
SplitRange
Intervalo de splits para consulta multipart. O valor é um intervalo fechado no formato (início, fim), indicando quais splits consultar.
LineRange
Intervalo de linhas para consulta multipart. O valor é um intervalo fechado no formato (início, fim), indicando quais linhas consultar.
CompressionType
Formato de compressão do objeto. Valores válidos: GZIP e None. Valor padrão: None.
KeepAllColumns
Quando definido como true, as colunas excluídas pela instrução SELECT no objeto CSV aparecem vazias no resultado, mantendo suas posições originais. Valor padrão: False.
Por exemplo, considere um objeto CSV com as colunas firstname, lastname e age, e a instrução SQL select firstname, age from ossobject.
-
Com KeepAllColumns definido como true, o resultado será firstname,,age, onde a vírgula extra indica a posição da coluna lastname excluída.
-
Com KeepAllColumns definido como false, o resultado será firstname,age.
NotaEste parâmetro permite que códigos escritos para processar GetObject funcionem com SelectObject sem modificações.
OutputRawData
-
Se definido como True, o SelectObject retorna os dados brutos diretamente. A ausência de retorno de dados por muito tempo pode causar erro de timeout.
-
Se definido como False, os dados de saída são encapsulados em frames. Valor padrão: False.
EnablePayloadCrc
Define se o valor de verificação de redundância cíclica (CRC) é calculado para cada frame. Valor padrão: False.
OutputHeader
Informações de cabeçalho na primeira linha do resultado. Aplicável apenas a objetos CSV.
SkipPartialDataRecord
Para objetos CSV com este parâmetro como True, o registro atual é ignorado se alguma coluna estiver vazia. Em objetos JSON, o registro é ignorado se uma chave não existir. Se definido como False, colunas sem dados aparecem vazias no resultado.
Por exemplo, numa linha com as colunas firstname, lastname e age, usando a instrução SQL
select _1, _4 from ossobject:-
Com o parâmetro como True, essa linha é ignorada.
-
Com o parâmetro como False, o retorno é firstname,\n.
MaxSkippedRecordsAllowed
Número máximo de linhas que podem ser ignoradas. O valor padrão é 0, o que gera um erro caso alguma linha seja ignorada.
ParseJsonNumberAsString
-
Quando True, todos os números do objeto JSON são interpretados como strings.
-
Quando False, os números são interpretados como inteiros ou ponto flutuante. Valor padrão: False.
Números de ponto flutuante de alta precisão em objetos JSON podem perder precisão ao serem interpretados como tal. Para preservar a exatidão, defina este parâmetro como True e utilize a função CAST para converter os dados para o tipo decimal.
-
-
Resultados retornados por select_object: Retorna um objeto SelectObjectResult. Utilize a função read() ou o método _iter_ para obter todos os resultados.
NotaAo chamar a função read() para ler múltiplos resultados de uma vez, há consumo excessivo de memória e longa espera. Recomendamos o uso do método _iter_ (foreach chunk in result) para obter e processar cada bloco individualmente. Essa abordagem reduz o uso de memória e permite que o cliente processe cada bloco à medida que o servidor OSS os disponibiliza, eliminando a necessidade de aguardar o retorno completo dos dados.
-
-
select_object_to_file
def select_object_to_file(self, key, filename, sql, progress_callback=None, select_params=None headers=None ):O código acima executa uma instrução SQL no objeto com a chave especificada e grava os resultados em outro objeto definido.
Os demais parâmetros seguem a mesma definição de select_object.
-
create_select_object_meta
-
Sintaxe de create_select_object_meta
def create_select_object_meta(self, key, select_meta_params=None, header=None):Este trecho cria ou obtém o Select Meta do objeto identificado pela chave. O Select Meta contém o total de linhas, total de colunas (para CSV) e total de splits do objeto.
Caso o Select Meta já exista, a função não o recria, a menos que o parâmetro OverwriteIfExists esteja definido como true.
A criação do Select Meta exige a varredura completa do objeto.
-
A tabela a seguir lista os parâmetros aceitos por select_meta_params.
Parâmetro
Descrição
Json_Type
-
Sem essa especificação, o objeto é considerado CSV por padrão.
-
Se especificado, deve ser LINES, indicando um objeto JSON LINES.
NotaEsta operação não se aplica a objetos JSON Document.
RecordDelimiter
Delimitador de linha do objeto CSV.
FieldDelimiter
Delimitador de coluna do objeto CSV.
QuoteCharacter
Caractere de aspas do objeto CSV. Delimitadores de linha e coluna entre aspas são tratados como caracteres comuns.
CompressionType
Formato de compressão do objeto. Nenhum formato de compressão é suportado nesta operação. Valor padrão: None.
OverwriteIfExists
Indica se o novo Select Meta deve sobrescrever o anterior. Geralmente não é necessário configurar este parâmetro.
-
Resultados retornados por create_select_object_meta: Retorna um objeto GetSelectObjectMetaResult contendo os atributos rows e splits. Para objetos CSV, o objeto select_resp no resultado também inclui o atributo columns, indicando o número de colunas.
-
Referências
Para acessar o código de exemplo completo sobre consulta de objetos, visite o GitHub.
Para mais detalhes sobre a operação de API utilizada na consulta de objetos, consulte SelectObject.