Observação
O acesso a essa página exige autorização. Você pode tentar entrar ou alterar diretórios.
O acesso a essa página exige autorização. Você pode tentar alterar os diretórios.
Aplica-se a:
Databricks SQL
Databricks Runtime
O Azure Databricks usa várias regras para resolver conflitos entre tipos de dados:
- A promoção expande com segurança um tipo para um tipo mais amplo.
- O downcasting implícito restringe um tipo. É o oposto da promoção.
- O crosscasting implícito transforma um tipo em um tipo de outra família de tipos.
Você também pode converter explicitamente entre muitos tipos:
- A função cast converte entre a maioria dos tipos e retorna erros se não conseguir.
- função try_cast funciona como função cast, mas retorna NULL quando são passados valores inválidos.
- Outras funções internas são convertidas entre tipos usando as diretivas de formato fornecidas.
Promoção de tipos
Promoção de tipos é o processo de conversão de um tipo em outro tipo da mesma família de tipos que contém todos os valores possíveis do tipo original.
Portanto, a promoção de tipos é uma operação segura. Por exemplo, TINYINT tem um intervalo de -128 a 127. Todos os seus valores possíveis podem ser promovidos com segurança para INTEGER.
Lista de precedência de tipos
A lista de precedência de tipos define se os valores de determinado tipo de dados podem ser promovidos implicitamente para outro tipo de dados.
| Tipo de dados | Lista de precedência (da mais restrita para a mais ampla) |
|---|---|
| TINYINT | TINYINT -> SMALLINT -> INT -> BIGINT -> DECIMAL -> FLOAT (1) -> DOUBLE |
| SMALLINT | SMALLINT -> INT -> BIGINT -> DECIMAL -> FLOAT (1) -> DOUBLE |
| INT | INT -> BIGINT -> DECIMAL -> FLOAT (1) -> DOUBLE |
| BIGINT | BIGINT -> DECIMAL -> FLOAT (1) -> DOUBLE |
| DECIMAL | DECIMAL -> FLOAT (1) -> DOUBLE |
| FLOAT | FLOAT (1) –> DOUBLE |
| DOUBLE | DOUBLE |
| DATE | DATA –> CARIMBO DE DATA/HORA |
| TIMESTAMP | TIMESTAMP |
| ARRAY | ARRAY (2) |
| BINARY | BINARY |
| BOOLEAN | BOOLEAN |
| INTERVAL | INTERVAL |
| GEOGRAFIA | GEOGRAFIA(QUALQUER) |
| GEOMETRIA | GEOMETRY(ANY) |
| MAP | MAP (2) |
| STRING | STRING |
| STRUCT | STRUCT (2) |
| VARIANT | VARIANT |
| OBJECT | OBJECT (3) |
(1) Para a resoluçãoFLOAT de tipo menos comum, é ignorada para evitar perda de precisão.
(2) Para um tipo complexo, a regra de precedência se aplica recursivamente aos seus elementos de componente.
(3)OBJECT existe somente dentro de um VARIANT.
Cadeias de caracteres e NULL
Regras especiais se aplicam a STRING e NULL não digitado:
-
NULLpode ser promovido a qualquer outro tipo. -
STRINGpode ser promovido aBIGINT,BINARY,BOOLEAN,DATE,DOUBLE,INTERVALeTIMESTAMP. Se o valor real da cadeia de caracteres não puder ser convertido em um tipo mínimo comum, o Azure Databricks gerará um erro de tempo de execução. Ao promover paraINTERVAL, o valor da cadeia de caracteres deve corresponder às unidades de intervalos.
Grafo de precedência de tipos
Essa é uma representação gráfica da hierarquia de precedência, combinando a lista de precedência de tipos e as regras de cadeia de caracteres e NULLs.
Resolução de tipo mínimo comum
O tipo mínimo comum em um conjunto de tipos é o mais restrito do grafo de precedência de tipos acessível por todos os elementos do conjunto de tipos.
A resolução de tipo mínimo comum é usada para:
- Decidir se uma função que espera um parâmetro de determinado tipo pode ser chamada com o uso de um argumento de um tipo mais restrito.
- Derivar o tipo de argumento para uma função que espera um tipo de argumento compartilhado para vários parâmetros, como coalesce, in, least ou greatest.
- Derivar os tipos de operando para operadores como operações aritméticas ou comparações.
- Derivar o tipo de resultado para expressões como a expressão de caso.
- Derivar os tipos de elemento, chave ou valor para os construtores de array e mapa.
- Derivar o tipo de resultado dos operadores de conjunto UNION, INTERSECT ou EXCEPT.
Regras especiais serão aplicadas se o tipo mínimo comum for resolvido para FLOAT. Se qualquer um dos tipos contribuintes for um tipo numérico exato (TINYINT, SMALLINT, INTEGER, BIGINT ou DECIMAL), o tipo mínimo comum será enviado por push para DOUBLE para evitar uma possível perda de dígitos.
Quando o tipo menos comum é um STRING, a ordenação é computada seguindo as regras de precedência de ordenação.
Downcasting e crosscasting implícitos
O Azure Databricks emprega essas formas de conversão implícita somente em invocação de função e de operador, e apenas onde ela pode determinar a intenção de forma não ambígua.
Conversão descendente implícita
O downcasting implícito converte automaticamente um tipo mais amplo em outro mais restrito, sem exigir a especificação explícita da conversão. O downcasting é conveniente, mas implica risco de erros de tempo de execução inesperados se o valor real não puder ser representável no tipo limitado.
O downcasting aplica a lista de precedência de tipo na ordem inversa. Os tipos de dados
GEOGRAPHYeGEOMETRYnunca são rebaixados.
Transmissão cruzada implícita
O crosscasting implícito converte um valor de uma família de tipos em outro, sem exigir que você especifique a conversão explicitamente.
O Azure Databricks oferece suporte a crosscasting implícito de:
- Qualquer tipo simples, exceto
BINARY,GEOGRAPHY, eGEOMETRY, paraSTRING. - Uma
STRINGpara qualquer tipo simples, excetoGEOGRAPHYeGEOMETRY.
- Qualquer tipo simples, exceto
Casting na invocação de função
Dada uma função ou um operador resolvido, as regras a seguir se aplicam, na ordem em que estão listadas, a cada parâmetro e par de argumentos:
Se um tipo de parâmetro com suporte fizer parte do grafo de precedência de tipo do argumento, o Azure Databricks promoverá o argumento para esse tipo de parâmetro.
Na maioria dos casos, a descrição da função declara explicitamente os tipos ou a cadeia com suporte, como "qualquer tipo numérico".
Por exemplo, sin(expr) opera em
DOUBLE, mas aceitará qualquer valor numérico.Se o tipo de parâmetro esperado for um
STRINGe o argumento for um tipo simples, o Azure Databricks cruzará o argumento para o tipo de parâmetro de cadeia de caracteres .Por exemplo, substr(str, start, len) espera que
strseja umaSTRING. Em vez disso, você pode transmitir um tipo numérico ou de data e hora.Se o tipo de argumento for um
STRINGe o tipo de parâmetro esperado for um tipo simples, o Azure Databricks faz a conversão do argumento string para o tipo de parâmetro mais abrangente com suporte.Por exemplo, date_add(data, dias) espera um
DATEe umINTEGER.Se você invocar
date_add()com doisSTRINGs, o Azure Databricks cruzará o primeiroSTRINGparaDATEe o segundoSTRINGpara umINTEGER.Se a função espera um tipo numérico, como um
INTEGERou um tipoDATE, mas o argumento é um tipo mais geral, como umDOUBLEouTIMESTAMP, o Azure Databricks implicitamente faz downcast do argumento para esse tipo de parâmetro.Por exemplo, um date_add(data, dias) espera um
DATEe umINTEGER.Se você invocar
date_add()com umTIMESTAMPe umBIGINT, o Azure Databricks realiza o downcast doTIMESTAMPparaDATEremovendo o componente de tempo e doBIGINTpara umINTEGER.Caso contrário, o Azure Databricks gerará um erro.
Examples
A coalesce função aceita qualquer conjunto de tipos de argumento, desde que compartilhem um tipo menos comum.
O tipo de resultado é o tipo mínimo comum dos argumentos.
-- The least common type of TINYINT and BIGINT is BIGINT
> SELECT typeof(coalesce(1Y, 1L, NULL));
BIGINT
-- INTEGER and DATE do not share a precedence chain or support crosscasting in either direction.
> SELECT typeof(coalesce(1, DATE'2020-01-01'));
Error: DATATYPE_MISMATCH.DATA_DIFF_TYPES
-- Both are ARRAYs and the elements have a least common type
> SELECT typeof(coalesce(ARRAY(1Y), ARRAY(1L)))
ARRAY<BIGINT>
-- The least common type of INT and FLOAT is DOUBLE
> SELECT typeof(coalesce(1, 1F))
DOUBLE
> SELECT typeof(coalesce(1L, 1F))
DOUBLE
> SELECT typeof(coalesce(1BD, 1F))
DOUBLE
-- The least common type between an INT and STRING is BIGINT
> SELECT typeof(coalesce(5, '6'));
BIGINT
-- The least common type is a BIGINT, but the value is not BIGINT.
> SELECT coalesce('6.1', 5);
Error: CAST_INVALID_INPUT
-- The least common type between a DECIMAL and a STRING is a DOUBLE
> SELECT typeof(coalesce(1BD, '6'));
DOUBLE
-- Two distinct explicit collations result in an error
> SELECT collation(coalesce('hello' COLLATE UTF8_BINARY,
'world' COLLATE UNICODE));
Error: COLLATION_MISMATCH.EXPLICIT
-- The resulting collation between two distinct implicit collations is indeterminate
> SELECT collation(coalesce(c1, c2))
FROM VALUES('hello' COLLATE UTF8_BINARY,
'world' COLLATE UNICODE) AS T(c1, c2);
NULL
-- The resulting collation between a explicit and an implicit collations is the explicit collation.
> SELECT collation(coalesce(c1 COLLATE UTF8_BINARY, c2))
FROM VALUES('hello',
'world' COLLATE UNICODE) AS T(c1, c2);
UTF8_BINARY
-- The resulting collation between an implicit and the default collation is the implicit collation.
> SELECT collation(coalesce(c1, 'world'))
FROM VALUES('hello' COLLATE UNICODE) AS T(c1, c2);
UNICODE
-- The resulting collation between the default collation and the indeterminate collation is the default collation.
> SELECT collation(coalesce(coalesce('hello' COLLATE UTF8_BINARY, 'world' COLLATE UNICODE), 'world'));
UTF8_BINARY
-- Least common type between GEOGRAPHY(srid) and GEOGRAPHY(ANY)
> SELECT typeof(coalesce(st_geogfromtext('POINT(1 2)'), to_geography('POINT(3 4)'), NULL));
geography(any)
-- Least common type between GEOMETRY(srid1) and GEOMETRY(srid2)
> SELECT typeof(coalesce(st_geomfromtext('POINT(1 2)', 4326), st_geomfromtext('POINT(3 4)', 3857), NULL));
geometry(any)
-- Least common type between GEOMETRY(srid1) and GEOMETRY(ANY)
> SELECT typeof(coalesce(st_geomfromtext('POINT(1 2)', 4326), to_geometry('POINT(3 4)'), NULL));
geometry(any)
A substring função espera argumentos de tipo STRING para a cadeia de caracteres e INTEGER para os parâmetros de início e comprimento.
-- Promotion of TINYINT to INTEGER
> SELECT substring('hello', 1Y, 2);
he
-- No casting
> SELECT substring('hello', 1, 2);
he
-- Casting of a literal string
> SELECT substring('hello', '1', 2);
he
-- Downcasting of a BIGINT to an INT
> SELECT substring('hello', 1L, 2);
he
-- Crosscasting from STRING to INTEGER
> SELECT substring('hello', str, 2)
FROM VALUES(CAST('1' AS STRING)) AS T(str);
he
-- Crosscasting from INTEGER to STRING
> SELECT substring(12345, 2, 2);
23
|| (CONCAT) permite o crosscasting implícito para string.
-- A numeric is cast to STRING
> SELECT 'This is a numeric: ' || 5.4E10;
This is a numeric: 5.4E10
-- A date is cast to STRING
> SELECT 'This is a date: ' || DATE'2021-11-30';
This is a date: 2021-11-30
date_add pode ser invocado com um TIMESTAMP ou BIGINT devido ao downcasting implícito (conversão de tipo descendente).
> SELECT date_add(TIMESTAMP'2011-11-30 08:30:00', 5L);
2011-12-05
date_add pode ser invocado com STRINGs devido ao cast cruzado implícito.
> SELECT date_add('2011-11-30 08:30:00', '5');
2011-12-05