Tipos de dados da tabela Iceberg

Este tópico fornece informações sobre como os tipos de dados funcionam para tabelas Iceberg no Snowflake.

Como funcionam os tipos de dados para tabelas Iceberg

O Snowflake oferece suporte à maioria dos tipos de dados definidos pela especificação Apache Iceberg e grava tipos de dados Iceberg em arquivos de tabela para que suas tabelas Iceberg permaneçam interoperáveis entre diferentes mecanismos de computação quando você usa o Snowflake como catálogo.

Para obter uma visão geral dos tipos de dados Iceberg compatíveis com o Snowflake, consulte Tipos de dados suportados para tabelas Iceberg.

Uso dos tipos Iceberg para definir colunas

Ao criar uma tabela Iceberg que usa Snowflake como catálogo, você pode usar tipos de dados Iceberg para definir colunas.

Por exemplo:

CREATE OR REPLACE ICEBERG TABLE my_iceberg_table (
    boolean_col boolean,
    int_col int,
    long_col long,
    float_col float,
    double_col double,
    decimal_col decimal(10,5),
    string_col string,
    fixed_col fixed(10),
    binary_col binary,
    date_col date,
    time_col time,
    timestamp_ntz_col timestamp_ntz(6),
    timestamp_ltz_col timestamp_ltz(6)
  )
  CATALOG = 'SNOWFLAKE'
  EXTERNAL_VOLUME = 'my_ext_vol'
  BASE_LOCATION = 'my/relative/path/from/extvol';
Copy

Tipos aproximados

Se a sua tabela usar um tipo de dados Iceberg para o qual o Snowflake não oferece suporte a uma correspondência exata, o Snowflake usará um tipo Snowflake aproximado. Esse mapeamento de tipo afeta os valores das colunas para tabelas convertidas e tabelas Iceberg que usam Snowflake como catálogo.

Por exemplo, considere uma tabela com uma coluna do tipo Iceberg int. Snowflake processa os valores da coluna usando o tipo de dados Snowflake NUMBER(10,0).

NUMBER(10,0) tem um intervalo de (-9.999.999.999, +9.999.999.999), mas int tem um intervalo mais limitado de (-2.147.483.648, +2.147.483.647). Se você tentar inserir um valor de 3.000.000.000 nessa coluna, o Snowflake retornará uma mensagem de erro fora do intervalo.

Para obter detalhes sobre tipos aproximados, consulte as notas na tabela Tipos de dados suportados para tabelas Iceberg.

Tipos de dados suportados para tabelas Iceberg

A tabela a seguir mostra a relação entre os tipos de dados Iceberg e os tipos de dados Snowflake. Ela usa as seguintes colunas:

Tipo Iceberg:

O tipo de dados definido na especificação Apache Iceberg. Quando você usa o Snowflake como catálogo, o Snowflake grava o tipo Iceberg nos arquivos de dados da tabela para que as tabelas permaneçam interoperáveis entre diferentes mecanismos de computação.

Tipo de dados Snowflake:

O tipo de dados Snowflake usado para processar e retornar dados da tabela. Por exemplo, se seu esquema especificar o tipo Iceberg timestamp, o Snowflake processará e retornará valores usando o tipo de dados Snowflake TIMESTAMP_NTZ(6) com precisão de microssegundos.

Notas:

Notas de uso adicionais, incluindo notas para trabalhar com tipos aproximados.

Tipo de dados Iceberg

Tipo de dados do Snowflake

Notas

boolean

BOOLEAN

int (inteiro assinado de 32 bits)

NUMBER(10,0)

Inserir um número de 10 dígitos menor que o mínimo ou maior que o valor inteiro assinado de 32 bits máximo resulta em um erro fora do intervalo.

long (inteiro assinado de 64 bits)

NUMBER(19,0)

Inserir um número de 19 dígitos menor que o mínimo ou maior que o valor inteiro assinado de 64 bits máximo resulta em um erro fora do intervalo.

float (ponto flutuante precisão única 32 bits IEEE 754)

FLOAT

Sinônimo do tipo de dados Snowflake DOUBLE. Snowflake trata todos os números de ponto flutuante como números de ponto flutuante de 64 bits de precisão dupla, mas grava os números flutuantes Iceberg como números de ponto flutuante de 32 bits em arquivos de dados de tabela.

Reduzir as conversões de 64 bits para 32 bits resulta em perda de precisão.

double (ponto flutuante de precisão dupla 64 bits IEEE 754)

FLOAT

Sinônimo do tipo de dados Snowflake DOUBLE. Snowflake trata todos os números de ponto flutuante como números de ponto flutuante de 64 bits de precisão dupla.

decimal(P,S)

NUMBER(P,S)

date

DATE

time

TIME(6)

Precisão de microssegundos. As tabelas Iceberg não suportam o uso de outra precisão, como milissegundo ou nanossegundo.

timestamp

TIMESTAMP_NTZ(6)

Precisão de microssegundos. As tabelas Iceberg não suportam o uso de outra precisão, como milissegundo ou nanossegundo.

Snowflake não oferece suporte ao uso do tipo físico Parquet obsoleto int96 para carimbos de data/hora.

timestamptz

TIMESTAMP_LTZ(6)

Precisão de microssegundos. As tabelas Iceberg não suportam o uso de outra precisão, como milissegundo ou nanossegundo.

string

VARCHAR(16777216)

uuid

BINARY(16)

O tipo de dados uuid não é compatível com tabelas que usam Snowflake como catálogo ou para tabelas convertidas.

Quando você usa um catálogo externo ou cria uma tabela a partir de arquivos no armazenamento de objetos, o Snowflake mapeia o tipo Iceberg uuid para o tipo BINARY(16) Snowflake.

fixed(L)

BINARY(L)

Você pode criar uma tabela Iceberg usando esse tipo, mas não pode converter uma tabela que tenha uma coluna do tipo fixed(L).

struct

OBJECT estruturado

Colunas de tipo estruturado suportam no máximo 1.000 subcolunas.

list

ARRAY estruturada

Colunas de tipo estruturado suportam no máximo 1.000 subcolunas.

map

MAP

Colunas de tipo estruturado suportam no máximo 1.000 subcolunas.

Considerações

Considere os itens a seguir ao trabalhar com tipos de dados para tabelas Iceberg:

  • Não há suporte para a conversão de uma tabela com colunas que usam os seguintes tipos de dados Iceberg:

    • uuid

    • fixed(L)

  • Para tabelas que usam Snowflake como catálogo, não há suporte para a criação de uma tabela que use o tipo de dados Iceberg uuid.

  • Para todos os tipos de tabela Iceberg:

    • Colunas de tipo estruturado suportam no máximo 1.000 subcolunas.

    • O uso do tipo físico Parquet obsoleto int96 para carimbos de data/hora não é suportado.

    • Iceberg oferece suporte à precisão de microssegundos para tipos de hora e carimbo de data/hora. Como resultado, você não pode criar uma tabela Iceberg no Snowflake que use outra precisão, como milissegundo ou nanossegundo.