Transformaties verwerken

In situaties waarin het antwoord van de gegevensbron niet wordt weergegeven in een indeling die Power BI rechtstreeks kan gebruiken, kunnen Power Query worden gebruikt om een reeks transformaties uit te voeren.

Statische transformaties

In de meeste gevallen worden de gegevens consistent gepresenteerd door de gegevensbron: kolomnamen, gegevenstypen en hiërarchische structuur zijn consistent voor een bepaald eindpunt. In dit geval is het geschikt om altijd dezelfde set transformaties toe te passen om de gegevens op te halen in een indeling die acceptabel is voor Power BI.

Een voorbeeld van statische transformatie vindt u in de zelfstudie TripPin Part 2 - Data Connector for a REST Service wanneer de gegevensbron wordt behandeld als een standaard REST-service:

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

De transformaties in dit voorbeeld zijn:

  1. Source is een record die wordt geretourneerd door een aanroep naar TripPin.Feed(...) .
  2. U haalt de waarde op uit Source een van de sleutel-waardeparen. De naam van de sleutel is value en u kunt het resultaat opslaan in een variabele met de naam value .
  3. value is een lijst die u converteert naar een tabel. Elk element in value wordt een rij in de tabel, die u kunt aanroepen. toTable
  4. Elk element in value is zelf een Record. toTable heeft al deze in één kolom: "Column1" . Met deze stap worden alle gegevens met de sleutel in een kolom met de naam en alle gegevens met een sleutel in een kolom met de naam "AirlineCode" voor elke rij in "AirlineCode" "Name" "Name" toTable opgeslagen. "Column1" wordt vervangen door deze twee nieuwe kolommen.

Aan het einde van de dag ziet u gegevens in een eenvoudige tabelvorm die u Power BI kunt gebruiken en eenvoudig kunt renderen:

Gegevens in tabelvorm.

Het is belangrijk te weten dat een reeks statische transformaties van deze specificiteit alleen van toepassing is op één eindpunt. In het bovenstaande voorbeeld werkt deze reeks transformaties alleen als en aanwezig zijn in het antwoord van het REST-eindpunt, omdat ze in code zijn gecodeerd in de "AirlineCode" "Name" M-code. Deze reeks transformaties werkt dus mogelijk niet als u het /Event eindpunt probeert te raken.

Deze hoge mate van specifiekheid kan nodig zijn voor het pushen van gegevens naar een navigatietabel, maar voor meer algemene functies voor gegevenstoegang is het raadzaam om alleen transformaties uit te voeren die geschikt zijn voor alle eindpunten.

Notitie

Zorg ervoor dat u transformaties onder verschillende gegevensomstandigheden test. Als de gebruiker geen gegevens op het eindpunt heeft, resulteren uw transformaties dan in een lege /airlines tabel met het juiste schema? Of is er een fout opgetreden tijdens de evaluatie? Zie TripPin Deel 7: Geavanceerd schema met M-typen voor een discussie over eenheidstests.

Dynamische transformaties

Soms is complexere logica nodig om API-antwoorden te converteren naar stabiele en consistente formulieren die geschikt zijn Power BI gegevensmodellen.

Inconsistente API-antwoorden

Eenvoudige M-controlestroom (if-instructies, HTTP-statuscodes, probeer het... catch-blokken, en meer, zijn doorgaans voldoende voor het afhandelen van situaties waarin er een aantal manieren zijn waarop de API reageert.

Schema on-the-fly bepalen

Sommige API's zijn zodanig ontworpen dat meerdere stukjes informatie moeten worden gecombineerd om de juiste tabelindeling te krijgen. Overweeg het eindpuntreactie /sheets [van]Smartsheet, dat een matrix met kolomnamen en een matrix met gegevensrijen bevat. De Smartsheet-connector kan dit antwoord op de volgende manier parseren:

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. Begin eerst met kolomkopinformatie. U kunt de record van elke kolom in een lijst opnemen, afhankelijk van een kolom die altijd wordt weergegeven title RowNumber als deze eerste kolom.
  2. Vervolgens kunt u een functie definiëren waarmee u een rij kunt parseren in een lijst met cel value s. U kunt opnieuw informatie rowNumber voorbereiden.
  3. Pas uw RowAsList() functie toe op elk van de s die in het row API-antwoord worden geretourneerd.
  4. Converteer de lijst naar een tabel en geef de kolomkoppen op.