選擇欄位資料類型

已完成

小提示

有關更多詳細信息,請參閱 文本和圖像 選項卡!

為每欄選擇合適的資料類型,直接影響資料品質、儲存效率及查詢效能。 選擇不適當的類型,可能會失去精確度、浪費儲存空間,或阻塞需要特定類型特性的操作。 在這個單元中,你將學習如何評估你的資料,並選擇 Azure Databricks 中最合適的欄位類型。

了解資料類型類別

Azure Databricks 根據資料類型及其特性與使用情境將其分類。 了解這些分類有助於你在選擇特定欄位的類型時縮小選項範圍。

數值類型 處理數學值與計算。 您有數個選項:

類型類別 型別 用例
積分 TINYINT、SMALLINT、INT、BIGINT 大小不一的整數
Decimal DECIMAL(p,s) 財務數據的精確度
浮點 FLOAT、DOUBLE 近似科學計算

日期時間類型 代表時間資料:

類型 Description
DATE 無時間成分的曆法日期
TIMESTAMP 會議時區的日期和時間
TIMESTAMP_NTZ 日期與時間,無時區

文字與二進位類型 可儲存字元與位元組序列:

  • STRING 對於可變長度文字
  • BINARY 對於原始位元組序列

複合型別 組織巢狀或重複資料:

  • ARRAY用於元素的有序序列
  • MAP 對於鍵值對
  • STRUCT 用於有命名欄位的紀錄

選擇正確的數字類型

數值資料需要謹慎選擇型別,因為不同型別具有不同的精度、範圍及儲存特性。 你的選擇會影響資料完整性和效能。

對於整數,請將類型與你的值範圍相匹配:

類型 範圍 儲存體 常見使用案例
TINYINT -128 到 127 1 個位元組 狀態碼,小計數器
SMALLINT -32,768 到 32,767 2 個位元組 年份值,範圍有限
INT -21億到21億 4 個位元組 大多數識別碼與數量
BIGINT -9.2 百京至 9.2 百京 8 個位元組 大型 ID、資料列數量

建立表格時,請為每個欄位指定適當的類型:

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

對於十進制數,DECIMAL 類型和浮點數類型之間的選擇取決於您的精確度要求:

-- 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
);

這很重要

在需要精確度的財務資料中使用 DECIMAL。 浮點數類型(FLOAT,DOUBLE)使用二進位表示,可能會在處理像貨幣這樣的以10為底的數值時產生四捨五入誤差。

正確選擇時間類型

時間資料類型的選擇取決於您是否需要時區意識,以及應用程式所需的精確度。

當您只需要日曆日期而非時間成分時,請使用 DATE :

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

關於時間戳,請選擇帶時區資訊的型態或不帶時區資訊的型態:

-- 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
);

該 TIMESTAMP 類型會將值轉換為 UTC 以儲存,並在取用值時套用會話時區。 此行為確保時區間排序一致,但若期望數值保持不變,可能會造成混淆。

Note

TIMESTAMP_NTZ 現已進入公開預覽。 當你建立一個帶有TIMESTAMP_NTZ欄位的新 Delta 資料表時,Azure Databricks 會啟用該timestampNtz資料表功能並升級資料表協定。

圖解說明了正確選擇時間型別的方法。

使用複雜型態進行操作

複雜型態可以讓你在單一欄位中儲存結構化、巢狀或重複的資料。 當你的資料不符合扁平關聯模型時,它們很有用。

圖解說明了複雜型態的操作。

當你有多個相同類型的數值時,請使用 ARRAY :

-- 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;

使用 MAP 於具有動態鍵的鍵值對。

-- 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;

當你有一組固定的命名欄位時,請使用 STRUCT :

-- 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;

小提示

複雜型別減少了對額外表格和連接的需求,但也使某些操作變得更困難。 在選擇正規化資料表和複雜型態前,請先考慮你的查詢模式。

應用類型選擇最佳實務

在評估類型選擇資料時,請參考以下實務指引:

說明類型選擇最佳實務的圖表。

將類型與資料的性質和範圍相匹配。 不要用 BIGINT 在從未超過幾千的數值上。 多出來的位元組會在數百萬資料列中累積。

考慮可空性。 如果欄位絕不應該包含 null 值,請記錄此限制。 雖然資料型別預設不會強制執行空無限制,但你可以在資料表定義中加入 NOT NULL 限制。

在資料導入時確認類型。 在管線早期將傳入資料轉換為目標類型,以在類型不符合問題傳播之前將其擷取:

-- 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;

轉換類型時使用明確轉換。 即使資料遺失,隱式轉換也能悄悄成功。 明確的鑄模能清楚表達你的意圖,並協助在測試時發現問題。

這些做法幫助你建立管線,讓資料型態成為文件與驗證的工具,及早發現錯誤,而非影響後續分析。