Amazon Athena のデータ型
CREATE TABLE を実行するときは、列名と、各列に含めることができるデータ型を指定します。Athena は、以下のデータ型をサポートします。Athena、JDBC、および Java 間で JDBC ドライバーがサポートするデータ型マッピングについては、「JDBC ドライバーのインストールおよび設定ガイド」の「データ型
-
boolean
– 値はtrue
とfalse
です。 -
tinyint
– 2 の補数形式の 8 ビット符号付き整数で、最小値は -27、最大値は 27-1 です。 -
smallint
– 2 の補数形式の 16 ビット符号付き整数で、最小値は -215、最大値は 215-1 です。 -
int
およびinteger
– Athena では、クエリのタイプに応じて整数用に異なる式を使用します。-
int
–CREATE TABLE
のようなデータ定義言語 (DDL) クエリでは、int
のデータ型を使用します。 -
integer
–SELECT * FROM
のような DML クエリでは、integer
のデータ型を使用します。integer
は 2 の補数形式の 32 ビット符号付き値で表され、その最小値は -231、最大値は 231-1です。-
ビジネス分析アプリケーションとの互換性を確保するため、JDBC ドライバーは
integer
型を返します。
-
-
-
bigint
– 2 の補数形式の 64 ビット符号付き整数で、最小値は -263、最大値は 263-1 です。 -
double
– 64 ビットの符号付き倍精度浮動小数点数です。これは、4.94065645841246544e-324d から 1.79769313486231570e+308d の範囲の正または負の値です。double
は、IEEE Standard for Floating-Point Arithmetic (IEEE 754) に準拠しています。 -
float
– 32 ビットの符号付き単精度浮動小数点数です。これは、1.40129846432481707e-45 から 3.40282346638528860e+38 の範囲の正または負の値です。float
は、IEEE Standard for Floating-Point Arithmetic (IEEE 754) に準拠しています。Presto のreal
に相当します。Athena では、CREATE TABLE
のような DDL ステートメントでfloat
、SELECT CAST
のような SQL 関数でreal
を使用します。AWS Glue クローラはfloat
で値を返し、Athena はreal
型とfloat
型を内部で変換します (2018 年 5 月 6 日 リリースノートを参照)。 -
decimal
(
–precision
,scale
)
は桁の合計数で、precision
(オプション) は小数点以下の桁数です (デフォルトは 0)。たとえば、scale
decimal(11,5)
、decimal(15)
のタイプ定義を使用します。precision
の最大値は 38 で、scale
の最大値も 38 です。たとえばクエリ DDL 式で特定の小数値を含む行を選択する場合など、小数値をリテラルとして指定するには、
decimal
型の定義を指定し、クエリ内で小数値をリテラル (一重引用符) としてリストします。例としてはdecimal_value = decimal '0.12'
のようになります。 -
char
– 固定長の文字データです。char(10)
のように、1 から 255 の長さを指定します。詳細については、「CHAR Hive データ型」を参照してください。 注記
substr
関数を使用して、char
データ型から指定された長さの部分文字列を返すには、次の例のように、まずchar
値をvarchar
としてキャストする必要があります。substr(cast(col1 as varchar), 1, 4)
-
varchar
– 可変長の文字データです。varchar(10)
のように、1 から 65535 の長さを指定します。詳細については、「VARCHAR Hive データ型」を参照してください。 -
string
– 一重引用符または二重引用符で囲まれた文字列リテラルです。詳細については、「STRING Hive データ型」を参照してください。 注記
文字列以外のデータ型を Athena の
string
にキャストすることはできません。その代わりにvarchar
にキャストします。 -
binary
– Parquet のデータに使用されます。 -
date
–
などの ISO 形式の日付です。例えば、YYYY
-MM
-DD
date '2008-09-15'
です。例外として、1970 年 1 月 1 日以降の経過日数を使用する OpenCSVSerDe があります。詳細については、「CSV を処理するための OpenCSVSerDe」を参照してください。 -
timestamp
– 分解能をミリ秒単位まで指定可能な、java.sql.Timestamp
互換形式での日付と時刻のインスタント (例、
) です。例えば、yyyy
-MM
-dd
HH
:mm
:ss
[.f...
]timestamp '2008-09-15 03:04:05.324'
です。例外として、OpenCSVSerDeでは、UNIX の数値形式 (1579059880000
など) のtimestamp
データを使用します。タイムスタンプの使用方法については、このドキュメント後述の「タイムスタンプデータの使用」を参照してください。
-
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:DD
の文字列、または Parquet や ORC のような組み込みの時間型であることを期待します。 -
タイプ
TIMESTAMP
のテーブル列がある場合、、Athena はデータの対応する列またはプロパティが、その形式YYYY-MM-DD HH:MM:SS.SSS
の文字列 (日付と時刻の間のスペースに注意)、または Parquet、ORC、Ion のような組み込みの時間型であることを期待します。注記
OpenCSVSerDe のタイムスタンプは例外であり、ミリ秒単位の精度の UNIX エポックとしてエンコードする必要があります。
時間分割されたデータがレコードのタイムスタンプフィールドと一致することを確認します
データの作成者は、パーティションの値がパーティション内のデータと一致していることを確認する必要があります。たとえば、データに timestamp
プロパティがあり、Kinesis Data Firehose を使用してデータを Amazon S3 にロードする場合、Kinesis Data 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 テーブルの作成」を参照してください。