Amazon Athena のデータ型 - Amazon Athena

Amazon Athena のデータ型

CREATE TABLE を実行するときは、列名と、各列に含めることができるデータ型を指定します。作成するテーブルは、AWS Glue Data Catalog に保存されます。

他のクエリエンジンとの相互運用性を促進するため、Athena は CREATE TABLE などの DDL ステートメントに Apache Hive データ型名を使用します。SELECTCTAS、および INSERT INTO などの DML クエリの場合、Athena は Trino データ型名を使用します。以下の表は、Athena でサポートされるデータ型を示しています。DDL 型と DML 型が名前、可用性、構文といった点で異なる場合は、個別の列に表示されます。

DDL DML 説明
BOOLEAN 値は、true および false です。
TINYINT 2 の補数形式の 8 ビット符号付き整数で、最小値は -27、最大値は 27-1 です。
SMALLINT 2 の補数形式の 16 ビット符号付き整数で、最小値は -215、最大値は 215-1 です。
INT, INTEGER 2 の補数形式の 32 ビット符号付き整数で、最小値は -231、最小値は -263、最大値は 231-1 です。
BIGINT 2 の補数形式の 64 ビット符号付き整数で、最小値は -263、最小値は -263、最大値は 263-1 です。
FLOAT REAL 32 ビットの符号付き単精度浮動小数点数です。範囲は、1.402846638528807e-45 から 3.40282348528860e+38 (正または負) です。IEEE 浮動小数点数演算標準 (IEEE 754) に従います。
DOUBLE 64 ビットの符号付き倍精度浮動小数点数です。範囲は、4.94065645841246544e-324d から 1.79769313486231570e+308d (正または負) です。IEEE 浮動小数点数演算標準 (IEEE 754) に従います。
DECIMAL(precision, scale) precision は桁の合計数です。scale (オプション) は小数点以下の桁数で、デフォルトは 0 です。たとえば、decimal(11,5)decimal(15) のタイプ定義を使用します。precision の最大値は 38 で、scale の最大値も 38 です。
CHAR, CHAR(length)

固定長の文字データで、char(10) のように、1 から 255 の長さが指定されています。length が指定されている場合、文字列は読み取り時に指定された長さで切り捨てられます。基盤となるデータ文字列がそれより長い場合、基盤となるデータ文字列はそのまま変更されません。

詳細については、「CHAR Hive データ型」を参照してください。

STRING VARCHAR 可変長文字データです。
VARCHAR(length) 最大読み取り長が設定された可変長文字データです。文字列は、読み取り時に指定された長さで切り捨てられます。基盤となるデータ文字列がそれより長い場合、基盤となるデータ文字列はそのまま変更されません。
BINARY VARBINARY 可変長バイナリデータです。
TIME ミリ秒精度の時刻です。
利用不可 TIME(precision) 特定の精度の時刻です。TIME(3)TIME と同等です。
利用不可 TIME WITH TIME ZONE タイムゾーン内の時刻です。タイムゾーンは、UTC からのオフセットとして指定する必要があります。
DATE 年、月、日を使用したカレンダー日付です。
TIMESTAMP TIMESTAMP WITHOUT TIME ZONE カレンダー日付とミリ秒精度の時刻です。
利用不可 TIMESTAMP(precision), TIMESTAMP(precision) WITHOUT TIME ZONE カレンダー日付と特定の精度の時刻です。TIMESTAMP(3)TIMESTAMP と同等です。
利用不可 TIMESTAMP WITH TIME ZONE タイムゾーン内のカレンダー日付と時刻です。タイムゾーンは、UTC からのオフセット、IANA タイムゾーン名、または UTC、UT、Z、GMT を使用して指定できます。
利用不可 TIMESTAMP(precision) WITH TIME ZONE タイムゾーン内のカレンダー日付と特定の精度の時刻です。
利用不可 INTERVAL YEAR TO MONTH 1 か月以上の間隔です。
利用不可 INTERVAL DAY TO SECOND 1 秒、1 分、1 時間、または 1 日以上の間隔です。
ARRAY<element_type> ARRAY[element_type] 値の配列です。すべての値は同じ型である必要があります。
MAP<key_type, value_type> MAP(key_type, value_type) キーを使用して値を検索できるマップです。すべてのキーに同じ値が必要であり、すべての値に同じ値が必要です。
STRUCT<field_name_1:field_type_1, field_name_2:field_type_2, …> ROW(field_name_1 field_type_1, field_name_2 field_type_2, …) 名前が付けられたフィールドとその値からなるデータ構造です。
利用不可 JSON JSON 値型です。これは、JSON オブジェクト、JSON 配列、JSON 番号、JSON 文字列、truefalse、または null にすることができます。
利用不可 UUID UUID (Universally Unique IDentifier) です。
利用不可 IPADDRESS IPv4 または IPv6 アドレスです。
利用不可 HyperLogLog これらのデータ型は、近似関数の内部をサポートします。各型の詳細については、Trino ドキュメント内の対応する項目へのリンクを参照してください。
P4HyperLogLog
SetDigest
QDigest
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(precision, scale)

