Amazon Athena のデータ型 - Amazon Athena

翻訳は機械翻訳により提供されています。提供された翻訳内容と英語版の間で齟齬、不一致または矛盾がある場合、英語版が優先します。

Amazon Athena のデータ型

CREATE TABLE を実行するときは、列名と、各列に含めることができるデータ型を指定します。Athena は、以下のデータ型をサポートします。Athena、JDBC、および Java 間で JDBC ドライバーがサポートするデータ型マッピングについては、「JDBC ドライバーのインストールおよび設定ガイド」の「データ型」を参照してください。Athena および SQL 間で ODBC ドライバーがサポートするデータ型マッピングについては、「ODBC ドライバーのインストールおよび設定ガイド」の「データ型」を参照してください。

  • boolean – 値は truefalse です。

  • tinyint – 2 の補数形式の 8 ビット符号付き整数で、最小値は -27、最大値は 27-1 です。

  • smallint – 2 の補数形式の 16 ビット符号付き整数で、最小値は -215、最大値は 215-1 です。

  • int および integer – Athena では、クエリのタイプに応じて整数用に異なる式を使用します。

    • intCREATE TABLE のようなデータ定義言語 (DDL) クエリでは、int のデータ型を使用します。

    • integerSELECT * 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 ステートメントで floatSELECT CAST のような SQL 関数で real を使用します。 AWS Glue クローラーは の値を返します。Athena は floatrealおよび floatタイプを内部で変換します (2018 年 5 月 6 日リリースノートを参照)。

  • decimal(precision, scale)precision は桁の合計数で、scale (オプション) は小数点以下の桁数です (デフォルトは 0)。たとえば、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 にキャストします。

  • ipaddress – DML クエリの IP アドレスを表します。DDL ではサポートされていません。詳細については、「IPADDRESS」を参照してください。

  • binary – Parquet のデータに使用されます。

  • dateYYYY-MM-DD などの ISO 形式の日付です。例えば、 。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'例外は OpenCSVSerDe で、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 のような組み込みの時間型であることを期待します。

    注記

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

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

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

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

パフォーマンス上の理由から、パーティションキーのデータ型として 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 テーブルの作成」を参照してください。