スキップしてコンテンツを表示

Athena でテーブルをクエリすると、タイムスタンプで例外が発生する場合の解決方法を教えてください。

所要時間2分
0

Amazon Athena テーブルで TIMESTAMP データの列をクエリすると、例外が発生します。

簡単な説明

TIMESTAMP データを含む Athena テーブルにクエリを実行する際、次のいずれかの例外が発生してクエリが失敗する可能性があります。

  • "TYPE_MISMATCH: line 1:49: Cannot apply operator: timestamp(3) < varchar(19)": クエリで TIMESTAMP 値と STRING 値の間に '>' などの論理演算子を使用した場合、この例外が発生する可能性があります。
  • "cast(col as timestamp) with INVALID_CAST_ARGUMENT": Athena がサポートしていないデータ型を含む列で CAST を使用した場合、この例外が発生する可能性があります。

解決策

論理演算子の構文エラー

タイムスタンプ値を比較するためにクエリで論理演算子を使用した場合、例外エラーが発生する可能性があります。

テーブルの TIMESTAMP データの形式に誤りがある可能性があります。Athena では、Java TIMESTAMP 形式が必要です。Trino の日付と時刻関数を使用し、クエリのフィルター条件で STRING を TIMESTAMP に変換するか、CAST を使用して STRING を TIMESTAMP に変換します。詳細については、Trino のウェブサイトで「日付と時刻用の関数と演算子」を参照してください。

次の手順を実行します。

  1. 次の例を参考に、STRING 形式のタイムスタンプデータを含むテーブルを作成します。
    CREATE TABLE testdataset1 AS SELECT testid1, testname1, date_parse(testtimestamp1, '%m/%d/%Y %h:%i:%s %p') AS testtimestamp1
    FROM (
        VALUES
            (1, 'a', '7/14/2020 8:22:39 AM'),
            (2, 'b', '8/01/2015 10:22:39 PM'),
            (3, 'c', '8/13/2017 4:22:39 AM')
    ) AS t(testid1, testname1, testtimestamp1)
    注: testdataset1testid1testname1testtimestamp1 をそれぞれ実際の値に置き換えてください。
  2. STRING 値に CAST 関数を使用してタイムスタンプフィルターを適用します。
    SELECT * FROM testdataset1 WHERE testtimestamp1 < CAST('2020-07-14 00:00:00' AS timestamp)
    注: testdataset1testtimestamp1 を実際の値に置き換えてください。

CAST での無効な引数エラー

CAST を使用して列を TIMESTAMP データ型に変換した場合、例外エラーが発生する可能性があります。

TIMESTAMP にキャストしようとした列のデータ型は、Athena がサポートしていない型である可能性があります。Trino の日付と時刻関数を使用し、その列を DATE または TIMESTAMP としてクエリで読み取ります。詳細については、Trino のウェブサイトで「日付と時刻用の関数と演算子」を参照してください。

次の手順を実行します。

  1. 次の例を参考に、テーブルを作成します。
    CREATE TABLE testdataset2 AS SELECT * FROM
    (VALUES
            (1, 'a', '7/14/2020 8:22:39 AM'),
            (2, 'b', '8/01/2015 10:22:39 PM'),
            (3, 'c', '8/13/2017 4:22:39 AM')
    ) AS t(testid2, testname2, testtimestamp2)
    注: testdataset2testid2testname2testtimestamp2 をそれぞれ実際の値に置き換えてください。
  2. Trino の date_parse 関数を使用し、テーブルを Java TIMESTAMP 形式に変換します。
    SELECT testid2, testname2, date_parse(testtimestamp2, '%m/%d/%Y %h:%i:%s %p') AS testtimestamp2 FROM testdataset2
    注: testdataset2testid2testname2testtimestamp2 をそれぞれ実際の値に置き換えてください。

関連情報

Amazon Athena のテーブルにクエリを実行すると、TIMESTAMP の結果が空になるのはなぜですか?

AWS公式更新しました 8ヶ月前
コメントはありません