Use a API SelectObject para executar instruções SQL em objetos e obter os resultados.
Contexto
O Hadoop 3.0 é compatível com a execução de 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 delegar 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, o que reduz a transferência de dados, diminui os custos e economiza CPU e memória no lado do cliente. Essa eficiência torna a análise de dados no OSS muito mais atrativa.
Faturamento
Ao usar a API SelectObject para consultar dados, você paga de acordo com a quantidade real de dados examinados no objeto de origem. Para mais informações, consulte Data processing fees.
Formatos de objeto compatíveis
A API SelectObject é compatível com determinados formatos de objeto e sintaxes SQL.
Objetos CSV em conformidade com a RFC 4180. Isso inclui objetos semelhantes a CSV, como TSV. É possível especificar delimitadores de linha e de coluna, além de caracteres de aspas personalizados.
-
Objetos JSON codificados em UTF-8. Há suporte a dois formatos: DOCUMENT e LINES.
DOCUMENT: o objeto inteiro é um único objeto JSON válido.
LINES: o objeto consiste em várias linhas, em que cada linha é 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 é um objeto JSON válido.
Objetos nas classes de armazenamento Standard e Infrequent Access. É necessário restaurar objetos nas classes de armazenamento Archive, Cold Archive ou Deep Cold Archive antes de consultá-los.
Objetos criptografados no lado do servidor com 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 (+, -, *, /, %), de comparação (>, =, <, >=, <=, !=) e de 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, o sistema trata todos os dados em um objeto CSV 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 em inteiros:Select * from OSSOBject where cast (_1 as int) > cast(_2 as int)
A API SelectObject também é compatível com a conversão implícita de tipos em uma cláusula WHERE. Por exemplo, na instrução a seguir, a API converte implicitamente os valores da primeira e da segunda colunas em inteiros:
Select _1 from ossobject where _1 + _2 > 100
Para objetos JSON, se você não usar a função CAST, o conteúdo do objeto determina o tipo de dados. Os tipos de dados JSON nativos padrão incluem null, bool, int64, double e string.
Exemplos de SQL
Esta seção apresenta 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 os inteiros da primeira e da terceira colunas onde o valor da primeira coluna seja maior que o da terceira.
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'. (Nota: o caractere chinês após 'like' deve estar codificado em UTF-8.)
select count(*) from ossobject where _1 like 'Chen%'
Retornar todos os registros em que o timestamp na segunda coluna seja posterior a 2018-08-09 11:30:25 e o valor na terceira coluna seja maior que 200.
select * from ossobject where _2 > cast('2018-08-09 11:30:25' as timestamp) and _3 > 200
Retornar a média, a soma, o valor máximo e o valor 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 em que a string concatenada da primeira e da terceira colunas comece com 'Tom' e termine com 'Anderson'.
select * from ossobject where (_1
_3) like 'Tom%Anderson'
Retornar todos os registros em que o valor na primeira coluna seja divisível por 3.
select * from ossobject where (_1 % 3) = 0
Retornar todos os registros em que o valor na primeira coluna esteja entre 1995 e 2012.
select * from ossobject where _1 between 1995 and 2012
Retornar todos os registros em que o valor na quinta coluna seja 'N', 'M', 'G' ou 'L'.
select * from ossobject where _5 in ('N', 'M', 'G', 'L')
Retornar todos os registros em que o produto dos valores na segunda e na terceira colunas seja 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 em que o valor de age seja 27.
select from ossobject.contacts[] s where s.age = 27
Retornar todos os números de telefone residencial.
select s.number from ossobject.contacts[].phoneNumbers[] s where s.type = "home"
Retornar todos os registros em que spouse seja nulo.
select * from ossobject s where s.spouse is null
Retornar todos os registros em que não haja filhos.
select * from ossobject s where s.children[0] is null
NotaNão há uma sintaxe dedicada para representar um array vazio. Use a instrução anterior em vez disso.
Casos de uso
Os casos de uso comuns do SelectObject incluem consultar objetos grandes em paralelo, consultar objetos JSON e analisar arquivos de log.
-
Consultar objetos grandes em paralelo
Assim como o recurso de download multipart por intervalo de bytes disponível na API GetObject, a API SelectObject é compatível com consultas paralelas. É possível dividir os dados de duas maneiras:
Por linha: este é um método comum para dividir dados. No entanto, para dados esparsos, a divisão por linha pode resultar em uma carga desequilibrada entre os workers de consulta.
Por split: um split é um conceito do OSS para fragmentação de dados. Um split contém várias linhas e cada split tem aproximadamente o mesmo tamanho.
NotaDividir dados por split é mais eficiente do que dividi-los por linha.
Se você confirmar que as colunas do seu objeto CSV não contêm caracteres de nova linha, a divisão por intervalo de bytes é mais simples, pois não exige criar metadados. Se as colunas contiverem caracteres de nova linha ou se você estiver consultando 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 varredura, 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 ser consultado, como
split-range=1-20.Mescle os resultados de todas as consultas paralelas.
-
Consultar 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 em que o código postal começa com '10021', é possível escrever 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%', tem um desempenho melhor porque seu caminho JSON é mais preciso. -
Lidar com números de ponto flutuante de alta precisão em objetos JSON
Quando for necessário fazer cálculos com números de ponto flutuante de alta precisão em um objeto JSON, recomendamos definir a opção
ParseJsonNumberAsStringcomotruee então 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 têm como base a API SelectObject subjacente. Se você tiver requisitos avançados, faça solicitações diretas à API REST. Ao fazer solicitações diretas, calcule manualmente a assinatura de autenticação. Para mais informações, consulte SelectObject.
> Select Content