Athena エンジンバージョン 2 - Amazon Athena

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

Athena エンジンバージョン 2

Athena エンジンバージョン 2 には、次の変更が行われました。

改善点と新機能

  • EXPLAIN および EXPLAIN ANALYZE – Athena で EXPLAIN ステートメントを使用して、SQL クエリの実行プランを表示できます。EXPLAIN ANALYZE では、SQL クエリの分散実行プランと各オペレーションのコストを表示します。詳細については、「Athena での EXPLAIN および EXPLAIN ANALYZE の使用」を参照してください。

  • フェデレーティッドクエリ – フェデレーティッドクエリは、Athena エンジンバージョン 2 でサポートされています。詳細については、「Amazon Athena 横串検索の使用」を参照してください。

  • 地理空間関数 – 25 以上の地理空間関数が追加されました。詳細については、「」を参照してくださいAthena エンジンバージョン 2 の新しい地理空間関数

  • ネストされたスキーマ – ネストされたスキーマの読み取りに対するサポートが追加されました。これは、コストを削減します。

  • 準備済みステートメント – 同じクエリを、異なるクエリパラメータを使用して繰り返し実行するには、準備済みステートメントを使用します。準備済みステートメントでは、パラメータがプレースホルダになっており、その値を実行時に渡すことができます。準備済みステートメントは、SQL インジェクション攻撃を防ぐのに役立ちます。詳細については、「パラメータ化されたクエリの使用」を参照してください。

  • スキーマ進化のサポート – Parquet 形式のデータに対するスキーマ進化のサポートが追加されました。

    • パーティションスキーマがテーブルスキーマとは異なるパーティションからの配列、マップ、または行型の列の読み込みに対するサポートが追加されました。これは、パーティションの作成後にテーブルスキーマが更新された場合に発生する可能性があります。変更された列型には互換性がある必要があります。行型については、末尾のフィールドを追加またはドロップすることができますが、対応するフィールド (序数順) に同じ名前が付けられている必要があります。

    • ORC ファイルに、フィールドが欠落している構造体の列を使用できるようになりました。これにより、ORC ファイルを書き換えることなくテーブルスキーマを変更することが可能になります。

    • ORC 構造体の列が序数ではなく名前でマップされるようになりました。これにより、ORC ファイル内にある欠落した、または余分な構造体フィールドが正しく処理されます。

  • SQL OFFSET — SQLの SELECT ステートメントで、OFFSET 句がサポートされるようになりました。詳細については、「SELECT」を参照してください。

  • UNLOAD ステートメントUNLOAD ステートメントを使用して、SELECT クエリの出力を PARQUET、ORC、AVRO、および JSON 形式で記述することができます。詳細については、「UNLOAD」を参照してください。

