本文為英文版的機器翻譯版本,如內容有任何歧義或不一致之處,概以英文版為準。
Amazon Athena 中的資料類型
當您執行時CREATE TABLE
,您可以指定資料行名稱和每個資料行可包含的資料類型。您建立的表格會儲存在中 AWS Glue Data Catalog。
為了促進與其他查詢引擎的互操作性,Athena 使用 Apache HiveCREATE TABLE
DDL 陳述式。對於像、和這樣的 DML 查詢 SELECT
CTAS
INSERT INTO
,Athena 使用 Trino
DDL | DML | 描述 |
---|---|---|
BOOLEAN | 值為 true 和 false 。 |
|
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)。 | |
十進制(精度 ,刻 度) |
是位數的總數。 (選擇性) 是小數部分的位數,預設值為 0。例如,使用這些類型定義:decimal(11,5) 、decimal(15) 。最大精確度 為 38,而最大擴展 值為 38。 |
|
字符,字符(長度 ) |
固定長度字元資料,指定長度介於 1 到 255 之間,例如 char (10)。如果指定 如需詳細資訊,請參閱 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( |
一個地圖,其中值可以通過鍵查找。所有鍵必須具有相同的值,並且所有值都必須具有相同的值。 |
|
|
具有命名欄位及其值的資料結構。 |
無 | JSON | JSON 值類型,可以是 JSON 物件、JSON 陣列、JSON 數字、JSON 字串true ,false 或null . |
無 | UUID | UUID (通用唯一識別碼)。 |
無 | IP 地址 | 一個 IPv4 或 IPv6 位址。 |
無 | HyperLogLog |
這些數據類型支持近似函數內部。有關每種類型的更多信息,請訪問 Trino 文檔中相應條目的鏈接。 |
P4 HyperLogLog |
||
SetDigest |
||
Q 文摘 |
||
TDigest |
資料類型範例
下表顯示 DML 資料類型的範例常值。
資料類型 | 範例 |
---|---|
BOOLEAN |
|
TINYINT |
|
SMALLINT |
|
INT、INTEGER |
|
BIGINT |
|
REAL |
|
DOUBLE |
|
十進制(精度 ,刻 度) |
|
字符,字符(長度 ) |
|
瓦爾查爾,瓦爾卡(長度) |
|
VARBINARY |
|
時間、時間 (精確度 ) |
|
TIME WITH TIME ZONE |
|
DATE |
|
時間戳,沒有時區的時間戳,時間戳( |
|
帶有時區的時間戳,帶有時區的時間戳(精度 ) |
|
INTERVAL YEAR TO MONTH |
|
INTERVAL DAY TO SECOND |
|
陣列 [元素 類型] |
|
MAP( |
請注意,映射是從鍵數組和值數組創建的。 |
|
請注意,以這種方式創建的行沒有列名。若要新增欄名稱,您可以使用
|
JSON |
|
UUID |
|
IP 地址 |
|
資料類型的考量
大小限制
對於未指定大小限制的資料類型,請記住,單一資料列中所有資料的實際限制為 32MB。如需詳細資訊,請參閱 在 Amazon Athena 中進行 SQL 查詢的考量事項與限制 中的 Row or column size limitation。
字符和瓦爾查爾
CHAR(
值始終具有n
)
字符數。例如,如果您將 'abc' 轉換為n
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
ANDend_time
AND event_date BETWEENstart_time_date
ANDend_time_date
Iceberg 資料表
使用 Iceberg 資料表,您可以使用運算的分割區值,從而簡化查詢。例如,假設您的 Iceberg 資料表是使用如下 PARTITIONED BY
子句建立的:
PARTITIONED BY (event_date month(event_time))
在此案例下,查詢引擎會根據 event_time
述詞的值自動剔除分割區。因此,您的查詢只需要指定 event_time
的述詞,如下列範例所示。
WHERE event_time BETWEEN
start_time
ANDend_time
如需更多詳細資訊,請參閱 建立 Iceberg 資料表。