Amazon Athena 中的資料類型 - Amazon Athena

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

Amazon Athena 中的資料類型

當您執行 CREATE TABLE 時,您需指定資料欄名稱和每個資料欄可包含的資料類型。Athena 支援下列資料類型。如需有關 JDBC 驅動程式在 Athena、JDBC 和 Java 之間支援的資料類型映射的資訊,請參閱《JDBC 驅動程式安裝和設定指南》中的資料類型。如需有關 ODBC 驅動程式在 Athena 和 SQL 之間支援的資料類型映射的資訊,請參閱《ODBC 驅動程式安裝和設定指南》中的資料類型

  • boolean – 值為 truefalse

  • tinyint – 以兩的補數格式表示的 8 位元的有號整數,最小值為 -27,而最大值為 27-1。

  • smallint – 以兩的補數格式表示的 16 位元的有號整數,最小值為 -215,而最大值為 215-1。

  • intinteger – 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 是位數的總數。scale (選用) 則是分數部分的位數數目,預設值為 0。例如,使用這些類型定義: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 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 資料表