グループ化、結合、およびサブクエリの改善

  • 複雑なグループ化 – 複雑なグループ化オペレーションのサポートが追加されました。

  • 相関サブクエリIN 述語の相関サブクエリ、および強制を必要とする相関サブクエリのサポートが追加されました。

  • CROSS JOINLATERAL 導出テーブルに対する CROSS JOIN のサポートが追加されました。

  • GROUPING SETSGROUPING SETS を使用するクエリのための集計における ORDER BY 句のサポートが追加されました。

  • Lambda 式 – Lambda 式の行フィールドの逆参照に対するサポートが追加されました。

  • 準結合での Null 値 – 準結合の左側 (つまり、サブクエリでの IN 述語) での null 値のサポートが追加されました。

  • 空間結合 – ブロードキャスト空間結合と空間左結合のサポートが追加されました。

  • ディスクへのスピル – メモリ集約型の INNER JOIN および LEFT JOIN オペレーションでは、Athena が中間オペレーション結果をディスクにオフロードします。これにより、大量のメモリを必要とするクエリの実行が可能になります。

  • INTEGER 用の INTINTEGER データ型のエイリアスとしての INT のサポートが追加されました。

  • INTERVAL 型INTERVAL 型へのキャスティングのサポートが追加されました。

  • IPADDRESS – DML クエリの IP アドレスを表す新しいIPADDRESSタイプを追加しました。VARBINARY 型と IPADDRESS 型間におけるキャスティングのサポートが追加されました。IPADDRESS タイプは DDL クエリでは認識されません。

  • IS DISTINCT FROMJSON および IPADDRESS 型に対する IS DISTINCT FROM のサポートが追加されました。

  • Null 等価チェックARRAYMAP、および ROW データ構造における null 値の等価チェックがサポートされるようになりました。例えば、ARRAY ['1', '3', null] = ARRAY ['1', '2', null] 式は false を返します。これまで、null 要素は「comparison not supported」というエラーメッセージを返していました。

  • 行型の強制 – フィールド名を問わない行型間での強制が可能になりました。これまでは、ソースとなる型のフィールド名がターゲットとなる型のものと一致する場合、またはターゲットとなる型に匿名化されたフィールド名がある場合にのみ、行型を別の型に強制することが可能でした。

  • 時間の減算 – すべての TIME および TIMESTAMP 型に減算を実装しました。

  • Unicode – 文字列リテラルでのエスケープされた Unicode シーケンスのサポートが追加されました。

  • VARBINAY の連結VARBINARY 値の連結に対するサポートが追加されました。

    ウィンドウ値関数 – ウィンドウ値関数で IGNORE NULLS および RESPECT NULLS をサポートするようになりました。

追加の関数入力タイプ

以下の関数が追加の入力タイプを許可するようになりました。各関数の詳細については、対応する Presto ドキュメントへのリンクを参照してください。

  • approx_distinct()approx_distinct() 関数が次の型をサポートするようになりました: INTEGERSMALLINTTINYINTDECIMALREALDATETIMESTAMPTIMESTAMP WITH TIME ZONETIMETIME WITH TIME ZONEIPADDRESS、および CHAR

  • Avg()、sum()avg() および sum() 集計関数が INTERVAL データ型をサポートするようになりました。

  • Lpad()、rpad()lpad および rpad 関数が VARBINARY 入力で機能するようになりました。

  • Min()、max()min() および max() 集計関数が、クエリ分析時間での不明な入力タイプを許可するようになったため、NULL リテラルでのこれらの関数の使用が可能になりました。

  • regexp_replace() – 置換ごとに Lambda 関数を実行できる regexp_replace() 関数のバリアントが追加されました。

  • Sequence() – 暗黙的な one-day ステップ増分でのバリアントを含む、sequence() 関数のための DATE バリアントが追加されました。

  • ST_Area()ST_Area() 地理空間関数が、すべてのジオメトリ型をサポートするようになりました。

  • Substr()substr 関数が VARBINARY 入力で動作するようになりました。

  • zip_with() – 長さが一致しない配列を zip_with() で使用できるようになりました。欠落した位置指定は null で埋められます。これまで、異なる長さの配列が渡された場合はエラーが発生していました。この変更により、配列を同じ長さにするために追加された値から、もともと null であった値を区別することが困難になる可能性があります。

追加された関数

次のリストには、Athena エンジンバージョン 2 から採用された新しい関数が記載されています。このリストに地理空間関数は含まれていません。地理空間関数のリストについては、「Athena エンジンバージョン 2 の新しい地理空間関数」を参照してください。

各関数の詳細については、対応する Presto ドキュメントへのリンクを参照してください。

集計関数

reduce_agg()

配列関数と演算子

array_sort() – Lambda 関数をコンパレータとして受け取る、この関数のバリアントが追加されました。

ngrams()

バイナリ関数と演算子

from_big_endian_32()

from_ieee754_32()

from_ieee754_64()

hmac_md5()

hmac_sha1()

hmac_sha256()

hmac_sha512()

spooky_hash_v2_32()

spooky_hash_v2_64()

to_big_endian_32()

to_ieee754_32()

