Escolher tipos de dados de coluna
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:
-
STRINGpara texto de comprimento variável -
BINARYpara sequências brutas de bytes
Os tipos complexos organizam dados aninhados ou repetidos:
-
ARRAYpara sequências ordenadas de elementos -
MAPpara pares de chave-valor -
STRUCTpara 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.
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.
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:
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.