Amazon Athena のデータ型
CREATE TABLE
を実行するときは、列名と、各列に含めることができるデータ型を指定します。作成するテーブルは、AWS Glue Data Catalog に保存されます。
他のクエリエンジンとの相互運用性を促進するため、Athena は CREATE TABLE
などの DDL ステートメントに Apache HiveSELECT
、CTAS
、および INSERT INTO
などの DML クエリの場合、Athena は Trino
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 ) |
は桁の合計数です。 (オプション) は小数点以下の桁数で、デフォルトは 0 です。たとえば、decimal(11,5) 、decimal(15) のタイプ定義を使用します。precision の最大値は 38 で、scale の最大値も 38 です。 |
|
CHAR, CHAR(length ) |
固定長の文字データで、char(10) のように、1 から 255 の長さが指定されています。 詳細については、「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 文字列、true 、false 、または null にすることができます。 |
利用不可 | UUID | UUID (Universally Unique IDentifier) です。 |
利用不可 | IPADDRESS | IPv4 または IPv6 アドレスです。 |
利用不可 | HyperLogLog |
これらのデータ型は、近似関数の内部をサポートします。各型の詳細については、Trino ドキュメント内の対応する項目へのリンクを参照してください。 |
P4HyperLogLog |
||
SetDigest |
||
QDigest |
||
TDigest |
データ型の例
以下の表は、DML データ型のリテラル例を示しています。
データ型 | 例 |
---|---|
BOOLEAN |
|
TINYINT |
|
SMALLINT |
|
INT, INTEGER |
|
BIGINT |
|
REAL |
|
DOUBLE |
|
DECIMAL(precision , scale ) |
|
CHAR, CHAR(length ) |
|
VARCHAR, VARCHAR(length ) |
|
VARBINARY |
|
TIME, TIME(precision ) |
|
TIME WITH TIME ZONE |
|
DATE |
|
TIMESTAMP, TIMESTAMP WITHOUT TIME ZONE, TIMESTAMP( |
|
TIMESTAMP WITH TIME ZONE, TIMESTAMP(precision ) WITH TIME ZONE |
|
INTERVAL YEAR TO MONTH |
|
INTERVAL DAY TO SECOND |
|
ARRAY[element_type ] |
|
MAP(key_type , value_type ) |
マップは、キーの配列と値の配列から作成されることに注意してください。 |
ROW(field_name_1 field_type_1 , field_name_2 field_type_2 , …) |
この方法で作成された行には列名がないことに注意してください。列名を追加するには、以下の例にあるように、
|
JSON |
|
UUID |
|
IPADDRESS |
|
データ型に関する考慮事項
サイズ制限
サイズ制限を指定しないデータ型については、単一の行内にあるすべてのデータに対して 32MB という実用的制限が設定されていることに注意してください。詳細については、「Amazon Athena での SQL クエリに関する考慮事項と制約事項」の Row or column size limitation を参照してください。
CHAR と VARCHAR
CHAR(
値には、常に n
)
の文字数があります。たとえば、n
CHAR(7)
に「abc」をキャストすると、末尾に 4 つのスペースが追加されます。
CHAR
値の比較には、先頭と末尾のスペースが含まれます。
CHAR
または VARCHAR
に長さが指定されている場合、文字列は読み取り時に指定された長さで切り捨てられます。基盤となるデータ文字列がそれより長い場合、基盤となるデータ文字列はそのまま変更されません。
CHAR
または VARCHAR
で一重引用符をエスケープするには、追加の一重引用符を使用します。
DML クエリ内の文字列に文字列以外のデータ型をキャストするには、VARCHAR
データ型にキャストします。
substr
関数を使用して CHAR
データ型から指定された長さの従属文字列を返すには、まず CHAR
値を VARCHAR
としてキャストする必要があります。以下の例では、col1
が CHAR
データ型を使用します。
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
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 テーブルの作成」を参照してください。