to_ieee754_64()

日付/時刻関数と演算子

millisecond()

parse_duration()

to_milliseconds()

マッピング関数と演算子

multimap_from_entries()

数学関数と演算子

inverse_normal_cdf()

wilson_interval_lower()

wilson_interval_upper()

分位点ダイジェスト関数

分位点ダイジェスト関数qdigest 分位点ダイジェスト型を追加しました。

文字列関数および演算子

hamming_distance()

split_to_multimap()

フォーマンスの向上

Athena エンジンバージョン 2 では、以下の機能のパフォーマンスが改善されました。

クエリパフォーマンス

  • ブロードキャスト参加のパフォーマンス – ワーカーノードに動的パーティションプルーニングを適用することで、ブロードキャスト参加のパフォーマンスが向上しました。

  • バケット化されたテーブル – 書き込まれるデータが既に適切にパーティション化されている場合 (例えば、出力がバケット化された結合からの場合など) におけるバケット化されたテーブルへの書き込みのパフォーマンスが改善されました。

  • DISTINCTDISTINCT を使用する一部のクエリのパフォーマンスが改善されました。

    動的フィルタリングとパーティションプルーニング - これらの改善によってパフォーマンスが向上し、クエリでスキャンされるデータ量が削減されます。

  • フィルタ演算と射影演算 – 可能な場合には、フィルタ演算と射影演算が常に列で処理されるようになりました。エンジンは、辞書エンコーディングが有効であれば、それを自動的に利用します。

  • Gathering exchange – Gathering exchange でのクエリのパフォーマンスが改善されました。

  • グローバル集計 – フィルタリングされたグローバル集計を実行する一部のクエリのパフォーマンスが改善されました。

  • GROUPING SETS、CUBE、ROLLUP – 1 つのクエリに列のセットを複数集約できるので、GROUPING SETSCUBE、または ROLLUP に関連するクエリのパフォーマンスが向上します。

  • きわめて選択的なフィルタ – きわめて選択的なフィルタを使用したクエリのパフォーマンスが改善されました。

  • JOIN および AGGREGATE オペレーションJOIN および AGGREGATE オペレーションのパフォーマンスが強化されました。

  • LIKEinformation_schema テーブルの列で LIKE 述語を使用するクエリのパフォーマンスが改善されました。

  • ORDER BY および LIMIT – 不必要なデータ交換を回避するため、ORDER BYLIMIT が関与するクエリのプラン、パフォーマンス、およびメモリ使用量が改善されました。

  • ORDER BYORDER BY オペレーションがデフォルトで分散されるようになり、より大きな ORDER BY 句の使用が可能になりました。

  • ROW 型の変換ROW 型を変換する時のパフォーマンスが改善されました。

  • 構造型 – 構造型を処理し、スキャン、結合、集約、またはテーブル書き込みを含むクエリのパフォーマンスが改善されました。

  • テーブルのスキャン – 特定のケースで発生するテーブルスキャンの重複を回避するための、最適化ルールが導入されました。

  • UNIONUNION クエリのパフォーマンスが改善されました。

クエリプランのパフォーマンス
  • プランパフォーマンス – 多数の列を持つ複数のテーブルを結合するクエリのプランパフォーマンスが改善されました。

  • 述語評価 – プランにおける述語プッシュダウン中の述語評価のパフォーマンスが改善されました。

  • キャスティングのための述語プッシュダウンのサポート – values list の値が列の型を一致させるためのキャスティングを必要とする <column> IN <values list> 述語に対する述語プッシュダウンがサポートされます。

  • 述語推論とプッシュダウン – 述語推論とプッシュダウンが <symbol> IN <subquery> 述語を使用するクエリに拡張されました。

  • タイムアウト – クエリプランニングのタイムアウトをまれに引き起こす可能性のあるバグを修正しました。

