選擇欄位資料類型
小提示
有關更多詳細信息,請參閱 文本和圖像 選項卡!
為每欄選擇合適的資料類型,直接影響資料品質、儲存效率及查詢效能。 選擇不適當的類型,可能會失去精確度、浪費儲存空間,或阻塞需要特定類型特性的操作。 在這個單元中,你將學習如何評估你的資料,並選擇 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;
轉換類型時使用明確轉換。 即使資料遺失,隱式轉換也能悄悄成功。 明確的鑄模能清楚表達你的意圖,並協助在測試時發現問題。
這些做法幫助你建立管線,讓資料型態成為文件與驗證的工具,及早發現錯誤,而非影響後續分析。