Wybieranie typów danych kolumn

Ukończone

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:

  • STRING dla tekstu o zmiennej długości
  • BINARY dla nieprzetworzonych sekwencji bajtów

Typy złożone organizują zagnieżdżone lub powtarzające się dane:

  • ARRAY dla uporządkowanych sekwencji elementów
  • MAP dla par klucz-wartość
  • STRUCT dla 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.

Diagram wyjaśnia prawidłowe wybieranie typów czasowych.

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.

Diagram wyjaśnia pracę z typami złożonymi.

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:

Diagram wyjaśniający najlepsze rozwiązania dotyczące wyboru typu.

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ą.