Este tópico descreve a versão 2.0 dos tipos de dados do MaxCompute, incluindo sua definição, casos de uso, tipos de dados suportados e as diferenças em relação a outras versões de tipos de dados.
Contexto
A versão 2.0 dos tipos de dados é uma das três versões de tipos de dados disponíveis no MaxCompute.
Ela é adequada para projetos do MaxCompute que não possuíam dados antes de abril de 2020, desde que todos os componentes de produtos dependentes suportem a versão 2.0 dos tipos de dados.
Como ativar a versão 2.0 dos tipos de dados
Para usar a versão 2.0 dos tipos de dados em um projeto, defina as seguintes propriedades.
setproject odps.sql.type.system.odps2=true; -- Enable MaxCompute data type version 2.0.
setproject odps.sql.decimal.odps2=true; -- Enable the DECIMAL 2.0 data type.
setproject odps.sql.hive.compatible=false; -- Disable Hive-compatible mode.Tipos de dados básicos
Tipo | Literal | Descrição |
TINYINT | 1Y, -127Y |
|
SMALLINT | 32767S, -100S |
|
INT | 1000, -15645787 |
|
BIGINT | 100000000000L, -1L |
|
BINARY |
|
|
FLOAT | 3.14F, CAST(3.14159261E+7 AS FLOAT) |
|
DOUBLE | 3.14D, 3.14159261E+7 |
|
DECIMAL(precision,scale) | 3.5BD, 99999999999.9999999BD |
|
VARCHAR(n) | Nenhum |
|
CHAR(n) | Nenhum | Um tipo de caractere de comprimento fixo n, com valor máximo de 255. Strings mais curtas são preenchidas com espaços até o comprimento definido. Esses espaços à direita são ignorados durante as comparações. |
STRING | "abc", 'bcd', "alibaba", 'inc' |
|
DATE | DATE'2017-11-11' |
|
DATETIME | DATETIME'2017-11-11 00:00:00' |
|
TIMESTAMP | TIMESTAMP'2017-11-11 00:00:00.123456789' |
|
TIMESTAMP_NTZ | TIMESTAMP_NTZ '2017-11-11 00:00:00.123456789' |
|
BOOLEAN | True, False |
|
INTERVAL |
| Um tipo de dados que representa um intervalo de tempo entre duas datas ou horas. Inclui dois tipos: INTERVAL_YEAR_MONTH e INTERVAL_DAY_TIME. Para mais informações, consulte Tipo de dados INTERVAL. |
Blob | Nenhum | Para mais informações, consulte Tipo de dados Blob e armazenamento multimodal. |
VECTOR | [1.1, 2.2, 3.3] | Um tipo de vetor composto por um número fixo de elementos FLOAT. Representa vetores de embeddings de alta dimensão, como as características semânticas de textos ou imagens. O número de dimensões pode variar de 1 a 4.096. Para mais informações, consulte Tipo de dados VECTOR. |
GEOGRAPHY |
| Tipo de dados geoespaciais. Usado para representar objetos geométricos na superfície da Terra, como pontos (Point), linhas (LineString) e polígonos (Polygon).
|
Observações sobre os tipos de dados:
Todos os tipos de dados listados acima podem ser NULL.
A palavra-chave INT no SQL é um inteiro de 32 bits.
-- Convert a to a 32-bit integer. CAST(a AS INT)Literais
Literais inteiros são tratados como tipo INT por padrão. Por exemplo, em
SELECT 1 + a;, o literal inteiro 1 é processado como INT. Se um literal exceder o intervalo de valores de INT, mas estiver dentro do intervalo de BIGINT, será tratado como BIGINT. Se exceder o intervalo de BIGINT, será tratado como DOUBLE.Ao inserir um literal em uma coluna DECIMAL, o literal deve estar em conformidade com o formato especificado na sua definição. Por exemplo, veja o literal
3.5BDno código a seguir.INSERT INTO test_tb(a) VALUES (3.5BD)Literais STRING suportam concatenação. Quando dois ou mais literais de string são colocados um ao lado do outro, eles são combinados automaticamente em uma única string. Por exemplo,
SELECT 'abc' 'efg' 'ddt';retornaabcefgddt.
Conversão implícita
Algumas conversões implícitas estão desativadas. Por exemplo, conversões de STRING para BIGINT, STRING para DATETIME, DOUBLE para BIGINT, DECIMAL para DOUBLE e DECIMAL para BIGINT estão desativadas porque podem causar perda de precisão ou erros. Use a função CAST para realizar essas conversões explicitamente.
Literais VARCHAR podem ser convertidos implicitamente em literais STRING.
Tabelas, funções e UDFs
As funções integradas que aceitam parâmetros da versão 2.0 dos tipos de dados funcionam conforme esperado.
Os tipos de dados em uma função definida pelo usuário (UDF) são resolvidos e sobrecarregados com base na versão 2.0 dos tipos de dados.
Colunas de partição suportam os tipos de dados STRING, VARCHAR, CHAR, TINYINT, SMALLINT, INT e BIGINT.
Tipos de dados complexos
Os tipos de dados complexos no MaxCompute podem ser aninhados em até 20 níveis de profundidade. Para mais informações sobre as funções integradas relacionadas, consulte ARRAY, MAP, STRUCT ou JSON.
O tamanho de um tipo de dado complexo não deve exceder 1 MB. Tipos de dados complexos maiores que 1 MB podem causar erros de falta de memória (OOM) durante a computação.
Tipo | Definição | Construtor |
ARRAY |
|
|
MAP |
|
|
STRUCT |
|
|
JSON |
|
|
Diferenças em relação a outras versões de tipos de dados
Diferenças no comportamento da sintaxe DML
Comportamento da cláusula LIMIT em operações de conjunto
Por exemplo, considere a consulta
SELECT * FROM t1 UNION ALL SELECT * FROM t2 LIMIT 10;:Na versão 1.0 dos tipos de dados, isso equivale a
SELECT * FROM t1 UNION ALL SELECT * FROM ( SELECT * FROM t2 LIMIT 10) t2;.Na versão 2.0 dos tipos de dados, isso equivale a
SELECT * FROM (SELECT * FROM t1 UNION ALL SELECT * FROM t2 ) t LIMIT 10;.
As operações ORDER BY, DISTRIBUTE BY, SORT BY e CLUSTER BY apresentam o mesmo comportamento.
Resolução de tipos para expressões IN
Por exemplo, na expressão
a in (1, 2, 3):Na versão 1.0 dos tipos de dados, todos os valores na lista após o IN devem ter o mesmo tipo de dados.
Na versão 2.0 dos tipos de dados, os valores precisam apenas ser implicitamente conversíveis para um tipo de dados comum.
Regras de conversão de tipo no INSERT
No modo compatível com Hive, se um tipo de dados de origem puder ser convertido explicitamente para o tipo da coluna de destino, o MaxCompute insere automaticamente uma função de conversão e a executa.
Nos modos V1.0 e V2.0, o tipo de origem deve ser implicitamente conversível; caso contrário, um erro é retornado.
O exemplo a seguir é bem-sucedido no modo compatível com Hive, mas falha nos modos V1.0 e V2.0:
CREATE TABLE t (a BIGINT); INSERT INTO TABLE SELECT 1.5;
Diferenças de comportamento de operadores e funções entre as edições de tipos de dados
Para os operadores
+,-,*,/ePOW:Compatível com Hive: retorna o valor inicial
V1.0 e V2.0: retorna um erro; em outros modos, NULL é retornado
Para os operadores
>,>=,=,<e<=aplicados a valores DOUBLE:Compatível com Hive: compara todos os dígitos diretamente
V1.0 e V2.0: compara apenas os primeiros 15 dígitos à direita do ponto decimal; os dígitos restantes são ignorados
Para os operadores
&,|e^:Compatível com Hive: mesmo tipo da entrada
V1.0 e V2.0: sempre BIGINT
Para funções como: LENGTH, LENGTHB, FIND_IN_SET, INSTR, SIZE, HASH, SIGN
Compatível com Hive: retorna um valor INT.
V1.0 e V2.0: retorna um valor BIGINT.
FLOOR, CEIL
Compatível com Hive: se o parâmetro de entrada for do tipo DECIMAL, um valor DECIMAL é retornado.
V1.0 e V2.0: se o parâmetro de entrada for do tipo DECIMAL, um valor BIGINT é retornado.
FROM_UNIXTIME
Compatível com Hive: retorna um valor STRING.
V1.0 e V2.0: retorna um valor DATETIME.
CONCAT_WS
Compatível com Hive: strings de entrada NULL são ignoradas; as strings restantes são concatenadas.
V1.0 e V2.0: se qualquer string de entrada for NULL, NULL é retornado.
FIND_IN_SET
Compatível com Hive: uma string vazia corresponde ao final da string de busca:
find_in_set("","") -- Returns 1 find_in_set("", "a,") -- Returns 2V1.0 e V2.0: uma string vazia é tratada como não correspondente e 0 é retornado.
REGEXP_(EXTRACT/REPLACE)
Compatível com Hive: especificações de expressões regulares Java
V1.0 e V2.0: especificações do MaxCompute
SUBSTR
STRING SUBSTR(STRING <string>, BIGINT <start_position>[, BIGINT <length>])start_position: obrigatório. Tipo BIGINT. A posição inicial padrão é 1.
Edição de tipos de dados compatível com Hive: quando start_position é 0, o comportamento é o mesmo que quando a posição inicial é 1.
Edições de tipos de dados 1.0 e 2.0: quando start_position é 0, uma string vazia é retornada.
Edição de tipos de dados compatível com BigQuery: quando start_position é 0, o comportamento é o mesmo que quando a posição inicial é 1.
Edição de tipos de dados compatível com BigQuery: quando start_position é menor que o comprimento negativo da string, o comportamento é o mesmo que quando a posição inicial é 1.