Konfigurieren von PolyBase für den Zugriff auf externe Daten in MongoDB

Gilt für:yesSQL Server (alle unterstützten Versionen)

In diesem Artikel wird erläutert, wie Sie PolyBase in einer SQL Server-Instanz verwenden, um externe Daten in MongoDB abzufragen.

Voraussetzungen

Wenn Sie PolyBase nicht installiert haben, finden Sie weitere Informationen unter PolyBase installation (Installieren von PolyBase).

Vor dem Erstellen von datenbankweit gültigen Anmeldeinformationen muss die Datenbank über einen Hauptschlüssel zum Schützen der Anmeldeinformationen verfügen. Weitere Informationen finden Sie unter CREATE MASTER KEY.

Konfigurieren einer externen MongoDB-Datenquelle

Zum Abfragen der Daten einer MongoDB-Datenquelle müssen Sie externe Tabellen zum Verweisen auf externe Daten erstellen. Dieser Abschnitt enthält Beispielcode zum Erstellen dieser externen Tabellen.

In diesem Abschnitt werden die folgenden Transact-SQL-Befehle verwendet:

  1. Erstellen Sie datenbankweit gültige Anmeldeinformationen für den Zugriff auf die MongoDB-Quelle.

    Das folgende Skript erstellt eine datenbankweite Anmeldeinformation. Bevor Sie das Skript ausführen, müssen Sie es für Ihre Umgebung aktualisieren:

    • Ersetzen Sie <credential_name> mit einem Namen für die Anmeldeinformation.
    • Ersetzen Sie <username> mit dem Benutzernamen für die externe Quelle.
    • Ersetzen Sie <password> mit dem entsprechenden Kennwort.
    CREATE DATABASE SCOPED CREDENTIAL [<credential_name>] WITH IDENTITY = '<username>', Secret = '<password>';
    

    Wichtig

    Der MongoDB ODBC-Connector für PolyBase unterstützt nur die einfache Authentifizierung, nicht die Kerberos-Authentifizierung.

  2. Einer externe Datenquelle erstellen

    Mit dem folgenden Skript wird die externe Datenquelle erstellt. Weitere Informationen finden Sie unter CREATE EXTERNAL DATA SOURCE. Bevor Sie das Skript ausführen, müssen Sie es für Ihre Umgebung aktualisieren:

    • Aktualisieren Sie den Speicherort. Legen Sie <server> und <port> für Ihre Umgebung fest.
    • Ersetzen Sie <credential_name> durch den Namen der im vorherigen Schritt erstellten Anmeldeinformation.
    • Sie können optional auch PUSHDOWN = ON oder PUSHDOWN = OFF angeben, wenn Sie eine Pushdownberechnung für die externe Quelle angeben möchten.
    CREATE EXTERNAL DATA SOURCE external_data_source_name
    WITH (LOCATION = '<mongodb://<server>[:<port>]>'
    [ [ , ] CREDENTIAL = <credential_name> ]
    [ [ , ] CONNECTION_OPTIONS = '<key_value_pairs>'[,...]]
    [ [ , ] PUSHDOWN = { ON | OFF } ])
    [ ; ]
    
  3. Abfragen des externen Schemas in MongoDB.

    Sie können die Data Virtualization-Erweiterung für Azure Data Studio verwenden, um eine VERBINDUNG herzustellen und eine CREATE EXTERNAL TABLE-Anweisung basierend auf dem Schema zu generieren, das vom PolyBase ODBC-Treiber für MongoDB-Treiber erkannt wurde. Sie können ein Skript auch manuell anpassen, basierend auf der Ausgabe der gespeicherten Systemprozedur sp_data_source_objects (Transact-SQL). Die Datenvirtualisierungserweiterung für Azure Data Studio und sp_data_source_table_columns verwenden dieselben internen gespeicherten Prozeduren, um das externe Schemaschema abzufragen.

    Wenn Sie externe Tabellen für MongoDB-Auflistungen erstellen möchten, die Arrays enthalten, empfiehlt es sich, die Datenvirtualisierungserweiterung für Azure Data Studio zu verwenden. Die Abschläfungsaktionen werden automatisch vom Treiber ausgeführt. Die sp_data_source_table_columns gespeicherte Prozedur führt auch automatisch die Abschläfung über den PolyBase ODBC-Treiber für MongoDB-Treiber aus.

  4. Erstellen Sie eine externe Tabelle.

    Wenn Sie die Data Virtualization-Erweiterung für Azure Data Studio verwenden, können Sie diesen Schritt überspringen, da die CREATE EXTERNAL TABLE-Anweisung für Sie generiert wird. Wenn Sie das Schema manuell bereitstellen möchten, sollten Sie das folgende Beispielskript berücksichtigen, um eine externe Tabelle zu erstellen. Weitere Informationen finden Sie unter CREATE EXTERNAL DATA TABLE.

    Bevor Sie das Skript ausführen, aktualisieren Sie es für Ihre Umgebung:

    • Aktualisieren Sie die Felder mit ihrem Namen, ihrer Sortierung, und wenn es sich um Sammlungen handelt, geben Sie den Sammlungsnamen und den Feldnamen an. In diesem Beispiel ist friends ein benutzerdefinierter Datentyp.
    • Aktualisieren Sie den Speicherort. Legen Sie den Datenbanknamen und den Tabellennamen fest. Beachten Sie, dass dreiteilige Namen nicht zulässig sind, deshalb können Sie sie nicht für die system.profile-Tabelle erstellen. Sie können auch keine Sicht angeben, da die Tabelle die Metadaten nicht daraus abrufen kann.
    • Aktualisieren Sie die Datenquelle mit dem Namen der Datenquelle, die Sie im vorherigen Schritt erstellt haben.
    CREATE EXTERNAL TABLE [MongoDbRandomData](
      [_id] NVARCHAR(24) COLLATE SQL_Latin1_General_CP1_CI_AS NOT NULL,
      [RandomData_friends_id] INT,
      [RandomData_tags] NVARCHAR(MAX) COLLATE SQL_Latin1_General_CP1_CI_AS)
    WITH (
      LOCATION='MyDb.RandomData',
      DATA_SOURCE=[MongoDb])
    
  5. Optional: Erstellen Sie Statistiken für eine externe Tabelle.

    Es empfiehlt sich, Statistiken für externe Tabellenspalten zu erstellen – insbesondere für diejenigen, die für Joins, Filter und Aggregate verwendet werden. So können Sie eine optimale Abfrageleistung erzielen.

    CREATE STATISTICS statistics_name ON customer (C_CUSTKEY) WITH FULLSCAN; 
    

