Freigeben über


Umgang mit Transformationen

In Situationen, in denen die Datenquellenantwort nicht in einem Format dargestellt wird, das Power BI direkt nutzen kann, kann Power Query verwendet werden, um eine Reihe von Transformationen auszuführen.

Statische Transformationen

In den meisten Fällen stellt die Datenquelle die Daten einheitlich dar: Spaltennamen, Datentypen und hierarchische Struktur sind für einen bestimmten Endpunkt konsistent. In diesem Fall empfiehlt es sich, immer denselben Satz von Transformationen anzuwenden, um die Daten in einem für Power BI akzeptablen Format abzurufen.

Ein Beispiel für eine statische Transformation finden Sie im TripPin Teil 2 – Data Connector für ein REST-Dienst-Lernprogramm , wenn die Datenquelle als Standard-REST-Dienst behandelt wird:

let
    Source = TripPin.Feed("https://services.odata.org/v4/TripPinService/Airlines"),
    value = Source[value],
    toTable = Table.FromList(value, Splitter.SplitByNothing(), null, null, ExtraValues.Error),
    expand = Table.ExpandRecordColumn(toTable, "Column1", {"AirlineCode", "Name"}, {"AirlineCode", "Name"})
in
    expand

Die Transformationen in diesem Beispiel sind:

  1. Source ist ein Datensatz, der von einem Aufruf an TripPin.Feed(...)zurückgegeben wird.
  2. Sie ziehen den Wert aus einem der SourceSchlüsselwertpaare. Der Name des Schlüssels ist value, und Sie speichern das Ergebnis in einer Variablen namens value.
  3. value ist eine Liste, die Sie in eine Tabelle konvertieren. Jedes Element in value wird zu einer Zeile in der Tabelle, die Sie aufrufen toTablekönnen.
  4. Jedes Element in value selbst ist ein Datensatz. toTable hat alle diese in einer einzigen Spalte: "Column1". In diesem Schritt werden alle Daten mit Schlüssel "AirlineCode" in eine Spalte mit dem Namen "AirlineCode" und alle Daten mit Schlüssel "Name" in eine Spalte mit dem Namen "Name" aufgenommen, für jede Zeile in toTable. "Column1" wird durch diese beiden neuen Spalten ersetzt.

Am Ende des Tages verbleiben Sie mit Daten in einem einfachen tabellarischen Format, das Power BI nutzen und ganz einfach rendern kann:

Screenshot der Daten in tabellarischer Form.

Es ist wichtig zu beachten, dass eine Abfolge statischer Transformationen dieser Spezifität nur für einen einzelnen Endpunkt gilt. Im vorherigen Beispiel funktionieren diese Transformationen nur, wenn "AirlineCode" und "Name" in der REST-Endpunktantwort vorhanden sind, da sie im M-Code hartcodiert sind. Diese Sequenz von Transformationen funktioniert daher möglicherweise nicht, wenn Sie versuchen, den /Event Endpunkt zu erreichen.

Diese hohe Genauigkeit kann erforderlich sein, um Daten an eine Navigationstabelle zu übertragen. Für allgemeinere Datenzugriffsfunktionen wird jedoch empfohlen, dass Sie nur Transformationen ausführen, die für alle Endpunkte geeignet sind.

Hinweis

Testen Sie Transformationen unter verschiedenen Datenverhältnissen. Wenn der Benutzer keine Daten am /airlines Endpunkt hat, führen Ihre Transformationen zu einer leeren Tabelle mit dem richtigen Schema? Oder ist bei der Auswertung ein Fehler aufgetreten? Siehe TripPin Teil 7: Erweitertes Schema mit M-Typen für eine Diskussion zu Komponententests.

Dynamische Transformationen

Komplexere Logik ist manchmal erforderlich, um API-Antworten in stabile und konsistente Formulare zu konvertieren, die für Power BI-Datenmodelle geeignet sind.

Inkonsistente API-Antworten

Grundlegende M-Steuerungsflüsse (if-Anweisungen, HTTP-Statuscodes, try...catch-Blöcke usw.) reichen in der Regel aus, um Situationen zu behandeln, in denen es eine Handvoll Möglichkeiten gibt, auf die die API reagieren kann.

Bestimmen des Schemas im laufenden Betrieb

Einige APIs sind so konzipiert, dass mehrere Informationselemente kombiniert werden müssen, um das richtige tabellarische Format zu erhalten. Betrachten Sie die /sheetsEndpunktantwort von Smartsheet, die ein Array von Spaltennamen und ein Array von Datenzeilen enthält. Der Smartsheet Connector kann diese Antwort wie folgt analysieren:

raw = Web.Contents(...),
columns = raw[columns],
columnTitles = List.Transform(columns, each [title]),
columnTitlesWithRowNumber = List.InsertRange(columnTitles, 0, {"RowNumber"}),
                
RowAsList = (row) =>
    let
        listOfCells = row[cells],
        cellValuesList = List.Transform(listOfCells, each if Record.HasFields(_, "value") then [value]
                else null),
        rowNumberFirst = List.InsertRange(cellValuesList, 0, {row[rowNumber]})
    in
        rowNumberFirst,

listOfRows = List.Transform(raw[rows], each RowAsList(_)),
result = Table.FromRows(listOfRows, columnTitlesWithRowNumber)
  1. Zunächst die Informationen zu den Spaltenüberschriften bearbeiten. Sie können den title Datensatz jeder Spalte in eine Liste ziehen, indem Sie ihn mit einer RowNumber Spalte beginnen, die als diese erste Spalte immer dargestellt wird und Ihnen bekannt ist.
  2. Als Nächstes können Sie eine Funktion definieren, mit der Sie eine Zeile in eine Liste von Zellen valueanalysieren können. Sie können Informationen erneut voranstellen rowNumber.
  3. Wenden Sie Ihre RowAsList() Funktion auf jeden der rowin der API-Antwort zurückgegebenen Funktionen an.
  4. Konvertieren Sie die Liste in eine Tabelle, und geben Sie die Spaltenüberschriften an.