Håndtering af transformationer

I situationer, hvor datakildesvaret ikke præsenteres i et format, som Power BI kan bruge direkte, kan Power Query bruges til at udføre en række transformationer.

Statiske transformationer

I de fleste tilfælde præsenterer datakilden dataene på en ensartet måde: kolonnenavne, datatyper og hierarkisk struktur er konsistente for et bestemt slutpunkt. I denne situation er det hensigtsmæssigt altid at anvende det samme sæt transformationer for at hente dataene i et format, der er acceptabelt for Power BI.

Du kan finde et eksempel på statisk transformation i selvstudiet TripPin Part 2 – Data Connector for en REST Service , når datakilden behandles som en standard REST-tjeneste:

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

Transformationerne i dette eksempel er:

  1. Source er en post, der returneres fra et opkald til TripPin.Feed(...).
  2. Du trækker værdien fra et af Source's nøgleværdipar. Navnet på nøglen er value, og du gemmer resultatet i en variabel kaldet value.
  3. value er en liste, som du konverterer til en tabel. Hvert element i value bliver til en række i tabellen, som du kan kalde toTable.
  4. Hvert element er i value sig selv en optegnelse. toTable har alle disse i en enkelt kolonne: "Column1". Dette trin trækker alle data med nøgle "AirlineCode" ind i en kolonne kaldet "AirlineCode" og alle data med nøgle "Name" til en kolonne kaldet "Name", for hver række i toTable. "Column1" erstattes af disse to nye kolonner.

Når dagen er omme, står du tilbage med data i et simpelt tabelformat, som Power BI kan bruge og nemt gengive:

Skærmbillede af dataene i tabelform.

Det er vigtigt at bemærke, at en sekvens af statiske transformationer af denne specificitet kun gælder for et enkelt slutpunkt. I det forrige eksempel fungerer denne sekvens af transformationer kun, hvis "AirlineCode" og "Name" findes i REST-slutpunktssvaret, da de er hårdkodet i M-koden. Derfor fungerer denne sekvens af transformationer muligvis ikke, hvis du forsøger at ramme slutpunktet /Event .

Dette høje niveau af specificitet kan være nødvendigt for at overføre data til en navigationstabel. Men for mere generelle dataadgangsfunktioner anbefaler vi, at du kun udfører transformationer, der er relevante for alle slutpunkter.

Notat

Sørg for at teste transformationer under forskellige dataomstændigheder. Hvis brugeren ikke har nogen data på slutpunktet /airlines , resulterer dine transformationer så i en tom tabel med det korrekte skema? Eller opstår der en fejl under evalueringen? Se TripPin del 7: Avanceret skema med M-typer for en diskussion om enhedstest.

Dynamiske transformationer

Nogle gange er der behov for mere kompleks logik for at konvertere API-svar til stabile og konsistente formularer, der er relevante for Power BI-datamodeller.

Inkonsekvente API-svar

Grundlæggende M-kontrolflow (hvis sætninger, HTTP-statuskoder, prøve... catch blocks osv.) er typisk tilstrækkelige til at håndtere situationer, hvor der er en håndfuld måder, hvorpå API'en reagerer.

Bestemmelse af skema påThe-Fly

Nogle API'er er designet således, at flere oplysninger skal kombineres for at få det korrekte tabelformat. Overvej Smartsheets /sheets, som indeholder en matrix af kolonnenavne og en matrix af datarækker. Smartsheet Connector er i stand til at analysere dette svar på følgende måde:

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. Først skal du håndtere kolonneoverskriftsoplysninger. Du kan trække posten title for hver kolonne ind i en liste og indlede med en RowNumber kolonne, som du ved altid er repræsenteret som denne første kolonne.
  2. Dernæst kan du definere en funktion, der giver dig mulighed for at fortolke en række til en liste over celler values. Du kan igen sætte rowNumber oplysninger foran.
  3. Anvend din RowAsList() funktion på hver af de rows, der returneres i API-svaret.
  4. Konverter listen til en tabel, og angiv kolonneoverskrifterne.