페더레이션 패스스루 쿼리 사용
Athena에서는 데이터 소스 자체의 쿼리 언어를 사용하여 페더레이션 데이터 소스에서 쿼리를 실행하고 실행을 위해 전체 쿼리를 데이터 소스로 푸시다운할 수 있습니다. 이러한 쿼리를 패스스루 쿼리라고 합니다. 패스스루 쿼리를 실행하려면 Athena 쿼리에서 테이블 함수를 사용합니다. 데이터 소스에서 실행할 패스스루 쿼리를 테이블 함수의 인수 중 하나에 포함시킵니다. 패스스루 쿼리는 Athena SQL을 사용하여 분석할 수 있는 테이블을 반환합니다.
지원되는 커넥터
다음 Athena 데이터 소스 커넥터는 패스스루 쿼리를 지원합니다.
고려 사항 및 제한
Athena에서 패스스루 쿼리를 사용할 때 다음 사항을 고려하세요.
-
쿼리 패스스루는 Athena
SELECT
문 또는 읽기 작업에만 지원됩니다. -
쿼리 성능은 데이터 소스의 구성에 따라 다를 수 있습니다.
구문
일반적인 Athena 쿼리 패스스루 구문은 다음과 같습니다.
SELECT * FROM TABLE(catalog.system.
function_name
(arg1
=> 'arg1Value
'[,arg2
=> 'arg2Value
', ...]))
유의할 사항:
-
catalog - 대상 Athena 페더레이션 커넥터 이름 또는 데이터 카탈로그 이름입니다.
-
system - 함수가 포함된 네임스페이스입니다. 모든 Athena 커넥터 구현은 이 네임스페이스를 사용합니다.
-
function_name - 패스스루 쿼리를 데이터 소스로 푸시하는 함수의 이름입니다. 이를 흔히
query
라고 부릅니다. 이 조합catalog.system.function_name
은 함수의 전체 확인 경로입니다. -
arg1, arg2 등 – 함수 인수입니다. 사용자는 이러한 인수를 함수에 전달해야 합니다. 대부분의 경우에는 데이터 소스로 전달되는 쿼리 문자열입니다.
대부분의 데이터 소스에서 첫 번째이자 유일한 인수 query
이고 그 뒤에는 화살표 연산자 =>
기호와 쿼리 문자열이 붙습니다.
SELECT * FROM TABLE(catalog.system.query(query => 'query string'))
간편함을 위해 선택적으로 명명된 query
인수와 화살표 연산자 =>
기호를 생략할 수 있습니다.
SELECT * FROM TABLE(catalog.system.query('query string'))
대상 카탈로그의 컨텍스트 내에서 쿼리를 실행하는 경우 catalog
이름을 제거하여 쿼리를 더욱 단순화할 수 있습니다.
SELECT * FROM TABLE(system.query('query string'))
데이터 소스에 쿼리 문자열 이상이 필요한 경우 데이터 소스에서 예상하는 순서대로 명명된 인수를 사용합니다. 예를 들어
표현식에는 첫 번째 인수와 해당 값이 포함됩니다. arg1
=>
'arg1Value
'arg1
이라는 이름은 데이터 소스에 따라 다르고 커넥터마다 다를 수 있습니다.
SELECT * FROM TABLE( system.query(
arg1
=> 'arg1Value
',arg2
=> 'arg2Value
',arg3
=> 'arg3Value
' ));
인수 이름을 생략하여 위 문을 단순화할 수도 있습니다. 하지만 메서드의 서명 순서를 따라야 합니다. 함수 서명에 대한 자세한 내용은 각 커넥터의 설명서를 참조하세요.
SELECT * FROM TABLE(catalog.system.query('arg1Value', 'arg2Value', 'arg3Value'))
다음 예제와 같이 전체 함수 확인 경로를 활용하여 여러 Athena 커넥터에서 여러 패스스루 쿼리를 실행할 수 있습니다.
SELECT c_customer_sk FROM TABLE (postgresql.system.query('select * from customer limit 10')) UNION SELECT c_customer_sk FROM TABLE(dynamodb.system.query('select * from customer')) LIMIT 10
패스스루 쿼리를 페더레이션된 뷰의 일부로 사용할 수 있습니다. 동일한 제한 사항이 적용됩니다. 자세한 내용은 페더레이션된 뷰 쿼리를 참조하세요.
CREATE VIEW catalog.database.ViewName AS SELECT * FROM TABLE ( catalog.system.query('query') )
특정 커넥터에 사용할 정확한 구문에 대한 자세한 내용은 개별 커넥터 설명서를 참조하세요.
따옴표 사용
전달한 쿼리 문자열을 비롯한 인수 값은 다음 예제와 같이 작은따옴표로 묶어야 합니다.
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( catalog.system.query( query => 'SELECT * FROM customer LIMIT 10;' ))
다음 문은 동일한 쿼리를 실행하지만 선택적으로 명명된 query
인수와 화살표 연산자 =>
기호를 제거합니다.
SELECT * FROM TABLE( catalog.system.query( 'SELECT * FROM customer LIMIT 10;' ))
쉽게 재사용할 수 있도록 페더레이션된 뷰 내에 캡슐화할 수도 있습니다. 뷰와 함께 사용하는 경우 전체 함수 확인 경로를 사용해야 합니다.
CREATE VIEW AwsDataCatalog.default.example_view AS SELECT * FROM TABLE ( catalog.system.query('SELECT * FROM customer LIMIT 10;') )
쿼리 패스스루 옵트아웃
패스스루 쿼리를 비활성화하려면 enable_query_passthrough
라는 이름으로 Lambda 환경 변수를 추가하고 false
로 설정합니다.