Nota
L'accesso a questa pagina richiede l'autorizzazione. È possibile provare ad accedere o modificare le directory.
L'accesso a questa pagina richiede l'autorizzazione. È possibile provare a modificare le directory.
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:
-
Sourceè un oggetto Record restituito da una chiamata aTripPin.Feed(...). - Estrai il valore da una delle coppie chiave-valore di
Source. Il nome della chiave èvaluee si archivia il risultato in una variabile denominatavalue. -
valueè un elenco, che si converte in una tabella. Ogni elemento invaluediventa una riga nella tabella, che è possibile chiamaretoTable. - Ogni elemento in
valueè un oggetto Record.toTableinclude 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 intoTable."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:
È 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)
- Gestire prima le informazioni sull'intestazione di colonna. È possibile estrarre il record
titledi ogni colonna in una Lista, anteponendo una colonnaRowNumberche sapete essere sempre rappresentata come questa prima colonna. - Successivamente è possibile definire una funzione che consente di analizzare una riga in un elenco di celle
value. È possibile nuovamente anteporrerowNumberle informazioni. - Applicare la
RowAsList()funzione a ognuno deirowvalori restituiti nella risposta dell'API. - Convertire l'elenco in una tabella, specificando le intestazioni di colonna.