Spracovanie transformácií

V situáciách, keď sa odpoveď zdroja údajov nezobrazuje vo formáte, ktorý môže Power BI využívať priamo, možno použiť Power Query na vykonanie série transformácií.

Statické transformácie

Vo väčšine prípadov sú údaje prezentované konzistentným spôsobom zdrojom údajov: názvy stĺpcov, typy údajov a hierarchická štruktúra sú pre daný koncový bod konzistentné. V takejto situácii je vhodné vždy použiť rovnakú množinu transformácií na získanie údajov vo formáte prijateľnom pre službu Power BI.

Príklad statickej transformácie nájdete v kurze TripPin 2 – Data Pripojenie or pre službu REST Service, keď sa zdroj údajov považuje za štandardnú službu REST:

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

Transformácie v tomto príklade sú:

  1. Source je záznam vrátený z volania do TripPin.Feed(...)funkcie .
  2. Hodnotu načítate z jedného z Sourcepárov kľúč-hodnota. Názov kľúča je value, a výsledok uložíte do premennej s názvom value.
  3. value Je to zoznam, ktorý konvertujete na tabuľku. Každý prvok v value tabuľke sa stane riadkom, ktorý môžete volať toTable.
  4. Každý prvok v value je sám o sebe Záznam. toTable obsahuje všetky tieto položky v jednom stĺpci: "Column1". Tento krok vytiahne všetky údaje pomocou kľúča "AirlineCode" do stĺpca s názvom "AirlineCode" a všetky údaje s kľúčom "Name" do stĺpca s názvom "Name", pre každý riadok v toTable. "Column1" hodnota sa nahradí týmito dvomi novými stĺpcami.

Na konci dňa, keď budete mať údaje v jednoduchom tabuľkovom formáte, ktorý služba Power BI dokáže používať a jednoducho vykresliť:

Data in tabular form.

Je dôležité poznamenať, že postupnosť statických transformácií tejto špecifickosti sa vzťahuje len na jeden koncový bod. V príklade uvedenom vyššie bude táto postupnosť transformácií fungovať "AirlineCode" iba vtedy a "Name" bude existovať v odpovedi koncového bodu REST, pretože sú pevne zakódované do kódu jazyka M. Táto postupnosť transformácií preto nemusí fungovať, ak sa pokúsite zasiahnuť /Event koncový bod.

Táto vysoká úroveň špecifickosti môže byť potrebná na presunutie údajov do navigačnej tabuľky. V prípade všeobecnejších funkcií prístupu k údajom sa však odporúča vykonať len transformácie, ktoré sú vhodné pre všetky koncové body.

Poznámka

Nezabudnite otestovať transformácie za rôznych okolností údajov. Ak používateľ nemá v koncovom /airlines bode žiadne údaje, majú transformácie za následok prázdnu tabuľku so správnou schémou? Alebo sa počas hodnotenia vyskytne chyba? Pozrite si tému TripPin 7. časť: Rozšírená schéma s typmi jazyka M, kde nájdete diskusiu o testovaní zariadenia.

Dynamické transformácie

Niekedy je potrebná zložitejšia logika na konvertovanie odpovedí rozhrania API na stabilné a konzistentné formuláre vhodné pre dátové modely Power BI.

Nekonzistentné odpovede rozhrania API

Základný tok riadenia jazyka M (ak príkazy, kódy stavu HTTP, skúste... bloky zachytenia atď.) sú zvyčajne dostatočné na zvládnutie situácií, v ktorých existuje niekoľko spôsobov, akými rozhranie API reaguje.

Určenie schémy za behu

Niektoré rozhrania API sú navrhnuté tak, aby sa viaceré informácie museli skombinovať, aby sa získal správny formát tabuľky. Zvážte odpoveď koncového /sheetsbodu služby Smartsheet, ktorá obsahuje pole názvov stĺpcov a pole údajových riadkov. Pripojenie alebo Smartsheet je schopný analyzovať túto odpoveď týmto spôsobom:

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. Najprv sa vysporiadať s informáciami o hlavičke stĺpca. Záznam každého stĺpca môžete načítať title do zoznamu. Čaká sa RowNumber na pridanie stĺpca, o ktorému viete, že ho budete vždy zobrazovať ako prvý stĺpec.
  2. Ďalej môžete definovať funkciu, ktorá vám umožní analyzovať riadok v zozname buniek value. Znova môžete na server odoslať rowNumber informácie.
  3. Použite svoju RowAsList() funkciu na každú z rowhodnôt vrátených v odpovedi rozhrania API.
  4. Konvertujte zoznam na tabuľku s určením hlavičiek stĺpcov.