Usar consultas de passagem federadas - Amazon Athena

Usar consultas de passagem federadas

No Athena, você pode realizar consultas em fontes de dados federadas usando a linguagem de consulta da própria fonte de dados e enviar a consulta completa para execução na fonte de dados. Essas consultas são chamadas de consultas de passagem. Para executar consultas de passagem, você usa uma função de tabela na sua consulta do Athena. Você inclui em um dos argumentos da função de tabela a consulta de passagem que será realizada na fonte de dados. As consultas de passagem retornam uma tabela que você pode analisar usando o Athena SQL.

Conectores compatíveis

Os seguintes conectores de fonte de dados do Athena são compatíveis com consultas de passagem.

Considerações e limitações

Ao usar consultas de passagem no Athena, considere os seguintes pontos:

  • A passagem de consultas só é compatível com instruções SELECT ou operações de leitura do Athena.

  • O desempenho da consulta poderá variar de acordo com a configuração da fonte de dados.

Sintaxe

A sintaxe geral de passagem de consultas do Athena é a seguinte.

SELECT * FROM TABLE(catalog.system.function_name(arg1 => 'arg1Value'[, arg2 => 'arg2Value', ...]))

Observe o seguinte:

  • catálogo: o nome do conector federado ou o nome do catálogo de dados do Athena de destino.

  • system: o namespace que contém a função. Todas as implementações do conector Athena usam esse namespace.

  • function_name: o nome da função que envia a consulta de passagem para a fonte de dados. Isso geralmente é chamado de query. A combinação catalog.system.function_name é o caminho completo de resolução para a função.

  • arg1, arg2 etc.: argumentos da função. O usuário deve passá-los para a função. Na maioria dos casos, essa é a string de consulta que é passada para a fonte de dados.

Para a maioria das fontes de dados, o primeiro e único argumento é query, seguido pelo operador de seta => e pela string de consulta.

SELECT * FROM TABLE(catalog.system.query(query => 'query string'))

Para simplificar, você pode omitir o argumento nomeado opcional query e o operador de seta =>.

SELECT * FROM TABLE(catalog.system.query('query string'))

Você pode simplificar ainda mais a consulta removendo o nome do catalog se a consulta for executada no contexto do catálogo de destino.

SELECT * FROM TABLE(system.query('query string'))

Se a fonte de dados exigir mais do que a string de consulta, use argumentos nomeados na ordem esperada pela fonte de dados. Por exemplo, a expressão arg1 => 'arg1Value' contém o primeiro argumento e seu valor. O nome arg1 é específico da fonte de dados e pode diferir entre os conectores.

SELECT * FROM TABLE( system.query( arg1 => 'arg1Value', arg2 => 'arg2Value', arg3 => 'arg3Value' ));

O exposto acima também pode ser simplificado omitindo-se os nomes dos argumentos. Porém, você deve seguir a ordem da assinatura do método. Consulte a documentação de cada conector para obter mais informações sobre a assinatura da função.

SELECT * FROM TABLE(catalog.system.query('arg1Value', 'arg2Value', 'arg3Value'))

Você pode executar várias consultas de passagem por diferentes conectores do Athena utilizando o caminho completo de resolução da função, como no exemplo a seguir.

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

Você pode usar consultas de passagem como parte de uma visualização federada. As mesmas limitações se aplicam. Para obter mais informações, consulte visualizações federadas de consultas.

CREATE VIEW catalog.database.ViewName AS SELECT * FROM TABLE ( catalog.system.query('query') )

Para obter informações sobre a sintaxe exata a ser usada com um determinado conector, consulte a documentação do conector individual.

Uso de aspas

Os valores dos argumentos, incluindo a string de consulta que você transmite, devem estar entre aspas simples, como no exemplo a seguir.

SELECT * FROM TABLE(system.query(query => 'SELECT * FROM testdb.persons LIMIT 10'))

Quando a string de consulta estiver entre aspas duplas, a consulta vai falhar. A consulta a seguir falha com a mensagem de erro 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"))

Para escapar uma aspas simples, adicione uma aspas simples ao original (p. ex., terry's_group para terry''s_group).

Exemplos

O exemplo de consulta a seguir envia uma consulta para uma fonte de dados. A consulta seleciona todas as colunas na tabela customer, limitando os resultados a 10.

SELECT * FROM TABLE( catalog.system.query( query => 'SELECT * FROM customer LIMIT 10;' ))

A instrução a seguir executa a mesma consulta, mas elimina o argumento nomeado opcional query e o operador de seta =>.

SELECT * FROM TABLE( catalog.system.query( 'SELECT * FROM customer LIMIT 10;' ))

Isso também pode ser encapsulado em uma visualização federada para facilitar a reutilização. Quando usado com uma visualização, você deve usar o caminho completo de resolução da função.

CREATE VIEW AwsDataCatalog.default.example_view AS SELECT * FROM TABLE ( catalog.system.query('SELECT * FROM customer LIMIT 10;') )

Optar por não usar consulta de passagem

Para desabilitar as consultas de passagem, adicione uma variável de ambiente do Lambda denominada enable_query_passthrough e defina-a como false.