运行联合传递查询
在 Athena 中,可以使用数据来源本身的查询语言对联合数据来源运行查询,并将完整查询下推到数据来源来执行查询。这些查询称为传递查询。要运行传递查询,可以在 Athena 查询中使用表函数。您可以将要在数据来源上运行的传递查询包含在表函数的其中一个参数中。传递查询会返回一个表,该表可以使用 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;' ))