結合のパフォーマンス

  • マップ列での結合 – マップ列を含む結合と集計のパフォーマンスが改善されました。

  • 非等価条件のみでの結合 – ハッシュ結合の代わりにネステッドループ結合を使用することで、非等価条件のみでの結合のパフォーマンスを改善しました。

  • 外部結合 – 外部結合が関与するクエリに対して、結合分布型が自動的に選択されるようになりました。

  • 関数の範囲指定による結合 – 条件が関数の範囲指定 (a JOIN b ON b.x < f(a.x) AND b.x > g(a.x) など) である場合の結合のパフォーマンスが改善されました。

  • Spill-to-disk — spill-to-disk 関連するバグとメモリの問題を修正して、パフォーマンスを向上させ、JOINオペレーションのメモリエラーを減らしました。

サブクエリのパフォーマンス

  • 相関 EXISTS サブクエリ – 相関 EXISTS サブクエリのパフォーマンスが改善されました。

  • 等価述語を使用する相関サブクエリ – 等価述語が含まれる相関サブクエリのサポートが改善されました。

  • 非等価述語を使用する相関サブクエリ – 不等価述語が含まれる相関サブクエリのパフォーマンスが改善されました。

  • サブクエリに対する count(*) 集計 – 既知の安定したカーディナリティでのサブクエリでの count(*) 集計のパフォーマンスが改善されました。

  • 外部クエリのフィルタのプロパゲーション – 外部クエリからのフィルタをサブクエリにプロパゲートできる場合における相関サブクエリのパフォーマンスが改善されました。

関数のパフォーマンス

  • 集約 Window 関数 – 集約 Window 関数のパフォーマンスが改善されました。

  • element_at() – マップに対する element_at() の改善されたパフォーマンスが、マップのサイズに比例するのではなく、定数時間になります。

  • Grouping()grouping() が関与するクエリのパフォーマンスが改善されました。

  • JSON キャスティングJSON から ARRAY または MAP 型へのキャスティングのパフォーマンスが改善されました。

  • マップを返す関数 – マップを返す関数のパフォーマンスが改善されました。

  • ap-to-map Mcast – map-to-map キャストのパフォーマンスが向上しました。

  • min() および max()min() および max() 関数が、不要なオブジェクトの作成を回避するように最適化されました。これにより、ガベージコレクションのオーバーヘッドが軽減されます。

  • row_number()row_number() を使用するクエリで、生成された行数のフィルタが後に続くもののパフォーマンスとメモリ使用量が改善されました。

  • Window 関数 – 同一の PARTITION BYORDER BY 句を持つウィンドウ関数が含まれるクエリのパフォーマンスが改善されました。

  • Window 関数 – 類似した仕様を持つ特定の Window 関数 (LAG など) のパフォーマンスが改善されました。

地理空間のパフォーマンス

  • ジオメトリのシリアル化 – ジオメトリ値のシリアル化パフォーマンスが改善されました。

  • 地理空間関数ST_Intersects()ST_Contains()ST_Touches()ST_Within()ST_Overlaps()ST_Disjoint()transform_values()ST_XMin()ST_XMax()ST_YMin()ST_YMax()ST_Crosses()、および array_intersect() のパフォーマンスが改善されました。

  • ST_Distance()ST_Distance() 関数が関与する結合クエリのパフォーマンスが改善されました。

  • ST_Intersection() – 座標軸に平行な矩形 (ST_Envelope() および bing_tile_polygon() 関数で生成されたポリゴンなど) のための ST_Intersection() 関数が最適化されました。

マップ関数

  • すべてのケースにおける O(n) から O(1) のマップサブスクリプトのパフォーマンスが改善されました。これまで、この改善を利用できるのは特定の関数とリーダーによって作成されたマップのみでした。

  • map_from_entries() 関数と map_entries() 関数を追加しました。

キャスティング

  • REALTINYINT、または SMALLINT から JSON にキャストする機能が追加されました。

  • 今後は、JSONROW にすべてのフィールドを含まない場合でも、JSONROW にキャストできるようになります。

  • CAST(json_parse(...) AS ...) のパフォーマンスが改善されました。

  • JSON から ARRAY または MAP 型へのキャスティングのパフォーマンスが改善されました。

