Amazon Athena 中的資料類型 - Amazon Athena

本文為英文版的機器翻譯版本,如內容有任何歧義或不一致之處,概以英文版為準。

Amazon Athena 中的資料類型

當您執行時CREATE TABLE,您可以指定資料行名稱和每個資料行可包含的資料類型。您建立的表格會儲存在中 AWS Glue Data Catalog。

為了促進與其他查詢引擎的互操作性,Athena 使用 Apache Hive 資料類型名稱,例如 CREATE TABLE DDL 陳述式。對於像、和這樣的 DML 查詢 SELECT CTASINSERT INTO,Athena 使用 Trino 資料類型名稱。下表顯示 Athena 支援的資料類型。其中 DDL 和 DML 類型在名稱、可用性或語法方面有所不同,它們會顯示在不同的資料行中。

DDL DML 描述
BOOLEAN 值為 truefalse
TINYINT 一個 8 位有符號的整數,採用二進制補碼格式,最小值為 -2 7,最大值為 2 7 -1。
SMALLINT 16 位元帶正負號整數,採用二進制補碼格式,最小值為 -2 15,最大值為 2 15 -1。
INT、INTEGER 32 位元帶正負號值,採用二進制補碼格式,最小值為 -2 31,最大值為 2 31 -1。
BIGINT 一個 64 位有符號的整數,採用二進制補碼格式,最小值為 -2 63 63,最大值為 2 63 -1。
FLOAT REAL 32 位元帶正負號的單精度浮點數。範圍為正值或負值。遵循浮點運算的 IEEE 標準 (IEEE 754)。
DOUBLE 64 位有符號的雙精度浮點數。該範圍是正或負的範圍是 遵循浮點運算的 IEEE 標準 (IEEE 754)。
十進制(精度度) precision是位數的總數。 scale(選擇性) 是小數部分的位數,預設值為 0。例如,使用這些類型定義:decimal(11,5)decimal(15)。最大精確度為 38,而最大擴展值為 38。
字符,字符(長度

固定長度字元資料,指定長度介於 1 到 255 之間,例如 char (10)。如果指定 length,字串會在讀取時以指定的長度截斷。如果基礎資料字串較長,則基礎資料字串會保持不變。

如需詳細資訊,請參閱 CHAR Hive 資料類型

STRING VARCHAR 可變長度字符數據。
瓦爾(長度) 具有最大讀取長度的可變長度字符數據。讀取時,字串會以指定的長度截斷。如果基礎資料字串較長,則基礎資料字串會保持不變。
BINARY VARBINARY 可變長度的二進制數據。
TIME 精確度為毫秒的一天時間。
時間 (精確度) 具有特定精確度的一天中的時間。 TIME(3)相當於TIME
TIME WITH TIME ZONE 某個時區中的一天中的時間。時區應指定為與 UTC 的偏移量。
DATE 帶有年,月和日的日曆日期。
TIMESTAMP 時間戳記,無時區的時間戳記 具有毫秒精確度的日曆日期和時間。
時間戳(精度),時間戳(精度),沒有時區 具有特定精確度的日曆日期和時間。 TIMESTAMP(3)相當於TIMESTAMP
TIMESTAMP WITH TIME ZONE 時區中的日曆日期和時間。您可以將時區指定為與 UTC 的偏移量、IANA 時區名稱,或使用 UTC、UT、Z 或 GMT。
具有時區的時間戳記(精度 在時區中具有特定精確度的日曆日期和時間。
INTERVAL YEAR TO MONTH 一個或多個整個月的間隔
INTERVAL DAY TO SECOND 一或多秒、分、小時或天的間隔
陣列 < 元素類型 > 陣列 [元素類型] 值的陣列。所有值都必須具有相同的類型。
映射 < 鍵類型,值類型 > MAP(鍵 _ 類型,值類型 一個地圖,其中值可以通過鍵查找。所有鍵必須具有相同的值,並且所有值都必須具有相同的值。
結構 < 字段名稱 _1:字段 _ 類型 _1,字段名稱 _2字段類型 _2,... 行(字段名稱 _1 字段類型 _1,字段名稱 _2 字段類型 _2,...) 具有命名欄位及其值的資料結構。
JSON JSON 值類型,可以是 JSON 物件、JSON 陣列、JSON 數字、JSON 字串truefalsenull.
UUID UUID (通用唯一識別碼)。
IP 地址 一個 IPv4 或 IPv6 位址。
HyperLogLog 這些數據類型支持近似函數內部。有關每種類型的更多信息,請訪問 Trino 文檔中相應條目的鏈接。
P4 HyperLogLog
SetDigest
Q 文摘
TDigest

資料類型範例

下表顯示 DML 資料類型的範例常值。

資料類型 範例
BOOLEAN

true

false

TINYINT

TINYINT '123'

SMALLINT

SMALLINT '123'

INT、INTEGER

123456790

BIGINT

BIGINT '1234567890'

2147483648

REAL

'123456.78'

DOUBLE

1.234

十進制(精度度)

DECIMAL '123.456'

字符,字符(長度

CHAR 'hello world', CHAR 'hello ''world''!'

瓦爾查爾,瓦爾卡(長度)

VARCHAR 'hello world', VARCHAR 'hello ''world''!'

VARBINARY

X'00 01 02'

時間、時間 (精確度)

TIME '10:11:12', TIME '10:11:12.345'

TIME WITH TIME ZONE

TIME '10:11:12.345 -06:00'

DATE

DATE '2024-03-25'

時間戳,沒有時區的時間戳,時間戳(精度),沒有時區的時間戳(精度

TIMESTAMP '2024-03-25 11:12:13', TIMESTAMP '2024-03-25 11:12:13.456'

帶有時區的時間戳,帶有時區的時間戳(精度

TIMESTAMP '2024-03-25 11:12:13.456 Europe/Berlin'

INTERVAL YEAR TO MONTH

INTERVAL '3' MONTH

INTERVAL DAY TO SECOND

INTERVAL '2' DAY

陣列 [元素類型]

ARRAY['one', 'two', 'three']

MAP(鍵 _ 類型,值類型

MAP(ARRAY['one', 'two', 'three'], ARRAY[1, 2, 3])

請注意,映射是從鍵數組和值數組創建的。

行(字段名稱 _1 字段類型 _1,字段名稱 _2 字段類型 _2,...)

ROW('one', 'two', 'three')

請注意,以這種方式創建的行沒有列名。若要新增欄名稱,您可以使用CAST,如下列範例所示:

CAST(ROW(1, 2, 3) AS ROW(one INT, two INT, three INT))
JSON

JSON '{"one":1, "two": 2, "three": 3}'

UUID

UUID '12345678-90ab-cdef-1234-567890abcdef'

IP 地址

IPADDRESS '10.0.0.1'

IPADDRESS '2001:db8::1'

資料類型的考量

大小限制

對於未指定大小限制的資料類型,請記住,單一資料列中所有資料的實際限制為 32MB。如需詳細資訊,請參閱 在 Amazon Athena 中進行 SQL 查詢的考量事項與限制 中的 Row or column size limitation

字符和瓦爾查爾

CHAR(n)值始終具有n字符數。例如,如果您將 'abc' 轉換為CHAR(7),則會添加 4 個尾隨空格。

CHAR值的比較包括前導和尾隨空格。

如果為CHAR或指定長度VARCHAR,字串會在讀取時以指定的長度截斷。如果基礎資料字串較長,則基礎資料字串會保持不變。

若要逸出CHAR或中的單引號VARCHAR,請使用額外的單引號。

若要將非字串資料類型轉換為 DML 查詢中的字串,請轉換為VARCHAR資料類型。

若要使用substr函數從CHAR資料類型傳回指定長度的子字串,您必須先將CHAR值轉換為VARCHAR。在下列範例中,col1使用資CHAR料類型。

substr(CAST(col1 AS VARCHAR), 1, 4)

DECIMAL

若要在SELECT查詢中將十進位值指定為常值,例如在選取具有特定十進位值的資料列時,您可以在查詢中指定DECIMAL類型,並將小數值列為單引號中的常值,如下列範例所示。

SELECT * FROM my_table WHERE decimal_value = DECIMAL '0.12'
SELECT DECIMAL '44.6' + DECIMAL '77.2'

使用時間戳記資料

本節說明在 Athena 中使用時間戳記資料的一些考量。

注意

Athena 引擎版本 2 與 Athena 引擎版本 3 之間的時間戳記處理方式發生變更。如需有關 Athena 引擎版本 3 中可能發生的時間戳記相關錯誤及建議的解決方案的資訊,請參閱 Athena 引擎版本 3 參考中的 時間戳記變更

將時間戳記資料寫入 Amazon S3 物件的格式

將時間戳記資料寫入 Amazon S3 物件的格式取決於資料行資料類型和您使用的程式SerDe庫

  • 如果您有類型為 DATE 的資料表資料欄,Athena 會預期資料的對應資料欄或屬性是 ISO 格式的字串 YYYY-MM-DD,或是內建的日期類型 (例如 Parquet 或 ORC 的日期類型)。

  • 如果您有類型為 TIME 的資料表資料欄,Athena 會預期資料的對應資料欄或屬性是 ISO 格式的字串 HH:MM:SS,或是內建的時間類型 (例如 Parquet 或 ORC 的時間類型)。

  • 如果您有類型為 TIMESTAMP 的資料表資料欄,Athena 會預期資料的對應資料欄或屬性是格式的字串 YYYY-MM-DD HH:MM:SS.SSS (注意日期和時間之間的空格),或是內建的時間類型 (例如 Parquet、ORC 或 Ion 的時間類型)。

    注意

    OpenCSV SerDe 時間戳記是例外狀況,必須編碼為毫秒解析度的 UNIX 紀元。

確保時間分割資料符合記錄中的時間戳記欄位

資料的產生者必須確定分割區值與分割區內的資料一致。例如,如果您的資料具有timestamp屬性,而您使用 Firehose 將資料載入 Amazon S3,則必須使用動態分割,因為 Firehose 的預設分割為。 wall-clock-based

使用字串做為分割區索引鍵的資料類型

出於效能考量,最好將 STRING 用作分割區索引鍵的資料類型。雖然 Athena 將格式 YYYY-MM-DD 的分割區值識別為您使用 DATE 類型時的日期,而這可能造成效能不彰。因此,我們建議您改用 STRING 資料類型做為分割區索引鍵。

如何寫入同樣按時間分割的時間戳記欄位的查詢

如何寫入同樣按時間分割的時間戳記欄位的查詢,取決於您要查詢的資料表的類型。

Hive 資料表

使用 Athena 中最常用的 Hive 資料表,查詢引擎對資料欄和分割區索引鍵之間的關係一無所知。因此,您必須始終在資料欄和分割區索引鍵的查詢中新增述詞。

例如,假設您有 event_time 資料欄和 event_date 分割區索引鍵,而且想要查詢 23:00 到 03:00 之間的事件。在此案例中,您必須在查詢資料欄和分割區索引鍵中包含述詞,如下列範例所示。

WHERE event_time BETWEEN start_time AND end_time AND event_date BETWEEN start_time_date AND end_time_date

Iceberg 資料表

使用 Iceberg 資料表,您可以使用運算的分割區值,從而簡化查詢。例如,假設您的 Iceberg 資料表是使用如下 PARTITIONED BY 子句建立的:

PARTITIONED BY (event_date month(event_time))

在此案例下,查詢引擎會根據 event_time 述詞的值自動剔除分割區。因此,您的查詢只需要指定 event_time 的述詞,如下列範例所示。

WHERE event_time BETWEEN start_time AND end_time

如需更多詳細資訊,請參閱 建立 Iceberg 資料表