Hinweis
Für den Zugriff auf diese Seite ist eine Autorisierung erforderlich. Sie können versuchen, sich anzumelden oder das Verzeichnis zu wechseln.
Für den Zugriff auf diese Seite ist eine Autorisierung erforderlich. Sie können versuchen, das Verzeichnis zu wechseln.
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:
-
Sourceist ein Datensatz, der von einem Aufruf anTripPin.Feed(...)zurückgegeben wird. - Sie ziehen den Wert aus einem der
SourceSchlüsselwertpaare. Der Name des Schlüssels istvalue, und Sie speichern das Ergebnis in einer Variablen namensvalue. -
valueist eine Liste, die Sie in eine Tabelle konvertieren. Jedes Element invaluewird zu einer Zeile in der Tabelle, die Sie aufrufentoTablekönnen. - Jedes Element in
valueselbst ist ein Datensatz.toTablehat 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 intoTable."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:
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)
- Zunächst die Informationen zu den Spaltenüberschriften bearbeiten. Sie können den
titleDatensatz jeder Spalte in eine Liste ziehen, indem Sie ihn mit einerRowNumberSpalte beginnen, die als diese erste Spalte immer dargestellt wird und Ihnen bekannt ist. - 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 voranstellenrowNumber. - Wenden Sie Ihre
RowAsList()Funktion auf jeden derrowin der API-Antwort zurückgegebenen Funktionen an. - Konvertieren Sie die Liste in eine Tabelle, und geben Sie die Spaltenüberschriften an.