フェデレーテッドパススルークエリの実行
Athena では、データソース自体のクエリ言語を使用してフェデレーテッドデータソースに対するクエリを実行したり、実行のためにクエリ全体をデータソースにプッシュダウンしたりすることができます。これらのクエリはパススルークエリと呼ばれます。パススルークエリを実行するには、Athena クエリでテーブル関数を使用します。データソースで実行するパススルークエリは、テーブル関数に対する引数の 1 つに含めます。パススルークエリは、Athena SQL を使用して分析できるテーブルを返します。
サポートされるコネクタ
以下の Athena データソースコネクタがパススルークエリをサポートしています。
考慮事項と制約事項
Athena でパススルークエリを使用するときは、以下の点を考慮してください。
-
クエリパススルーがサポートされるのは、Athena
SELECT
ステートメントまたは読み取り操作のみです。 -
パススルークエリは、外部クエリ (つまり、テーブル関数を呼び出すクエリ) のカタログのコンテキスト内で実行される必要があります。
-
クエリのパフォーマンスは、データソースの設定に応じて異なる場合があります。
-
ビューでは、パススルークエリがサポートされません。
構文
以下は、一般的な Athena クエリパススルー構文です。
SELECT * FROM TABLE(system.
function_name
(arg1
=> 'arg1Value
'[,arg2
=> 'arg2Value
', ...]))
ほとんどのデータソースでは、query
が最初で唯一の引数であり、その後にアロー演算子 =>
とクエリ文字列が続きます。
SELECT * FROM TABLE(system.query(query => 'query string'))
オプションの名前付き引数 query
とアロー演算子 =>
は、簡素化のために省略することが可能です。
SELECT * FROM TABLE(system.query('query string'))
データソースがクエリ文字列以上のものを必要とする場合は、データソースが期待する順序で名前付き引数を使用してください。たとえば、
式には最初の引数とその値が含まれます。arg1
=>
'arg1Value
'arg1
という名前はデータソースに固有のもので、コネクタによって異なる場合があります。
SELECT * FROM TABLE( system.query(
arg1
=> 'arg1Value
',arg2
=> 'arg2Value
',arg3
=> 'arg3Value
' ));
特定のコネクタで使用する正確な構文については、個々のコネクタのページを参照してください。
引用符の使用
引数値 (渡すクエリ文字列を含む) は、以下の例にあるように、一重引用符で囲む必要があります。
SELECT * FROM TABLE(system.query(query => 'SELECT * FROM testdb.persons LIMIT 10'))
クエリ文字列が二重引用符で囲まれていると、クエリは失敗します。以下のクエリは、COLUMN_NOT_FOUND: line 1:43: Column 'select * from testdb.persons limit 10' cannot be resolved
というエラーメッセージで失敗します。
SELECT * FROM TABLE(system.query(query => "SELECT * FROM testdb.persons LIMIT 10"))
一重引用符をエスケープするには、元の引用符に一重引用符を追加します (terry's_group
を terry''s_group
にするなど)。
例
以下のクエリ例は、データソースにクエリをプッシュダウンします。クエリは customer
テーブル内のすべての列を選択し、結果を 10 個に制限します。
SELECT * FROM TABLE( system.query( query => 'SELECT * FROM customer LIMIT 10;' ))
以下のステートメントは同じクエリを実行しますが、オプションの名前付き引数 query
とアロー演算子 =>
を削除します。
SELECT * FROM TABLE( system.query( 'SELECT * FROM customer LIMIT 10;' ))