Verbund-Passthrough-Abfragen verwenden
In Athena können Sie Abfragen für Verbund-Datenquellen mithilfe der Abfragesprache der Datenquelle selbst ausführen und die vollständige Abfrage zur Ausführung an die Datenquelle weiterleiten. Diese Abfragen werden als Pass-Through-Abfragen bezeichnet. Um Pass-Through-Abfragen auszuführen, verwenden Sie eine Tabellenfunktion in Ihrer Athena-Abfrage. Sie schließen die Passthrough-Abfrage, die für die Datenquelle ausgeführt werden soll, in eines der Argumente der Tabellenfunktion ein. Pass-Through-Abfragen geben eine Tabelle zurück, die Sie mit Athena SQL analysieren können.
Unterstützte Konnektoren
Die folgenden Athena-Datenquellen-Connectoren unterstützen Pass-Through-Abfragen.
Überlegungen und Einschränkungen
Berücksichtigen Sie bei der Verwendung von Pass-Through-Abfragen in Athena die folgenden Punkte:
-
Query-Passthrough wird nur für
SELECT-Athena-Anweisungen oder Lesevorgänge unterstützt. -
Die Abfrageleistung kann je nach Konfiguration der Datenquelle variieren.
-
Pass-Through-Abfrage unterstützt die differenzierte Zugriffskontrolle von Lake Formation nicht.
-
Pass-Through-Abfragen werden für Datenquellen, die als Glue-Datenkatalog registriert sind, nicht unterstützt.
Syntax
Die allgemeine Athena Passthrough-Abfrage-Syntax ist wie folgt.
SELECT * FROM TABLE(catalog.system.function_name(arg1=> 'arg1Value'[,arg2=> 'arg2Value', ...]))
Beachten Sie Folgendes:
-
catalog – Der Name des Athena-Verbundkonnektors oder des Datenkatalogs, auf den verwiesen wird.
-
system – Der Namespace, der die Funktion enthält. Alle Athena-Connector-Implementierungen verwenden diesen Namespace.
-
function_name – Der Name der Funktion, die die Passthrough-Abfrage an die Datenquelle weiterleitet. Dies wird oft
querygenannt. Die Kombinationcatalog.system.function_nameist der vollständige Auflösungspfad für die Funktion. -
arg1, arg2 usw. – Funktionsargumente. Der Benutzer muss diese an die Funktion übergeben. In den meisten Fällen ist dies die Abfragezeichenfolge, die an die Datenquelle weitergegeben wird.
Bei den meisten Datenquellen ist das erste und einzige Argument query, gefolgt vom Pfeiloperator => und der Abfragezeichenfolge.
SELECT * FROM TABLE(catalog.system.query(query => 'query string'))
Der Einfachheit halber können Sie das optionale benannte Argument query und den Pfeiloperator => weglassen.
SELECT * FROM TABLE(catalog.system.query('query string'))
Sie können die Abfrage weiter vereinfachen, indem Sie den catalog-Namen entfernen, wenn die Abfrage im Kontext des Zielkatalogs ausgeführt wird.
SELECT * FROM TABLE(system.query('query string'))
Wenn die Datenquelle mehr als die Abfragezeichenfolge benötigt, verwenden Sie benannte Argumente in der von der Datenquelle erwarteten Reihenfolge. Der Ausdruck enthält beispielsweise das erste Argument und seinen Wert. Der Name arg1 =>
'arg1Value'arg1 ist spezifisch für die Datenquelle und kann von Konnektor zu Konnektor unterschiedlich sein.
SELECT * FROM TABLE( system.query(arg1=> 'arg1Value',arg2=> 'arg2Value',arg3=> 'arg3Value' ));
Das Obige kann auch vereinfacht werden, indem die Argumentnamen weggelassen werden. Sie müssen jedoch die Reihenfolge der Methodensignatur einhalten. Weitere Informationen zur Signatur der Funktion finden Sie in der Dokumentation der einzelnen Konnektoren.
SELECT * FROM TABLE(catalog.system.query('arg1Value', 'arg2Value', 'arg3Value'))
Sie können mehrere Pass-Through-Abfragen über verschiedene Athena-Konnektoren ausführen, indem Sie den vollständigen Funktionsauflösungspfad verwenden, wie im folgenden Beispiel gezeigt.
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
Sie können Passthrough-Abfragen als Teil einer Verbund-Ansicht verwenden. Es gelten die gleichen Einschränkungen. Weitere Informationen zu finden Sie unter Verbundansichten abfragen.
CREATE VIEW catalog.database.ViewName AS SELECT * FROM TABLE ( catalog.system.query('query') )
Informationen zur genauen Syntax, die mit einem bestimmten Konnektor verwendet werden muss, finden Sie in der Dokumentation zu den einzelnen Konnektoren.
Verwendung von Anführungszeichen
Argumentwerte, einschließlich der von Ihnen übergebenen Abfragezeichenfolge, müssen in einfache Anführungszeichen eingeschlossen werden, wie im folgenden Beispiel.
SELECT * FROM TABLE(system.query(query => 'SELECT * FROM testdb.persons LIMIT 10'))
Wenn die Abfragezeichenfolge von Anführungszeichen umgeben ist, schlägt die Abfrage fehl. Die folgende Abfrage schlägt mit der folgenden Fehlermeldung fehl COLUMN_NOT_FOUND: Zeile 1:43: Die Spalte 'select * von testdb.persons limit 10' kann nicht gelöst werden.
SELECT * FROM TABLE(system.query(query => "SELECT * FROM testdb.persons LIMIT 10"))
Um ein einfaches Anführungszeichen zu umgehen, fügen Sie dem Original ein einfaches Anführungszeichen hinzu (z. B. terry's_group zu terry''s_group).
Beispiele
Mit der folgenden Beispielabfrage wird eine Abfrage an eine Datenquelle weitergeleitet. Die Abfrage wählt alle Spalten in der customer-Tabelle aus und begrenzt die Ergebnisse auf 10.
SELECT * FROM TABLE( catalog.system.query( query => 'SELECT * FROM customer LIMIT 10;' ))
Die folgende Anweisung führt dieselbe Abfrage aus, entfernt jedoch das optionale benannte Argument query und den Pfeiloperator =>.
SELECT * FROM TABLE( catalog.system.query( 'SELECT * FROM customer LIMIT 10;' ))
Dies kann auch in einer Verbundansicht zusammengefasst werden, um die Wiederverwendung zu vereinfachen. Bei der Verwendung mit einer Ansicht müssen Sie den vollständigen Funktionsauflösungspfad verwenden.
CREATE VIEW AwsDataCatalog.default.example_view AS SELECT * FROM TABLE ( catalog.system.query('SELECT * FROM customer LIMIT 10;') )
Abmelden von Pass-Through-Abfrage
Um Passthrough-Abfragen zu deaktivieren, fügen Sie eine Lambda-Umgebungsvariable mit dem Namen enable_query_passthrough hinzu und setzen Sie sie auf false.