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.
Utilisation des requêtes de transmission 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 transmettre la requête complète vers la source de données pour exécution. Ces requêtes sont appelées requêtes de transmission. Pour exécuter des requêtes de transmission, vous devez utiliser une fonction de table dans votre requête Athena. Vous devez inclure la requête de transmission à exécuter sur la source de données dans l’un des arguments de la fonction de table. Les requêtes de transmission renvoient une table que vous pouvez analyser à l’aide d’Athena SQL.
Connecteurs pris en charge
Les connecteurs de source de données Athena suivants prennent en charge les requêtes de transmission.
Considérations et restrictions
Lorsque vous utilisez des requêtes de transmission dans Athena, vous devez tenir compte des points suivants :
-
La fonctionnalité de transmission des requêtes est uniquement prise en charge dans le cadre d’instructions
SELECTAthena ou d’opérations de lecture. -
Les performances des requêtes peuvent varier en fonction de la configuration de la source de données.
-
La fonctionnalité de transmission des requêtes ne prend pas en charge le contrôle d’accès précis de Lake Formation.
-
Les requêtes de transmission ne sont pas prises en charge sur les sources de données enregistrées en tant que Catalogue de données Glue.
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', ...]))
Remarques :
-
catalog – Nom du connecteur fédéré Athena cible ou nom du catalogue de données.
-
system – Espace de noms qui contient la fonction. Toutes les implémentations de connecteur Athena utilisent cet espace de noms.
-
function_name – Nom de la fonction qui transmet la requête de transmission à la source de données. Cet élément est souvent appelé
query. La combinaisoncatalog.system.function_namecorrespond au chemin de résolution complet de la fonction. -
arg1, arg2, etc. – Arguments de la 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.
Dans 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 plus 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 encore simplifier la requête en supprimant le nom catalog 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 davantage 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' ));
La requête ci-dessus peut également être simplifiée en omettant les noms des arguments. Vous devez cependant suivre l’ordre de signature de la méthode. Consultez la documentation relative à 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 de transmission sur différents connecteurs Athena en utilisant le chemin de résolution complet de la fonction, comme illustré 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 de transmission dans le cadre d’une vue fédérée. Les mêmes limitations s’appliquent. Pour plus d’informations, consultez Interrogation de 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 illustré 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 doubles, la requête échoue. La requête suivante échoue avec le message d’erreur 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"))
Pour échapper un guillemet simple, ajoutez un guillemet simple à l’original (par exemple, terry's_group à terry''s_group).
Exemples
L’exemple de requête suivant transmet une requête à une source de données. La requête sélectionne toutes les colonnes dans la table customer, en 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 supprime l’argument nommé facultatif query et l’opérateur flèche =>.
SELECT * FROM TABLE( catalog.system.query( 'SELECT * FROM customer LIMIT 10;' ))
Elle peut également être encapsulée dans une vue fédérée pour faciliter sa 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ésactivation de la fonctionnalité de transmission des requêtes
Pour désactiver les requêtes de transmission, ajoutez une variable d’environnement Lambda nommée enable_query_passthrough et définissez-la sur false.