Les traductions sont fournies par des outils de traduction automatique. En cas de conflit entre le contenu d'une traduction et celui de la version originale en anglais, la version anglaise prévaudra.
Utiliser des requêtes directes fédérées
Dans Athena, vous pouvez exécuter des requêtes sur des sources de données fédérées en utilisant le langage de requête de la source de données elle-même et transférer la requête complète vers la source de données pour exécution. Ces requêtes sont appelées requêtes passthrough. Pour exécuter des requêtes directes, vous devez utiliser une fonction de table dans votre requête Athena. Vous incluez la requête directe à exécuter sur la source de données dans l'un des arguments de la fonction de table. Les requêtes passthrough renvoient une table que vous pouvez analyser à l'aide d'AthenaSQL.
Connecteurs pris en charge
Les connecteurs de source de données Athena suivants prennent en charge les requêtes directes.
Considérations et restrictions
Lorsque vous utilisez des requêtes directes dans Athena, tenez compte des points suivants :
-
Le transfert de requêtes n'est pris en charge que pour les instructions
SELECT
Athena ou les opérations de lecture. -
Les performances des requêtes peuvent varier en fonction de la configuration de la source de données.
Syntaxe
La syntaxe générale de transmission des requêtes Athena est la suivante.
SELECT * FROM TABLE(catalog.system.
function_name
(arg1
=> 'arg1Value
'[,arg2
=> 'arg2Value
', ...]))
Notez ce qui suit :
-
catalogue : nom du connecteur fédéré Athena cible ou nom du catalogue de données.
-
system — L'espace de noms qui contient la fonction. Toutes les implémentations du connecteur Athena utilisent cet espace de noms.
-
function_name — Le nom de la fonction qui transmet la requête directe à la source de données. C'est ce qu'on appelle souvent
query
. La combinaisoncatalog.system.function_name
correspond au chemin de résolution complet de la fonction. -
arg1, arg2, etc. — Arguments de fonction. L'utilisateur doit les transmettre à la fonction. Dans la plupart des cas, il s'agit de la chaîne de requête transmise à la source de données.
Pour la plupart des sources de données, le premier et unique argument est query
suivi de l'opérateur flèche =>
et de la chaîne de requête.
SELECT * FROM TABLE(catalog.system.query(query => 'query string'))
Pour des raisons de simplicité, vous pouvez omettre l'argument nommé facultatif query
et l'opérateur =>
flèche.
SELECT * FROM TABLE(catalog.system.query('query string'))
Vous pouvez simplifier davantage la requête en supprimant le catalog
nom si la requête est exécutée dans le contexte du catalogue cible.
SELECT * FROM TABLE(system.query('query string'))
Si la source de données nécessite plus que la chaîne de requête, utilisez des arguments nommés dans l'ordre attendu par la source de données. Par exemple, l'expression
contient le premier argument et sa valeur. Le nom arg1
=>
'arg1Value
'arg1
est spécifique à la source de données et peut varier d'un connecteur à l'autre.
SELECT * FROM TABLE( system.query(
arg1
=> 'arg1Value
',arg2
=> 'arg2Value
',arg3
=> 'arg3Value
' ));
Ce qui précède peut également être simplifié en omettant les noms des arguments. Cependant, vous devez suivre l'ordre de signature de la méthode. Consultez la documentation de chaque connecteur pour plus d'informations sur la signature de la fonction.
SELECT * FROM TABLE(catalog.system.query('arg1Value', 'arg2Value', 'arg3Value'))
Vous pouvez exécuter plusieurs requêtes directes sur différents connecteurs Athena en utilisant le chemin de résolution complet des fonctions, comme dans l'exemple suivant.
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
Vous pouvez utiliser des requêtes directes dans le cadre d'une vue fédérée. Les mêmes restrictions s'appliquent. Pour plus d'informations, voir Interroger les vues fédérées.
CREATE VIEW catalog.database.ViewName AS SELECT * FROM TABLE ( catalog.system.query('query') )
Pour plus d'informations sur la syntaxe exacte à utiliser avec un connecteur particulier, consultez la documentation de chaque connecteur.
Utilisation des guillemets
Les valeurs des arguments, y compris la chaîne de requête que vous transmettez, doivent être placées entre guillemets simples, comme dans l'exemple suivant.
SELECT * FROM TABLE(system.query(query => 'SELECT * FROM testdb.persons LIMIT 10'))
Lorsque la chaîne de requête est entourée de guillemets, la requête échoue. La requête suivante échoue avec le message d'erreur COLUMN_ NOT _ FOUND : ligne 1:43 : Impossible de résoudre la colonne « select * from testdb.persons limit
10 ».
SELECT * FROM TABLE(system.query(query => "SELECT * FROM testdb.persons LIMIT 10"))
Pour éviter un guillemet unique, ajoutez-en un à l'original (par exemple, terry's_group
àterry''s_group
).
Exemples
L'exemple de requête suivant permet de transférer une requête vers une source de données. La requête sélectionne toutes les colonnes de la customer
table, limitant les résultats à 10.
SELECT * FROM TABLE( catalog.system.query( query => 'SELECT * FROM customer LIMIT 10;' ))
L'instruction suivante exécute la même requête, mais élimine l'argument nommé facultatif query
et l'opérateur flèche=>
.
SELECT * FROM TABLE( catalog.system.query( 'SELECT * FROM customer LIMIT 10;' ))
Cela peut également être encapsulé dans une vue fédérée pour faciliter la réutilisation. Lorsque vous l'utilisez avec une vue, vous devez utiliser le chemin de résolution complet de la fonction.
CREATE VIEW AwsDataCatalog.default.example_view AS SELECT * FROM TABLE ( catalog.system.query('SELECT * FROM customer LIMIT 10;') )
Désactiver le transfert des requêtes
Pour désactiver les requêtes directes, ajoutez une variable d'environnement Lambda enable_query_passthrough
nommée et définissez-la sur. false