新しい JSON 関数

重要な変更

破壊的変更には、バグ修正、地理空間関数への変更、置き換えられた関数、および制限の導入が含まれます。ANSI SQL コンプライアンスにおける改善により、非標準的な動作に依存するクエリが破損する可能性があります。

バグ修正

以下の変更により、クエリが正常に実行されても結果が不正確になる原因となっていた動作上の問題が修正されます。

  • Parquet の fixed_len_byte_array 列が DECIMAL として受け付けられるようになりましたfixed_len_byte_array タイプの Parquet 列が、Parquet スキーマで DECIMAL として注釈付けされている場合は、それらに対するクエリが成功し正しい値が返されます。DECIMAL の注釈がない fixed_len_byte_array 列に対するクエリはエラーとなります。これまでは、DECIMAL の注釈がない fixed_len_byte_array 列へのクエリは成功するものの、意味のない値が返されていました。

  • json_parse() が末尾の文字を無視しなくなりました – これまでは、[1,2]abc などの入力が [1,2] として正常に解析されていました。末尾の文字を使用することにより、「Cannot convert '[1, 2]abc' to JSON」というエラーメッセージが表示されるようになります。

  • round() 小数点精度が修正されましたx が DECIMAL、または x がスケール 0 の DECIMAL で d が負の整数である場合に、round(x, d)x を正しく四捨五入するようになりました。これまで、これらのケースでは四捨五入が行われていませんでした。

  • round(x, d) および truncate(x, d)round(x, d) および truncate(x, d) 関数のシグネチャのパラメータ dINTEGER 型になりました。これまでは、dBIGINT 型である場合がありました。

  • 重複したキーを持つ map()map() が重複したキーに関するエラーを生成するようになり、エラーなしで破損したマップを作成することがなくなりました。現在重複キーを使用してマップ値を構築するクエリは、今後エラーを伴って失敗するようになります。

  • map_from_entries() が null エントリでエラーを生成します – 入力配列に null エントリが含まれている場合、map_from_entries() がエラーを生成するようになりました。NULL を値として渡すことでマップを構築するクエリは失敗するようになります。

  • テーブル – サポートされていないパーティションタイプを持つテーブルは作成できなくなりました。

  • 統計関数における数値安定性の改善 – 統計関数 corr()covar_samp()regr_intercept()、および regr_slope() の数値安定性が改善されました。

  • Parquet で定義されているタイムスタンプの精度が尊重されるようになりました – 今後は、TIMESTAMP 値の精度と、Parquet スキーマの TIMESTAMP 列で定義される精度を一致させる必要があります。これらの精度が一致しないと、不適切なタイムスタンプが生成されます。

  • タイムゾーン情報 – タイムゾーン情報が Java 1.8 SDK の java.time パッケージを使用して計算されるようになりました。

  • INTERVAL_DAY_TO_SECOND および INTERVAL_YEAR_TO_MONTH データ型の SUMSUM(NULL) を直接使用することができなくなりました。SUM(NULL) を使用するには、NULLBIGINTDECIMALREALDOUBLEINTERVAL_DAY_TO_SECOND または INTERVAL_YEAR_TO_MONTH といったデータ型にキャストしてください。

地理空間関数への変更