Wichtig

Sobald Sie eine externe Datenquelle erstellt haben, können Sie über den Befehl CREATE EXTERNAL TABLE eine abfragbare Tabelle für diese Quelle erstellen.

Ein Beispiel finden Sie unter Erstellen einer externen Tabelle für MongoDB.

Verbindungsoptionen für MongoDB

Informationen zu den Verbindungsoptionen für MongoDB finden Sie in der MongoDB-Dokumentation zum URI-Format der Verbindungszeichenfolge.

Vereinfachen

Die Vereinfachung (Flattening) ist für geschachtelte und wiederholte Daten aus MongoDB-Dokumentsammlungen aktiviert. Der Benutzer muss create an external table aktivieren und ein relationales Schema über MongoDB-Dokumentsammlungen explizit angeben, die möglicherweise geschachtelte und/oder wiederholte Daten besitzen. Geschachtelte/wiederholte JSON-Datentypen werden wie folgt vereinfacht

  • Objekt: unsortierte Schlüssel-/Wertsammlung, die in geschweiften Klammern eingeschlossen wird (geschachtelt)

    • SQL Server erstellt eine Tabellenspalte für jeden Objektschlüssel.

      • Spaltenname: objectname_keyname
  • Array: durch Kommas getrennte geordnete Werte, die in eckigen Klammern eingeschlossen sind (wiederholt)

    • SQL Server fügt eine neue Tabellenzeile für jedes Arrayelement hinzu.

    • SQL Server erstellt eine Spalte pro Array, um den Arrayelementindex zu speichern.

      • Spaltenname: arrayname_index

      • Datentyp: bigint

Es können mehrere potenzielle Probleme mit diesem Verfahren auftreten. Zwei davon sind die folgenden:

  • Ein leeres wiederholtes Feld maskiert die Daten, die in den vereinfachten Feldern des gleichen Datensatzes enthalten sind.

  • Das Vorhandensein mehrerer wiederholter Felder kann zu einer Explosion der Anzahl erzeugter Zeilen führen.

Beispielsweise wertet SQL Server die Auflistung der im nicht relationalen JSON-Format gespeicherten Restaurants für das MongoDB-Beispieldataset aus. Jedes Restaurant verfügt über geschachtelte Adressfelder sowie ein Array von Schulnoten, die an verschiedenen Tagen vergeben wurden. In der Abbildung unten wird ein typisches Restaurant mit geschachtelter Adresse und geschachtelten-wiederholten Schulnoten dargestellt.

MongoDB flattening

Die Objektadresse wird wie unten dargestellt vereinfacht:

  • Das geschachtelte Feld restaurant.address.building wird zu restaurant.address_building.
  • Das geschachtelte Feld restaurant.address.coord wird zu restaurant.address_coord.
  • Das geschachtelte Feld restaurant.address.street wird zu restaurant.address_street.
  • Das geschachtelte Feld restaurant.address.zipcode wird zu restaurant.address_zipcode.

Die Arraynoten werden wie unten dargestellt vereinfacht:

grades_date grades_grade games_score
1393804800000 Ein 2
1378857600000 Ein 6
135898560000 Ein 10
1322006400000 Ein 9
1299715200000 B 14

Cosmos DB-Verbindung

Mithilfe der Cosmos DB-API und des PolyBase-Connectors für MongoDB können Sie eine externe Tabelle einer Cosmos DB-Instanz erstellen. Führen Sie dazu die oben genannten Schritte aus. Stellen Sie sicher, dass die datenbankweit gültigen Anmeldeinformationen, die Serveradresse, der Port und die Standortzeichenabfolge die des Cosmos DB-Servers widerspiegeln.

Beispiele

Im folgenden Beispiel wird eine externe Datenquelle mit den folgenden Parametern erstellt:

Parameter Wert
Name external_data_source_name
Dienst mongodb0.example.com
Instanz 27017
Replikatgruppe myRepl
TLS true
Pushdownberechnung On
CREATE EXTERNAL DATA SOURCE external_data_source_name
    WITH (LOCATION = 'mongodb://mongodb0.example.com:27017',
    CONNECTION_OPTIONS = 'replicaSet=myRepl; tls=true',
    PUSHDOWN = ON ,
    CREDENTIAL = credential_name);

Nächste Schritte

Weitere Informationen zu PolyBase finden Sie in der Übersicht zu SQL Server-PolyBase.