Escolher tipos de dados de coluna

Concluído

Escolher o tipo de dado certo para cada coluna afeta diretamente a qualidade dos seus dados, eficiência de armazenamento e desempenho das consultas. Quando seleciona um tipo inadequado, corre-se o risco de perder precisão, desperdiçar espaço de armazenamento ou bloquear operações que exigem características específicas do tipo. Nesta unidade, aprende a avaliar os seus dados e a selecionar os tipos de colunas mais apropriados no Azure Databricks.

Compreender as categorias de tipos de dados

O Azure Databricks organiza os tipos de dados em categorias com base nas suas características e casos de uso. Compreender estas categorias ajuda-o a restringir as opções ao escolher um tipo para uma coluna específica.

Os tipos numéricos tratam dos valores e cálculos matemáticos. Tem várias opções:

Categoria de tipo Types Caso de uso
Integral TINYINT, SMALLINT, INT, BIGINT Números inteiros de tamanhos variados
Decimal DECIMAL(p,s) Precisão exata para dados financeiros
Ponto flutuante FLOAT, DOUBLE Cálculos científicos com aproximação

Os tipos data-hora representam dados temporais:

Tipo Description
DATE Datas do calendário sem componentes temporais
TIMESTAMP Data e hora com o fuso horário da sessão
TIMESTAMP_NTZ Data e hora sem fuso horário

Os tipos de texto e binários armazenam sequências de caracteres e bytes:

  • STRING para texto de comprimento variável
  • BINARY para sequências brutas de bytes

Os tipos complexos organizam dados aninhados ou repetidos:

  • ARRAY para sequências ordenadas de elementos
  • MAP para pares de chave-valor
  • STRUCT para registos com campos nomeados

Selecione o tipo numérico correto

Os dados numéricos requerem uma seleção cuidadosa dos tipos porque diferentes tipos têm diferentes precisões, alcance e características de armazenamento. A sua escolha afeta tanto a integridade dos dados como o desempenho.

Para números inteiros, associe o tipo ao seu intervalo de valores:

Tipo Alcance Armazenamento Casos comuns de utilização
TINYINT -128 a 127 1 byte Códigos de estado, pequenos marcadores
SMALLINT -32.768 a 32.767 2 bytes Valores de ano, intervalos limitados
INT -2,1 mil milhões a 2,1 mil milhões 4 bytes A maioria dos identificadores, conta
BIGINT -9,2 quintiliões a 9,2 quintiliões 8 bytes IDs grandes, número de linhas

Ao criar tabelas, especifique o tipo apropriado para cada coluna:

CREATE TABLE orders (
    order_id INT,
    status_code TINYINT,
    total_items SMALLINT,
    transaction_id BIGINT
);

Para números decimais, a escolha entre DECIMAL e tipos de ponto flutuante depende dos seus requisitos de precisão:

-- DECIMAL(p,s): exact precision for financial calculations
-- p = total digits, s = digits after decimal point
CREATE TABLE transactions (
    transaction_id INT,
    amount DECIMAL(10,2),         -- Exact: up to 99,999,999.99
    tax_rate DECIMAL(5,4)         -- Exact: up to 9.9999
);

-- DOUBLE: approximate, suitable for scientific calculations
CREATE TABLE measurements (
    sensor_id INT,
    temperature DOUBLE,           -- Approximate, large range
    pressure DOUBLE
);

Importante

Use DECIMAL para dados financeiros onde a precisão exata importa. Os tipos de ponto flutuante (FLOAT, DOUBLE) usam representação binária e podem introduzir erros de arredondamento com valores em base 10, como a moeda.

Escolha corretamente os tipos temporais

A seleção temporal do tipo de dados depende se precisa de consciência do fuso horário e do nível de precisão que a sua aplicação exige.

Use DATE quando só precisa de datas de calendário sem componentes de tempo:

CREATE TABLE employees (
    employee_id INT,
    hire_date DATE,
    birth_date DATE
);

