みなさん、こんにちは。サニービュー事業部の小寺です。

AWSからAthenaのクエリ動作が変更になったという通知を受け取った方もいるのではないでしょうか。
今後必要な対応について、まとめてみました。

Amazon Athenaとは

Amazon Athenaとは、Amazon S3 にあるデータを指定し、スキーマを定義し、標準的な SQL を使用してクエリを実行できるマネージドサービスです。分析用データを準備するための複雑な ETL ジョブは不要です。

今回のアップデートの影響とは?

影響があるのは、3つです。

1) CHAR 型カラムと文字列リテラルの比較がより簡単に
2) MAP 型の存在しないキーにアクセスするとエラーが発生するように変更
3) 「.field [n]」形式の匿名行フィールドへのアクセスはサポート対象外に変更

1) CHAR 型カラムと文字列リテラルの比較の評価が容易になります。
文字列リテラルにはパディングが不要になりました。

例:テーブル t にデータ型 CHAR (5) の col5 という名前の列があり、列 col5 の値 ‘abcd ‘ (末尾のスペースに注意) の行が含まれているとします。現在、一致を見つけるためにはまったく同じ文字列リテラルを使用する必要があります。

【現状】SELECT 1 FROM t WHERE col5 = ‘abcd ‘; — 文字列リテラル内の末尾のスペースが一致させるために必要です。

新しい動作では、条件と一致するためにそのようなクエリに末尾のスペースを入れる必要がなくなりました。

【変更後】SELECT 1 FROM t WHERE col5 = ‘abcd’; — 一致させるために文字列リテラルの末尾のスペースは必要ありません

上記のクエリは両方とも一致します。リテラルの末尾のスペースが不要な新しい構文を使うことがおすすめです。現在の動作も引き続きサポートされます。

2) MAP 型の存在しないキーにアクセスすると、結果として NULL が返されるのではなく、エラーが発生します。

【現状】次の MAP データから存在しないキー「abc」の値にアクセスするとします。現在、キー ‘abc’ は MAP に存在しないため、Athena は NULL を返します。

【変更後】新しい変更により、Athena は「マップに存在しないキー:abc」を示すエラーを報告します。この変更によ他のエラーの元となりにくくなります。

SELECT MAP(array[‘foo’, ‘bar’], array[1, 2])[‘abc’]; このような場合にもクエリが NULL を返すことを望む場合は、TRY 関数を利用して次のように実現できます。 SELECT TRY(MAP(array[‘foo’, ‘bar’], array[1, 2])[‘abc’]);

3) 「.field [n]」形式の匿名行フィールドへのアクセスはサポートされなくなりました。

匿名化された行フィールドに構文[.field0, .field1, …] を使用してアクセスすることができなくなりました。

【現状】匿名行のフィールドにアクセスするとします。現在、Athena は次のクエリの最初のフィールド (‘a’) を返します。

【変更後】新しい動作では、Athena は「列 ‘ROW (‘a’, ‘b’) .field0′ を解決できません」というエラーを報告します。 SELECT ROW(‘a’, ‘b’).field0;

匿名でない行にアクセスする方法には影響しません。例えば、次のクエリは変わらず動作し、’a’ を返します。 SELECT CAST(row(‘a’, ‘b’) AS ROW(col0 char, col1 char)).col0;

対応のスケジュール

2021 年 12 月 1 日以降、上記の変更が反映されます。

そのため、すべてのクエリを確認して、上記の変更が適用されても問題ないかどうかを確認することをおすすめします。
結果の不一致に気づいた場合は、クエリにこれらの構文が含まれているかどうかも確認が必要です。

まとめ

Athenaでクエリの動作が2021年12月1日以降に変更されるようになりました。
影響があるのは以下の3点です。
1) CHAR 型カラムと文字列リテラルの比較がより簡単に
2) MAP 型の存在しないキーにアクセスするとエラーが発生するように変更
3) 「.field [n]」形式の匿名行フィールドへのアクセスはサポート対象外に変更