Use a API SelectObject para executar instruções SQL em objetos e recuperar os resultados.
Contexto
O Hadoop 3.0 permite executar serviços como Spark, Hive e Presto no E-MapReduce (EMR) para processar dados armazenados no Object Storage Service (OSS). Serviços da Alibaba Cloud, como MaxCompute e Data Lake Analytics (DLA), também processam dados diretamente do OSS.
Tradicionalmente, as plataformas de big data usam a API GetObject para baixar objetos inteiros do OSS antes de filtrá-los e analisá-los.
A API SelectObject resolve esse problema ao transferir a lógica de consulta, como projeções e filtros, para a camada do OSS. Isso permite recuperar apenas o subconjunto de dados necessário, reduzindo a transferência de dados, os custos e o consumo de CPU e memória no lado do cliente. Essa eficiência torna a análise de dados no OSS mais atrativa.
Faturamento
Ao usar a API SelectObject para consultar dados, a cobrança baseia-se na quantidade real de dados verificados no objeto de origem. Para obter mais informações, consulte Taxas de processamento de dados.
Formatos de objeto compatíveis
A API SelectObject oferece suporte a formatos de objeto e sintaxe SQL específicos.
Objetos CSV em conformidade com a RFC 4180. Inclui objetos semelhantes a CSV, como TSV. É possível especificar delimitadores de linha, delimitadores de coluna e caracteres de aspas personalizados.
-
Objetos JSON codificados em UTF-8. Dois formatos são compatíveis: DOCUMENT e LINES.
DOCUMENT: O objeto inteiro é um único objeto JSON válido.
LINES: O objeto consiste em várias linhas, cada uma representando um objeto JSON independente. As linhas são separadas por um caractere de nova linha, como \n ou \r\n. Não é necessário especificar o delimitador. No entanto, o objeto inteiro não constitui um objeto JSON válido.
Objetos nas classes de armazenamento Standard e Infrequent Access. Objetos nas classes Archive, Cold Archive ou Deep Cold Archive devem ser restaurados antes da consulta.
Objetos criptografados com criptografia no lado do servidor usando chaves gerenciadas pelo OSS ou uma CMK gerenciada pelo KMS.
Sintaxe SQL compatível
Cláusulas SQL: SELECT, FROM, WHERE
Tipos de dados: string, int (64 bits), double (64 bits), decimal (128 bits), timestamp e bool
-
Operadores: Lógicos (AND, OR, NOT), Aritméticos (+, -, *, /, %), Comparação (>, =, <, >=, <=, !=) e String (LIKE, ||)
ImportanteO operador LIKE diferencia maiúsculas de minúsculas na correspondência de padrões.
Tipos de dados compatíveis
Por padrão, todos os dados em um objeto CSV são tratados como strings. Use a função CAST para converter tipos explicitamente.
O exemplo a seguir mostra como usar uma consulta SQL para converter os valores nas colunas _1 e _2 para inteiros:Select * from OSSOBject where cast (_1 as int) > cast(_2 as int)
A API SelectObject também suporta conversão implícita de tipos em uma cláusula WHERE. Por exemplo, na instrução a seguir, os valores da primeira e da segunda colunas são convertidos implicitamente para inteiros:
Select _1 from ossobject where _1 + _2 > 100
Para objetos JSON, se você não usar a função CAST, o tipo de dados será determinado pelo conteúdo do objeto. Os tipos de dados JSON internos padrão incluem null, bool, int64, double e string.
Exemplos de SQL
Esta seção fornece exemplos de SQL para objetos CSV e JSON.
-
CSV
Caso de uso
Instrução SQL
Retornar as primeiras 10 linhas de dados.
select * from ossobject limit 10
Retornar inteiros da primeira e da terceira colunas onde o valor na primeira coluna é maior que o valor na terceira coluna.
select _1, _3 from ossobject where cast(_1 as int) > cast(_3 as int)
Retornar a contagem de registros na primeira coluna que começam com 'Chen'. (Observação: O caractere chinês após 'like' deve ser codificado em UTF-8.)
select count(*) from ossobject where _1 like 'Chen%'
Retornar todos os registros onde o timestamp na segunda coluna é posterior a 2018-08-09 11:30:25 e o valor na terceira coluna é maior que 200.
select * from ossobject where _2 > cast('2018-08-09 11:30:25' as timestamp) and _3 > 200
Retornar a média, soma, máximo e mínimo dos números de ponto flutuante na segunda coluna.
select AVG(cast(_6 as double)), SUM(cast(_6 as double)), MAX(cast(_6 as double)), MIN(cast(_6 as double)) from ossobject
Retornar todos os registros onde a string concatenada da primeira e da terceira colunas começa com 'Tom' e termina com 'Anderson'.
select * from ossobject where (_1
_3) like 'Tom%Anderson'
Retornar todos os registros onde o valor na primeira coluna é divisível por 3.
select * from ossobject where (_1 % 3) = 0
Retornar todos os registros onde o valor na primeira coluna está entre 1995 e 2012.
select * from ossobject where _1 between 1995 and 2012
Retornar todos os registros onde o valor na quinta coluna é 'N', 'M', 'G' ou 'L'.
select * from ossobject where _5 in ('N', 'M', 'G', 'L')
Retornar todos os registros onde o produto dos valores na segunda e terceira colunas é maior que a soma de 100 com o valor na quinta coluna.
select from ossobject where _2 _3 > _5 + 100
-
JSON
Considere o seguinte objeto 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 },... # Additional contact nodes omitted for brevity. ]}A tabela a seguir fornece exemplos de SQL.
Caso de uso
Instrução SQL
Retornar todos os registros onde o valor de age é 27.
select from ossobject.contacts[] s where s.age = 27
Retornar todos os números de telefone residenciais.
select s.number from ossobject.contacts[].phoneNumbers[] s where s.type = "home"
Retornar todos os registros onde spouse é null.
select * from ossobject s where s.spouse is null
Retornar todos os registros sem filhos.
select * from ossobject s where s.children[0] is null
NotaNão existe sintaxe dedicada para representar um array vazio. Use a instrução anterior como alternativa.
Casos de uso
Os casos de uso comuns do SelectObject incluem consulta paralela de objetos grandes, consulta de objetos JSON e análise de arquivos de log.
-
Consulta paralela de objetos grandes
Assim como o recurso de download multipartido por intervalo de bytes da API GetObject, a API SelectObject suporta consultas paralelas. Existem duas maneiras de dividir os dados:
Por linha: Método comum de divisão de dados. Contudo, para dados esparsos, a divisão por linha pode resultar em carga desequilibrada entre os workers de consulta.
Por split: Um split é um conceito do OSS para fragmentação de dados. Cada split contém várias linhas e tem aproximadamente o mesmo tamanho.
NotaA divisão de dados por split é mais eficiente do que por linha.
Se for possível confirmar que as colunas no objeto CSV não contêm caracteres de nova linha, a divisão por intervalo de bytes é mais simples, pois não exige criação de metadados. Caso as colunas contenham caracteres de nova linha ou se a consulta for em um objeto JSON, siga estas etapas:
Chame a API CreateSelectObjectMeta para obter o número total de splits do objeto. Para reduzir o tempo de verificação, recomendamos chamar essa API de forma assíncrona antes de iniciar a consulta.
Com base nos recursos do cliente, determine o grau de paralelismo (n). Em seguida, divida o número total de splits por n para calcular quantos splits cada consulta paralela deve processar.
No corpo da solicitação, especifique o intervalo de splits a serem consultados, como
split-range=1-20.Mescle os resultados de todas as consultas paralelas.
-
Consulta de objetos JSON
Ao consultar objetos JSON, restrinja o caminho JSON na cláusula FROM para melhorar o desempenho.
Considere o seguinte exemplo de objeto 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" } ] } ]}Para encontrar todos os endereços residenciais cujo código postal comece com '10021', escreva a instrução SQL como
select s.address.streetAddress from ossobject.contacts[*] s where s.address.postalCode like '10021%'ouselect s.streetAddress from ossobject.contacts[*].address s where s.postalCode like '10021%'.A segunda instrução,
select s.streetAddress from ossobject.contacts[*].address s where s.postalCode like '10021%', apresenta melhor desempenho porque seu caminho JSON é mais preciso. -
Tratamento de números de ponto flutuante de alta precisão em objetos JSON
Quando for necessário realizar cálculos com números de ponto flutuante de alta precisão em um objeto JSON, recomendamos definir a opção
ParseJsonNumberAsStringcomotruee converter o valor para o tipo decimal. Por exemplo, se um atributoativer o valor 123456789.123456789, use a instruçãoselect s.a from ossobject s where cast(s.a as decimal) > 123456789.12345para manter a precisão dos dados originais.
Procedimento
OSS console
OSS SDKs
ossutil CLI
Referência da API
As operações descritas acima baseiam-se na API SelectObject subjacente. Para requisitos avançados, faça solicitações diretas à API REST. Ao fazer solicitações diretas, calcule manualmente a assinatura de autenticação. Para obter mais informações, consulte SelectObject.
> Select Content