Utilizzare query passthrough federate
In Athena, è possibile eseguire query su origini dati federate utilizzando il linguaggio di query dell'origine dati stessa e inviare l'intera query all'origine dati per l'esecuzione. Queste query sono chiamate query passthrough. Per eseguire query passthrough, si utilizza una funzione di tabella nella query Athena. Includere la query passthrough da eseguire sull'origine dati in uno degli argomenti della funzione di tabella. Le query pass through restituiscono una tabella che è possibile analizzare utilizzando Athena SQL.
Connettori supportati
I seguenti connettori di origine dati Athena supportano le query passthrough.
Considerazioni e limitazioni
Durante l'utilizzo di query passthrough in Athena, è necessario considerare i seguenti punti:
-
Le query passthrough sono supportate solo per le istruzioni
SELECTAthena o le operazioni di lettura. -
Le prestazioni delle query possono variare a seconda della configurazione dell'origine dati.
-
La query passthrough non supporta il controllo granulare degli accessi di Lake Formation.
-
Le query passthrough non sono supportate su origini dati registrate come Catalogo Dati Glue.
Sintassi
La sintassi passthrough generale delle query Athena è la seguente.
SELECT * FROM TABLE(catalog.system.function_name(arg1=> 'arg1Value'[,arg2=> 'arg2Value', ...]))
Tieni presente quanto segue:
-
catalog: il nome del connettore federato Athena di destinazione o il nome del catalogo dati.
-
system: il namespace che contiene la funzione. Tutte le implementazioni del connettore Athena utilizzano questo namespace.
-
function_name: il nome della funzione che invia la query passthrough all'origine dati. Spesso viene chiamata
query. La combinazionecatalog.system.function_nameè il percorso a piena risoluzione per la funzione. -
arg1, arg2 e così via: argomenti della funzione. L'utente deve passarli alla funzione. Nella maggior parte dei casi, questa è la stringa di query che viene trasmessa all'origine dati.
Per la maggior parte delle origini dati, il primo e unico argomento è query seguito dall'operatore freccia => e dalla stringa della query.
SELECT * FROM TABLE(catalog.system.query(query => 'query string'))
Per semplicità, è possibile omettere l'argomento denominato opzionale query e l'operatore freccia =>.
SELECT * FROM TABLE(catalog.system.query('query string'))
È possibile semplificare ulteriormente l’esecuzione della query rimuovendo il nome catalog se la query viene eseguita nel contesto del catalogo di destinazione.
SELECT * FROM TABLE(system.query('query string'))
Se l'origine dati richiede più della stringa della query, utilizzare argomenti denominati nell'ordine previsto dall'origine dati. Ad esempio, l'espressione contiene il primo argomento e il relativo valore. Il nome arg1 =>
'arg1Value'arg1 è specifico dell'origine dati e può differire da connettore a connettore.
SELECT * FROM TABLE( system.query(arg1=> 'arg1Value',arg2=> 'arg2Value',arg3=> 'arg3Value' ));
Quanto sopra può essere semplificato anche omettendo i nomi degli argomenti. Tuttavia, è necessario seguire l'ordine della firma del metodo. Consultare la documentazione di ciascun connettore per ulteriori informazioni sulla firma della funzione.
SELECT * FROM TABLE(catalog.system.query('arg1Value', 'arg2Value', 'arg3Value'))
È possibile eseguire più query passthrough su diversi connettori Athena utilizzando il percorso completo di risoluzione delle funzioni, come nell'esempio seguente.
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
È possibile utilizzare le query passthrough come parte di una visualizzazione federata. Si applicano le stesse limitazioni. Per ulteriori informazioni, consultare Esecuzione di query su visualizzazioni federate.
CREATE VIEW catalog.database.ViewName AS SELECT * FROM TABLE ( catalog.system.query('query') )
Per informazioni sulla sintassi esatta da utilizzare con un particolare connettore, consultate la documentazione relativa ai singoli connettori.
Utilizzo delle virgolette
I valori degli argomenti, inclusa la stringa di query passata, devono essere racchiusi tra virgolette singole, come nell'esempio seguente.
SELECT * FROM TABLE(system.query(query => 'SELECT * FROM testdb.persons LIMIT 10'))
Quando la stringa di query è racchiusa tra virgolette doppie, la query ha esito negativo. La seguente query ha esito negativo e restituisce il messaggio di errore 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"))
Per evitare una singola virgoletta, aggiungere una singola virgoletta all'originale (ad esempio, terry's_group a terry''s_group).
Esempi
La seguente query di esempio invia una query a un origine dati. La query seleziona tutte le colonne della tabella customer, limitando i risultati a 10.
SELECT * FROM TABLE( catalog.system.query( query => 'SELECT * FROM customer LIMIT 10;' ))
L'istruzione seguente esegue la stessa query, ma elimina l'argomento denominato opzionale query e l'operatore freccia =>.
SELECT * FROM TABLE( catalog.system.query( 'SELECT * FROM customer LIMIT 10;' ))
Questo può anche essere incapsulato in una visualizzazione federata per facilitarne il riutilizzo. Quando viene utilizzata con una visualizzazione, è necessario utilizzare il percorso di risoluzione completo della funzione.
CREATE VIEW AwsDataCatalog.default.example_view AS SELECT * FROM TABLE ( catalog.system.query('SELECT * FROM customer LIMIT 10;') )
Disabilitare il passthrough delle query
Per disabilitare le query passthrough, aggiungere una variabile di ambiente Lambda denominata enable_query_passthrough e impostarla su false.