Condividi tramite


Gestione delle trasformazioni

Per le situazioni in cui la risposta all'origine dati non viene presentata in un formato utilizzabile direttamente da Power BI, è possibile usare Power Query per eseguire una serie di trasformazioni.

Trasformazioni statiche

Nella maggior parte dei casi, l'origine dati presenta i dati in modo coerente: i nomi delle colonne, i tipi di dati e la struttura gerarchica sono coerenti per un determinato endpoint. In questo caso, è opportuno applicare sempre lo stesso set di trasformazioni per ottenere i dati in un formato accettabile per Power BI.

Un esempio di trasformazione statica è disponibile nell'esercitazione TripPin Part 2 - Data Connector per un servizio REST quando l'origine dati viene considerata come un servizio REST standard:

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

Le trasformazioni in questo esempio sono:

  1. Source è un oggetto Record restituito da una chiamata a TripPin.Feed(...).
  2. Estrai il valore da una delle coppie chiave-valore di Source. Il nome della chiave è valuee si archivia il risultato in una variabile denominata value.
  3. value è un elenco, che si converte in una tabella. Ogni elemento in value diventa una riga nella tabella, che è possibile chiamare toTable.
  4. Ogni elemento in value è un oggetto Record. toTable include tutti questi elementi in una singola colonna: "Column1". Questo passaggio esegue il pull di tutti i dati con chiave "AirlineCode" in una colonna denominata "AirlineCode" e tutti i dati con chiave "Name" in una colonna denominata "Name", per ogni riga in toTable. "Column1" viene sostituito da queste due nuove colonne.

Alla fine del giorno, i dati vengono lasciati in un formato tabulare semplice che Power BI può usare e eseguire facilmente il rendering:

Screenshot dei dati in formato tabulare.

È importante notare che una sequenza di trasformazioni statiche di questa specificità è applicabile solo a un singolo endpoint. Nell'esempio precedente questa sequenza di trasformazioni funziona solo se "AirlineCode" ed "Name" esiste nella risposta dell'endpoint REST, perché sono hardcoded nel codice M. Pertanto, questa sequenza di trasformazioni potrebbe non funzionare se si tenta di raggiungere l'endpoint /Event .

Questo livello elevato di specificità potrebbe essere necessario per l'inserimento dei dati in una tabella di navigazione. Tuttavia, per funzioni di accesso ai dati più generali, è consigliabile eseguire solo trasformazioni appropriate per tutti gli endpoint.

Annotazioni

Assicurarsi di testare le trasformazioni in diverse circostanze dei dati. Se l'utente non dispone di dati nell'endpoint /airlines , le trasformazioni generano una tabella vuota con lo schema corretto? O si verifica un errore durante la valutazione? Per una discussione sui test unitari, vedere TripPin Part 7: Advanced Schema with M Types.

Trasformazioni dinamiche

A volte è necessaria una logica più complessa per convertire le risposte API in moduli stabili e coerenti appropriati per i modelli di dati di Power BI.

Risposte all'API incoerenti

Flussi di controllo M di base (istruzioni if, codici di stato HTTP, blocchi try...catch e così via) sono in genere sufficienti per gestire situazioni in cui l'API risponde in una manciata di modi.

Determinazione dello schema al volo

Alcune API sono progettate in modo che più informazioni debbano essere combinate per ottenere il formato tabulare corretto. Si consideri la risposta dell'endpoint di Smartsheet, che contiene un array di nomi di colonna e un array di righe di dati. Il connettore Smartsheet è in grado di analizzare questa risposta nel modo seguente:

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. Gestire prima le informazioni sull'intestazione di colonna. È possibile estrarre il record title di ogni colonna in una Lista, anteponendo una colonna RowNumber che sapete essere sempre rappresentata come questa prima colonna.
  2. Successivamente è possibile definire una funzione che consente di analizzare una riga in un elenco di celle value. È possibile nuovamente anteporre rowNumber le informazioni.
  3. Applicare la RowAsList() funzione a ognuno dei rowvalori restituiti nella risposta dell'API.
  4. Convertire l'elenco in una tabella, specificando le intestazioni di colonna.