Wybieranie typów danych kolumn
Wskazówka
Aby uzyskać więcej szczegółów, zobacz kartę Tekst i obrazy .
Wybór odpowiedniego typu danych dla każdej kolumny bezpośrednio wpływa na jakość danych, wydajność magazynowania i wydajność zapytań. Jeśli wybierzesz nieodpowiedni typ, ryzykujesz utratę precyzji, zmarnowanie przestrzeni dyskowej lub zablokowanie operacji, które wymagają określonych cech typu. W tej lekcji dowiesz się, jak ocenić dane i wybrać najbardziej odpowiednie typy kolumn w usłudze Azure Databricks.
Omówienie kategorii typów danych
Usługa Azure Databricks organizuje typy danych w kategorie na podstawie ich cech i przypadków użycia. Zrozumienie tych kategorii ułatwia zawężenie opcji podczas wybierania typu dla określonej kolumny.
Typy liczbowe obsługują wartości matematyczne i obliczenia. Dostępnych jest kilka opcji:
| Kategoria typów | Types | Przypadek użycia |
|---|---|---|
| Integralną |
TINYINT, , SMALLINT, , INTBIGINT |
Liczby całkowite o różnych rozmiarach |
| Decimal | DECIMAL(p,s) |
Dokładna precyzja danych finansowych |
| Zmiennoprzecinkowe |
FLOAT, DOUBLE |
Obliczenia naukowe z przybliżeniem |
Typy daty i godziny reprezentują dane czasowe:
| Typ | Description |
|---|---|
DATE |
Daty kalendarza bez składników godziny |
TIMESTAMP |
Data i godzina ze strefą czasową sesji |
TIMESTAMP_NTZ |
Data i godzina bez strefy czasowej |
Typy tekstowe i binarne przechowują znaki i sekwencje bajtów:
-
STRINGdla tekstu o zmiennej długości -
BINARYdla nieprzetworzonych sekwencji bajtów
Typy złożone organizują zagnieżdżone lub powtarzające się dane:
-
ARRAYdla uporządkowanych sekwencji elementów -
MAPdla par klucz-wartość -
STRUCTdla rekordów z nazwanymi polami
Wybieranie odpowiedniego typu liczbowego
Dane liczbowe wymagają starannego wyboru typu, ponieważ różne typy mają różne właściwości w zakresie precyzji, zasięgu i przechowywania. Wybór ma wpływ zarówno na integralność danych, jak i wydajność.
W przypadku liczb całkowitych dopasuj typ do zakresu wartości:
| Typ | Zakres | Magazyn | Typowe przypadki użycia |
|---|---|---|---|
TINYINT |
-128 do 127 | 1 bajt | Kody stanu, małe liczniki |
SMALLINT |
-32,768 do 32,767 | 2 bajty | Wartości roku, ograniczone zakresy |
INT |
-2,1 mld do 2,1 mld | 4 bajty | Większość identyfikatorów, liczników |
BIGINT |
-9,2 kwintillion do 9,2 kwintillion | 8 bajtów | Duże identyfikatory, liczby wierszy |
Podczas tworzenia tabel określ odpowiedni typ dla każdej kolumny:
CREATE TABLE orders (
order_id INT,
status_code TINYINT,
total_items SMALLINT,
transaction_id BIGINT
);
W przypadku liczb dziesiętnych wybór między DECIMAL a typami zmiennoprzecinkowymi zależy od wymagań precyzji:
-- 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
);
Ważne
Służy DECIMAL dla danych finansowych, gdzie precyzja ma znaczenie. Typy zmiennoprzecinkowe (FLOAT, DOUBLE) używają reprezentacji binarnej i mogą wprowadzać błędy zaokrąglania w przypadku wartości w systemie dziesiętnym, takich jak wartości walutowe.
Prawidłowe wybieranie typów czasowych
Wybór typu danych czasowych zależy od tego, czy potrzebujesz świadomości strefy czasowej i jakiego poziomu precyzji wymaga aplikacja.
Użyj DATE gdy potrzebujesz tylko dat kalendarzowych bez składników godziny.
CREATE TABLE employees (
employee_id INT,
hire_date DATE,
birth_date DATE
);
W przypadku sygnatur czasowych wybierz między typami uwzględniającymi strefę czasową i ignorującymi strefę czasową.
-- 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
);
Typ TIMESTAMP przekształca wartości na UTC do przechowywania i stosuje strefę czasową sesji podczas odczytywania wartości. To zachowanie zapewnia spójne porządkowanie w różnych strefach czasowych, ale może spowodować zamieszanie, jeśli spodziewasz się, że wartości pozostaną niezmienione.
Note
TIMESTAMP_NTZ jest w publicznej wersji zapoznawczej. Podczas tworzenia nowej tabeli delty z kolumną TIMESTAMP_NTZ Azure Databricks włącza timestampNtz funkcję tabeli i uaktualnia protokół tabeli.
Praca z typami złożonymi
Typy złożone umożliwiają przechowywanie danych ustrukturyzowanych, zagnieżdżonych lub powtarzających się w jednej kolumnie. Są one przydatne, gdy dane nie pasują do płaskiego modelu relacyjnego.
Użyj ARRAY, jeśli masz wiele wartości tego samego typu.
-- 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;
Użyj MAP do par klucz-wartość z dynamicznymi kluczami.
-- 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;
Użyj STRUCT, gdy masz stały zestaw nazwanych pól.
-- 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;
Wskazówka
Złożone typy zmniejszają zapotrzebowanie na dodatkowe tabele i sprzężenia, ale również utrudniają wykonywanie niektórych operacji. Przed wybraniem między znormalizowanymi tabelami i typami złożonymi należy wziąć pod uwagę wzorce zapytań.
Stosowanie najlepszych rozwiązań dotyczących wyboru typu
Podczas oceniania danych pod kątem wyboru typu należy wziąć pod uwagę następujące praktyczne wskazówki:
Dopasuj typ do charakteru i zakresu danych. Nie używaj BIGINT dla wartości, które nigdy nie przekraczają kilku tysięcy. Dodatkowe bajty mnożą się przez miliony wierszy.
Rozważ możliwość użycia wartości null. Jeśli kolumna nigdy nie powinna zawierać wartości null, udokumentuj to ograniczenie. Chociaż typy danych domyślnie nie wymuszają wartości null, można dodawać NOT NULL ograniczenia do definicji tabel.
Zweryfikuj typy podczas wczytywania. Przekształcanie danych wejściowych na docelowy typ na początku procesu w celu wykrycia niezgodności typów zanim się rozprzestrzenią
-- 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;
Należy stosować jawne rzutowanie przy konwersji typów. Niejawne konwersje mogą zakończyć się powodzeniem dyskretnie nawet wtedy, gdy dane zostaną utracone. Jawne rzutowania sprawiają, że intencje są jasne i pomagają w identyfikacji problemów podczas testowania.
Te rozwiązania ułatwiają tworzenie potoków, w których typy danych służą jako forma dokumentacji i walidacji, wczesne przechwytywanie błędów, a nie umożliwienie im wpływu na analizę podrzędną.