地理空間関数に対して行われた変更は以下のとおりです。

  • 関数名の変更 – 一部の関数名が変更されました。詳細については、「」を参照してくださいAthena エンジンバージョン 2 における地理空間関数名の変更

  • VARBINARY 入力VARBINARY 型が、地理空間関数への入力に直接サポートされなくなりました。例えば、ジオメトリの面積を直接計算するには、ジオメトリを VARCHAR または GEOMETRY の形式で入力することが必要になります。回避策は、以下の例にあるように、変換関数を使用することです。

    • 周知のバイナリ (WKB) 形式での VARBINARY 入力の面積を計算するために ST_area() を使用するには、以下の例のように、まず入力を ST_GeomFromBinary() に渡します。

      ST_area(ST_GeomFromBinary(<wkb_varbinary_value>))
    • レガシーバイナリ形式での VARBINARY 入力の面積を計算するために ST_area() を使用するには、以下の例のように、まず同じ入力を ST_GeomFromLegacyBinary() 関数に渡します。

      ST_area(ST_GeomFromLegacyBinary(<legacy_varbinary_value>))
  • ST_ExteriorRing() および ST_Polygon()ST_ExteriorRing()および は、ポリゴンのみを入力として受け入れるST_Polygon()ようになりました。これまで、これらの関数は他のジオメトリを誤って受け入れていました。

  • ST_Distance()SQL/MM 仕様で必須とされているとおり、入力の 1 つが空のジオメトリである場合、ST_Distance() 関数が NULL を返すようになりました。これまでは、NaN が返されました。

ANSI SQL コンプライアンス

ANSI SQL 標準に従うため、以下の構文と動作の問題が修正されました。

  • Cast() オペレーション – REAL または DOUBLE から DECIMAL への cast() オペレーションが SQL 標準に準拠するようになりました。例えば、cast (double '100000000000000000000000000000000' as decimal(38)) はこれまで 100000000000000005366162204393472 を返していましたが、今後は 100000000000000000000000000000000 を返します。

  • JOIN ... USINGJOIN ... USING が 標準 SQL セマンティクスに準拠するようになりました。これまで、JOIN ... USING では列内のテーブル名を修飾することが必要で、出力に両方のテーブルからの列が存在しました。今後はテーブルの修飾が無効になり、列は出力に 1 つしか存在しなくなります。

  • ROW 型のリテラルが排除されました – ROW 型のリテラル形式 ROW<int, int>(1, 2) はサポートされなくなりました。その代わりに構文 ROW(1 int, 2 int) を使用してください。

  • グループ化された集計セマンティクス – グループ化された集計は等価セマンティクスではなく IS NOT DISTINCT FROM セマンティクスを使用します。今後は、NaN 浮動小数点値でのグループ化において、グループ化された集計が正しい結果を返し、パフォーマンスが改善されます。null が含まれるマップ、リスト、および行型のグループ化がサポートされます。

  • 引用符付きの型は使用できなくなりました – ANSI SQL 標準に従い、データ型を引用符で囲むことができなくなりました。例えば、SELECT "date" '2020-02-02' は有効なクエリではなくなります。その代わりに、構文 SELECT date '2020-02-02' を使用してください。

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

  • 複雑なグループ化操作 – 複雑なグループ化操作である GROUPING SETSCUBE、および ROLLUP では、入力列で構成される式のグループ化がサポートされていません。列名のみが許可されます。

置き換えられた関数

以下の関数はサポートされなくなり、同じ結果を生成する構文に置き換えられました。

制限

リソース制限によるクエリの失敗が発生しないことを確実にするため、Athena エンジンバージョン 2 に以下の制限が導入されました。これらの制限は、ユーザー設定可能な制限ではありません。

  • 結果要素の数min(col, n)max(col, n)min_by(col1, col2, n)、および max_by(col1, col2, n) 関数では、結果要素 n の数が 10,000 以下に制限されます。

  • GROUPING SETS – グループ化セット内のスライスの最大数は 2,048 です。

  • テキストファイルの最大行長 — テキストファイルのデフォルト最大行長は 200 MB です。

  • シーケンス関数の最大結果サイズ – シーケンス関数の最大結果サイズは 50,000 エントリです。例えば、SELECT sequence(0,45000,1) は成功しますが、SELECT sequence(0,55000,1) は「The result of the sequence function must not have more than 50000 entries」というエラーメッセージを伴って失敗します。この制限は、タイムスタンプを含むシーケンス関数のすべての入力タイプに適用されます。