DECIMAL '123.456'

CHAR, CHAR(length)

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

VARCHAR, VARCHAR(length)

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

VARBINARY

X'00 01 02'

TIME, TIME(precision)

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, TIMESTAMP WITHOUT TIME ZONE, TIMESTAMP(precision), TIMESTAMP(precision) WITHOUT TIME ZONE

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

TIMESTAMP WITH TIME ZONE, TIMESTAMP(precision) WITH TIME ZONE

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[element_type]

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

MAP(key_type, value_type)

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

マップは、キーの配列と値の配列から作成されることに注意してください。

ROW(field_name_1 field_type_1, field_name_2 field_type_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'

IPADDRESS

IPADDRESS '10.0.0.1'

IPADDRESS '2001:db8::1'

データ型に関する考慮事項

CHAR と VARCHAR

CHAR(n) 値には、常に n の文字数があります。たとえば、CHAR(7) に「abc」をキャストすると、末尾に 4 つのスペースが追加されます。

CHAR 値の比較には、先頭と末尾のスペースが含まれます。

CHAR または VARCHAR に長さが指定されている場合、文字列は読み取り時に指定された長さで切り捨てられます。基盤となるデータ文字列がそれより長い場合、基盤となるデータ文字列はそのまま変更されません。

CHAR または VARCHAR で一重引用符をエスケープするには、追加の一重引用符を使用します。

DML クエリ内の文字列に文字列以外のデータ型をキャストするには、VARCHAR データ型にキャストします。

substr 関数を使用して CHAR データ型から指定された長さの従属文字列を返すには、まず CHAR 値を VARCHAR としてキャストする必要があります。以下の例では、col1CHAR データ型を使用します。

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

DECIMAL

特定の 10 進値を含む行を選択する場合など、SELECT クエリのリテラルとして 10 進値を指定するには、以下の例にあるように、クエリ内で DECIMAL 型を指定し、一重引用符内のリテラルとして 10 進値をリストすることができます。

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 のような組み込みの時間型であることを期待します。

    注記

    OpenCSVSerDe のタイムスタンプは例外であり、ミリ秒単位の精度の UNIX エポックとしてエンコードする必要があります。

時間分割されたデータがレコードのタイムスタンプフィールドと一致することを確認します

データの作成者は、パーティションの値がパーティション内のデータと一致していることを確認する必要があります。たとえば、データに timestamp プロパティがあり、Firehose を使用してデータを Amazon S3 にロードする場合、Firehose のデフォルトパーティショニングは実経過時間ベースであることから、動的パーティショニングを使用する必要があります。

パーティションキーのデータ型として文字列を使用

パフォーマンス上の理由から、パーティションキーのデータ型として STRING を使用することをお勧めします。Athena では DATE タイプを使用した場合、その形式 YYYY-MM-DD のパーティション値を日付として認識しますが、これによってパフォーマンスが低下する可能性があります。この理由から、パーティションキーには 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 テーブルの作成」を参照してください。