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 data type versions 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 product dependentes suportem a versão 2.0 dos tipos de dados.
Como ative 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 | Tipo de caractere de comprimento fixo n, com valor máximo de 255. Strings mais curtas recebem espaços em branco como preenchimento até atingirem o tamanho definido. Esses espaços à direita são ignorados durante 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 |
| Tipo de dados que representa um intervalo de tempo entre duas datas ou horas. Inclui dois subtipos: INTERVAL_YEAR_MONTH e INTERVAL_DAY_TIME. Para mais informações, consulte INTERVAL data type. |
Blob | Nenhum | Para mais informações, consulte Blob data type and multimodal storage. |
VECTOR | [1.1, 2.2, 3.3] | Tipo vetorial composto por um número fixo de elementos FLOAT. Representa vetores de incorporação de alta dimensão, como 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 VECTOR data type. |
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 em SQL representa 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. Caso exceda o intervalo de BIGINT, será tratado como DOUBLE.-
Ao inserir um literal em uma coluna DECIMAL, ele deve obedecer ao formato especificado em sua definição. Veja, por exemplo, o literal
3.5BDno código abaixo.INSERT INTO test_tb(a) VALUES (3.5BD) Literais STRING suportam concatenação. Quando dois ou mais literais de string são colocados lado a lado, 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 foram desabilitadas porque podem causar perda de precisão ou erros. Utilize a função CAST para executar essas conversões explicitamente.
Literais VARCHAR podem ser convertidos implicitamente para literais STRING.
-
Tabelas, funções e UDFs
Funções integradas que aceitam parâmetros da versão 2.0 dos tipos de dados funcionam conforme o 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
Tipos de dados complexos no MaxCompute podem ser aninhados em até 20 níveis de profundidade. Para mais informações sobre 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 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 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 tipos no INSERT
No modo compatível com Hive, se um tipo de dados de source 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 source deve ser implicitamente conversível; caso contrário, um erro será retornado.
O exemplo a seguir tem êxito 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 comportamentais de operadores e funções entre 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, retorna NULL
-
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 demais 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 2 V1.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 de 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 de 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 de quando a posição inicial é 1.
-