Para carimbos temporais, escolha entre tipos conscientes de fusos horários e tipos insensíveis a fusos horários.

-- TIMESTAMP: normalizes to UTC internally, applies session timezone on read
-- Use when tracking events across time zones
CREATE TABLE audit_log (
    log_id BIGINT,
    event_time TIMESTAMP,
    user_id INT
);

-- TIMESTAMP_NTZ: no timezone conversion
-- Use when the time should remain as entered
CREATE TABLE schedules (
    schedule_id INT,
    local_meeting_time TIMESTAMP_NTZ
);

O TIMESTAMP tipo converte valores para UTC para armazenamento e aplica o fuso horário da sessão ao recuperar valores. Este comportamento garante uma ordenação consistente entre fusos horários, mas pode causar confusão se esperar que os valores permaneçam inalterados.

Observação

TIMESTAMP_NTZ está em Pré-visualização Pública. Quando cria uma nova tabela Delta com uma TIMESTAMP_NTZ coluna, o Azure Databricks ativa a timestampNtz funcionalidade de tabela e atualiza o protocolo de tabela.

O diagrama explica a escolha correta dos tipos temporais.

Trabalho com tipos complexos

Os tipos complexos permitem armazenar dados estruturados, aninhados ou repetidos dentro de uma única coluna. São úteis quando os seus dados não se encaixam num modelo relacional plano.

Diagrama explica como trabalhar com tipos complexos.

Use ARRAY quando tem múltiplos valores do mesmo tipo:

-- Store a list of tags for each product
CREATE TABLE products (
    product_id INT,
    name STRING,
    tags ARRAY<STRING>
);

-- Query array elements
SELECT product_id, tags[0] AS primary_tag FROM products;

Uso MAP para pares chave-valor com chaves dinâmicas:

-- Store flexible attributes as key-value pairs
CREATE TABLE devices (
    device_id INT,
    properties MAP<STRING, STRING>
);

-- Access map values by key
SELECT device_id, properties['firmware_version'] AS firmware FROM devices;

Use STRUCT quando tem um conjunto fixo de campos nomeados:

-- Store address as a structured type
CREATE TABLE customers (
    customer_id INT,
    address STRUCT<street: STRING, city: STRING, postal_code: STRING>
);

-- Access struct fields
SELECT customer_id, address.city FROM customers;

Sugestão

Os tipos complexos reduzem a necessidade de tabelas e uniões adicionais, mas também tornam mais difíceis algumas operações. Considere os seus padrões de consulta antes de escolher entre tabelas normalizadas e tipos complexos.

Aplicar as melhores práticas de seleção de tipos

Ao avaliar dados para a seleção do tipo, considere estas orientações práticas:

Diagrama a explicar as melhores práticas para a seleção de tipos.

Adapte o tipo à natureza e ao alcance dos dados. Não utilizes BIGINT para valores que nunca ultrapassam alguns milhares. Os bytes extra multiplicam-se por milhões de linhas.

Considere a nulidade. Se uma coluna nunca deve conter valores nulos, documente esta restrição. Embora os tipos de dados não impunham nulidade por defeito, podes adicionar NOT NULL restrições às definições das tabelas.

Valide os tipos durante a ingestão. Envie os dados recebidos para o tipo-alvo no início do seu pipeline para detetar descorrespondências de tipo antes que se propaguem:

-- Cast during data loading
INSERT INTO target_table
SELECT 
    CAST(raw_id AS INT) AS id,
    CAST(raw_amount AS DECIMAL(10,2)) AS amount,
    CAST(raw_date AS DATE) AS transaction_date
FROM staging_table;

Utilize casts explícitos ao converter tipos. As conversões implícitas podem ter sucesso silenciosamente mesmo quando os dados são perdidos. As conversões explícitas tornam claras as suas intenções e ajudam a identificar problemas durante os testes.

Estas práticas ajudam a construir pipelines onde os tipos de dados funcionam como forma de documentação e validação, detetando erros cedo em vez de os deixar afetar a análise a jusante.