翻訳は機械翻訳により提供されています。提供された翻訳内容と英語版の間で齟齬、不一致または矛盾がある場合、英語版が優先します。
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 JOIN –
LATERAL
導出テーブルに対するCROSS JOIN
のサポートが追加されました。 -
GROUPING SETS –
GROUPING SETS
を使用するクエリのための集計におけるORDER BY
句のサポートが追加されました。 -
Lambda 式 – Lambda 式の行フィールドの逆参照に対するサポートが追加されました。
-
準結合での Null 値 – 準結合の左側 (つまり、サブクエリでの
IN
述語) での null 値のサポートが追加されました。 -
空間結合 – ブロードキャスト空間結合と空間左結合のサポートが追加されました。
-
ディスクへのスピル – メモリ集約型の
INNER JOIN
およびLEFT JOIN
オペレーションでは、Athena が中間オペレーション結果をディスクにオフロードします。これにより、大量のメモリを必要とするクエリの実行が可能になります。
データ型の拡張
-
INTEGER 用の INT –
INTEGER
データ型のエイリアスとしてのINT
のサポートが追加されました。 -
INTERVAL 型 –
INTERVAL
型へのキャスティングのサポートが追加されました。 -
IPADDRESS – DML クエリの IP アドレスを表す新しい
IPADDRESS
タイプを追加しました。VARBINARY
型とIPADDRESS
型間におけるキャスティングのサポートが追加されました。IPADDRESS
タイプは DDL クエリでは認識されません。 -
IS DISTINCT FROM –
JSON
およびIPADDRESS
型に対するIS DISTINCT FROM
のサポートが追加されました。 -
Null 等価チェック –
ARRAY
、MAP
、および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()
関数が次の型をサポートするようになりました: INTEGER
、SMALLINT
、TINYINT
、DECIMAL
、REAL
、DATE
、TIMESTAMP
、TIMESTAMP WITH TIME ZONE
、TIME
、TIME WITH TIME ZONE
、IPADDRESS
、および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 ドキュメントへのリンクを参照してください。
集計関数
配列関数と演算子
array_sort()
バイナリ関数と演算子
日付/時刻関数と演算子
マッピング関数と演算子
数学関数と演算子
分位点ダイジェスト関数
分位点ダイジェスト関数qdigest
分位点ダイジェスト型を追加しました。
文字列関数および演算子
フォーマンスの向上
Athena エンジンバージョン 2 では、以下の機能のパフォーマンスが改善されました。
クエリパフォーマンス
-
ブロードキャスト参加のパフォーマンス – ワーカーノードに動的パーティションプルーニングを適用することで、ブロードキャスト参加のパフォーマンスが向上しました。
-
バケット化されたテーブル – 書き込まれるデータが既に適切にパーティション化されている場合 (例えば、出力がバケット化された結合からの場合など) におけるバケット化されたテーブルへの書き込みのパフォーマンスが改善されました。
-
DISTINCT –
DISTINCT
を使用する一部のクエリのパフォーマンスが改善されました。動的フィルタリングとパーティションプルーニング - これらの改善によってパフォーマンスが向上し、クエリでスキャンされるデータ量が削減されます。
-
フィルタ演算と射影演算 – 可能な場合には、フィルタ演算と射影演算が常に列で処理されるようになりました。エンジンは、辞書エンコーディングが有効であれば、それを自動的に利用します。
-
Gathering exchange – Gathering exchange でのクエリのパフォーマンスが改善されました。
-
グローバル集計 – フィルタリングされたグローバル集計を実行する一部のクエリのパフォーマンスが改善されました。
-
GROUPING SETS、CUBE、ROLLUP – 1 つのクエリに列のセットを複数集約できるので、
GROUPING SETS
、CUBE
、またはROLLUP
に関連するクエリのパフォーマンスが向上します。 -
きわめて選択的なフィルタ – きわめて選択的なフィルタを使用したクエリのパフォーマンスが改善されました。
-
JOIN および AGGREGATE オペレーション –
JOIN
およびAGGREGATE
オペレーションのパフォーマンスが強化されました。 -
LIKE –
information_schema
テーブルの列でLIKE
述語を使用するクエリのパフォーマンスが改善されました。 -
ORDER BY および LIMIT – 不必要なデータ交換を回避するため、
ORDER BY
とLIMIT
が関与するクエリのプラン、パフォーマンス、およびメモリ使用量が改善されました。 -
ORDER BY –
ORDER BY
オペレーションがデフォルトで分散されるようになり、より大きなORDER BY
句の使用が可能になりました。 -
ROW 型の変換 –
ROW
型を変換する時のパフォーマンスが改善されました。 -
構造型 – 構造型を処理し、スキャン、結合、集約、またはテーブル書き込みを含むクエリのパフォーマンスが改善されました。
-
テーブルのスキャン – 特定のケースで発生するテーブルスキャンの重複を回避するための、最適化ルールが導入されました。
-
UNION –
UNION
クエリのパフォーマンスが改善されました。
クエリプランのパフォーマンス
-
プランパフォーマンス – 多数の列を持つ複数のテーブルを結合するクエリのプランパフォーマンスが改善されました。
-
述語評価 – プランにおける述語プッシュダウン中の述語評価のパフォーマンスが改善されました。
-
キャスティングのための述語プッシュダウンのサポート – 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 BY
とORDER 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()
関数が最適化されました。
JSON 関連の改善
マップ関数
-
すべてのケースにおける
O(n)
からO(1)
のマップサブスクリプトのパフォーマンスが改善されました。これまで、この改善を利用できるのは特定の関数とリーダーによって作成されたマップのみでした。 -
map_from_entries()
関数とmap_entries()
関数を追加しました。
キャスティング
-
REAL
、TINYINT
、またはSMALLINT
からJSON
にキャストする機能が追加されました。 -
今後は、
JSON
がROW
にすべてのフィールドを含まない場合でも、JSON
をROW
にキャストできるようになります。 -
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)
関数のシグネチャのパラメータd
がINTEGER
型になりました。これまでは、d
がBIGINT
型である場合がありました。 -
重複したキーを持つ 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 データ型の SUM –
SUM(NULL)
を直接使用することができなくなりました。SUM(NULL)
を使用するには、NULL
をBIGINT
、DECIMAL
、REAL
、DOUBLE
、INTERVAL_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 ... USING –
JOIN ... 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 SETS
、CUBE
、およびROLLUP
では、入力列で構成される式のグループ化がサポートされていません。列名のみが許可されます。
置き換えられた関数
以下の関数はサポートされなくなり、同じ結果を生成する構文に置き換えられました。
-
information_schema.__internal_partitions__ – Athena エンジンバージョン 2 では、今後
__internal_partitions__
の使用はサポートされません。これに相当する構文には、SELECT * FROM "
または<table_name>
$partitions"SHOW PARTITIONS
を使用してください。詳細については、「」を参照してください特定のテーブルのパーティションのリスト化 -
置き換えられた地理空間関数 – 名前が変更された地理空間関数のリストについては、「Athena エンジンバージョン 2 における地理空間関数名の変更」を参照してください。
制限
リソース制限によるクエリの失敗が発生しないことを確実にするため、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
」というエラーメッセージを伴って失敗します。この制限は、タイムスタンプを含むシーケンス関数のすべての入力タイプに適用されます。