本文為英文版的機器翻譯版本,如內容有任何歧義或不一致之處,概以英文版為準。
Amazon Athena 中的資料類型
當您執行 CREATE TABLE 時,您需指定資料欄名稱和每個資料欄可包含的資料類型。Athena 支援下列資料類型。如需有關 JDBC 驅動程式在 Athena、JDBC 和 Java 之間支援的資料類型映射的資訊,請參閱《JDBC 驅動程式安裝和設定指南》中的資料類型
-
boolean
– 值為true
和false
。 -
tinyint
– 以兩的補數格式表示的 8 位元的有號整數,最小值為 -27,而最大值為 27-1。 -
smallint
– 以兩的補數格式表示的 16 位元的有號整數,最小值為 -215,而最大值為 215-1。 -
int
和integer
– Athena 會根據查詢類型使用不同的整數運算式。-
int
CREATE TABLE
– 在資料定義語言 (DDL) 查詢中,使用int
資料類型。 -
integer
– 像是SELECT * FROM
的 DML 查詢中,Athena 使用integer
資料類型。integer
為以兩的補數格式表示的 32 位元有號值,最小值為 -231,而最大值為 231-1。-
為確保與商業分析應用程式的相容性,JDBC 驅動程式會傳回
integer
類型。
-
-
-
bigint
– 以兩的補數格式表示的 64 位元的有號整數,最小值為 -263,而最大值為 263-1。 -
double
– 64 位元雙精度浮點數。該範圍為 4.94065645841246544e-324d 至 1.79769313486231570e+308d,正極或負極。double
遵循浮點數運算的 IEEE 標準 (IEEE 754)。 -
float
– 32 位元單精度浮點數。該範圍為 1.40129846432481707e-45 至 3.40282346638528860e+38,正極或負極。float
遵循浮點數運算的 IEEE 標準 (IEEE 754)。等同於 Prestor 中的real
。在 Athena 中,請使用 DDL 陳述式中的float
,例如CREATE TABLE
,以及 SQL 函數中的real
,例如SELECT CAST
。 AWS Glue 爬蟲程式會傳回中的值float
,而 Athena 會在內部進行翻譯real
和輸float
入 (請參閱2018 年 6 月 5 日版本說明)。 -
decimal
(
–precision
,scale
)
是位數的總數。precision
(選用) 則是分數部分的位數數目,預設值為 0。例如,使用這些類型定義:scale
decimal(11,5)
、decimal(15)
。最大精確度
為 38,而最大擴展
值為 38。若要指定小數值為常值,例如在查詢 DDL 表達式中以特定小數值選取列,可指定
decimal
類型定義,並 (在單引號中) 列出小數值為常值,如同此範例中的decimal_value = decimal '0.12'
。 -
char
– 固定長度的字元資料,介於 1 到 255 的指定長度,例如char(10)
。如需詳細資訊,請參閱 CHAR Hive 資料類型。 注意
若要使用
substr
函數從char
資料類型傳回指定長度的子字串,您必須先將char
值轉換為varchar
,如下列範例所示。substr(cast(col1 as varchar), 1, 4)
-
varchar
– 可變長度的字元資料,介於 1 到 65535 的指定長度,例如varchar(10)
。如需詳細資訊,請參閱 VARCHAR Hive 資料類型。 -
string
– 用單引號或雙引號括住的字串文字。如需詳細資訊,請參閱 STRING Hive 資料類型。 注意
非字串資料類型不能轉換為 Athena 中的
string
;請改將它們轉換為varchar
。 -
ipaddress
— 代表 DML 查詢中的 IP 位址。不支援 DDL。如需詳細資訊,請參閱 IPADDRESS。 -
binary
– 用於 Parquet 中的資料。 -
date
– ISO 格式的日期,例如
。例如:YYYY
-MM
-DD
date '2008-09-15'
。OpenCSV SerDe 使用自 1970 年 1 月 1 日以來經過的天數是例外狀況。如需詳細資訊,請參閱 用於處理 CSV 的 OpenCSVSerDe。 -
timestamp
– 在java.sql.Timestamp
相容格式下的日期和時間常數,最大解析度為毫秒,例如
。例如:yyyy
-MM
-dd
HH
:mm
:ss
[.f...
]timestamp '2008-09-15 03:04:05.324'
。OpenCSV 是一個例外SerDe,它使用 UNIX 數字格式的timestamp
資料 (例如,1579059880000
)。如需有關使用時間戳記的詳細資訊,請參閱本文件稍後的 使用時間戳記資料。
-
array
<
– 給定元件類型的陣列。data_type
>範例
CREATE TABLE table array_table (c1 array<integer>) LOCATION '...'; INSERT INTO array_table values(ARRAY[1,2,3]);
-
map
<
– 給定元件類型之間的映射。primitive_type
,data_type
>範例
CREATE TABLE map_table(c1 map<string, integer>) LOCATION '...'; INSERT INTO map_table values(MAP(ARRAY['foo', 'bar'], ARRAY[1, 2]));
-
struct
<
– 不同元件類型的元素的集合。col_name
:data_type
,...
>範例
CREATE TABLE struct_table(c1 struct<name:varchar(10), age:integer>) LOCATION '...'; INSERT INTO struct_table SELECT CAST(ROW('Bob', 38) AS ROW(name VARCHAR(10), age INTEGER));
使用時間戳記資料
本節說明在 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 資料表。