フェデレーテッドパススルークエリの実行 - Amazon Athena

フェデレーテッドパススルークエリの実行

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_groupterry''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;' ))