Integrazione di Discourse Data Explorer in Power BI

Integrazione di Discourse Data Explorer con Power BI

Di recente ho creato una funzione Power BI che recupera i dati da Data Explorer direttamente in Power BI con un sovraccarico minimo.

Quindi, se come me desideri che i dati vengano estratti e aggiornati automaticamente tramite l’app Power BI, ecco il codice della funzione da inserire nell’Editor Avanzato di Power BI:

(queryID) => let
        resultCount = 1000,
        otherNameForPage = 0,

        GetPage = (otherNameForPage) =>
            let
                content1 = "params={""page"":""" & Number.ToText(otherNameForPage) & """}",
                RawData = Json.Document(Web.Contents(
                    "https://forumURL/admin/plugins/explorer/queries",
                    [RelativePath=Number.ToText(queryID) & "/run",
                        Query=
                        [
                            params="{"page":"" & Number.ToText(otherNameForPage) & """}"
                        ],

                        Headers = [ 
                        #"api-username"="yourAPIUsername",
                        #"api-key"="yourAPIKey",
                        #"Content-Type" = "application/x-www-form-urlencoded"],
                        Content = Text.ToBinary(content1)
                    ]
                    
                ) ),
                resultCount = RawData[result_count]
            in
                if RawData[result_count] = 0 then null else RawData,
            Pages = List.Generate(
                () => [i = 0, RawData = GetPage(i)],
                each [RawData] <> null,
                each [i=[i]+1, RawData = GetPage(i)],
                each Table.Combine(let raw = [RawData] in List.Transform(raw[rows], each Table.FromRows({_}, raw[columns])))),
            Output = Table.Combine(Pages)
in
    Output

Ecco un esempio di query Data Explorer. Include la paginazione necessaria affinché la funzione sopra funzioni correttamente (è richiesta anche se la tua query restituisce solo una pagina):

--[params]
-- integer :page = 0

SELECT count(*) from badges

OFFSET :page * 1000
LIMIT 1000

(puoi adattare facilmente le tue query esistenti includendo la prima e l’ultima riga dell’esempio sopra)

Questa funzione continuerà automaticamente a iterare sulle pagine fino a quando non verranno trovati altri risultati.

Come farlo funzionare?

Dopo aver caricato la funzione in Power BI, dovrai impostare 2 cose:

  1. L’api-username e l’api-key (consulta la funzione sopra per i segnaposto):

                         Headers = [ 
                         #"api-username"="yourAPIUsername",
                         #"api-key"="yourAPIKey",
    
  2. Il numero ID della query.

    Per recuperare i tuoi dati, tutto ciò che devi fornire è l’ID della query, facile da trovare nell’URL della query:
    image

    Dopo aver fatto clic sulla funzione, in Power BI dovrebbe apparire così:

Esempio di output

Questo è l’output della query di esempio:

image

È tutto! Ora puoi modellare i tuoi dati come preferisci.

11 Mi Piace

Avevi troppo tempo libero a disposizione. :laughing:

Grazie comunque :slight_smile: molto utile.

2 Mi Piace

Per chi, come me, guarda Power BI e rimane confuso.

https://powerbi.microsoft.com/en-us/what-is-power-bi/

5 Mi Piace

Grazie a @loginerror per averlo fornito! Proverò a ottenere la stessa cosa in Tableau. Non sono sicuro che abbia un editor avanzato simile a quello offerto da Power BI, ma lo vedrò.

1 Mi Piace

Per gli altri come me che non conoscono Tableau.

https://www.tableau.com/

Ottieni una visione completa della tua azienda, interna ed esterna.
Connetti tutti i tuoi dati a fonti esterne critiche come lo stato della salute pubblica, gli indicatori economici e le politiche governative.


Da Wikipedia

I prodotti Tableau interrogano database relazionali, cubi di elaborazione analitica online, database cloud e fogli di calcolo per generare visualizzazioni grafiche dei dati. I prodotti possono anche estrarre, archiviare e recuperare dati da un motore dati in memoria.

1 Mi Piace

Ciao @loginerror, grazie per aver fornito questo!

Sto iniziando proprio ora con PowerBI e sarebbe un progetto divertente lavorare su una dashboard di Discourse. Grazie a te, potrei riuscire a compiere i primi passi e arrivare più velocemente alla parte divertente.

Ma per questo vorrei farti una domanda…
Ho provato ad eseguire la query suggerita utilizzando una nuova chiave API generata per il mio nome utente, ma per qualche motivo non riesco a farla funzionare.

Vedo che c’è qualcosa in corso su Discourse: indica che la chiave API è stata utilizzata, ma PowerBI esegue la query all’infinito senza fornire alcun dato.

Non sono per nulla esperto di query, quindi potrei star trascurando qualcosa di ovvio… Potresti aiutarmi?

Dovrebbe funzionare semplicemente collegandolo.

Hai provato a eseguirlo con la query di esempio che restituisce solo un valore?

--[params]
-- integer :page = 0

SELECT count(*) from badges

OFFSET :page * 1000
LIMIT 1000

Altrimenti, se hai un po’ più di pagine (e siamo limitati a 1000 record per pagina), potrebbe richiedere più tempo per caricare tutti i dati.

Ho appena testato il codice creando un progetto Power BI rapido con il codice del post originale e funziona perfettamente (sembra funzionare sia con una chiave API di sistema che con una chiave utente dotata di privilegi di amministratore).

4 Mi Piace

Oh, non sapevo che avessi risposto così velocemente, grazie!
Potrei sembrare un completo principiante, e probabilmente lo sono. Ma dove uso questo frammento di codice? Scusa, sono davvero nuovo di Power BI..

1 Mi Piace

Questa è una query di esempio per Data Explorer che dovresti salvare nel tuo plugin Data Explorer. È progettata per restituire solo 1 record, in modo da testare la funzione senza costringerla a scaricare grandi quantità di dati.

Successivamente, recupera il suo ID dall’URL e inseriscilo nella funzione Power BI creata dal codice del primo post:

/admin/plugins/explorer?id=260
1 Mi Piace

Ah, ora capisco! Grazie mille. Stavo solo guardando le cose dal punto di vista di Power BI… che sciocco :slight_smile:

Vedremo come andrà da qui.

Grazie ancora, ottimo lavoro.

1 Mi Piace

Aggiornamento rapido, nel caso qualcuno volesse migliorare lo script del primo post.

In realtà è possibile estrarre tutti i dati in un’unica operazione, apparentemente indipendentemente dalla quantità di dati :sweat_smile:
(Ho stressato il test su una tabella posts di dimensioni considerevoli con colonne id e raw ed è riuscito!)

Query di esempio:

SELECT      'id'
            || string_agg(E'\n' || case when posts.id::text is null then '-1' else posts.id::text end
            ,''
            ORDER BY posts.id asc) as value
FROM        posts

Quando la esegui, stamperà il tuo file quasi-CSV come un unico valore, quindi anche su una sola pagina. Dovrai quindi rimuovere il value" iniziale e un altro " alla fine per ottenere un CSV utile:

Naturalmente puoi aggiungere altri dati includendo una nuova colonna per il file CSV e i relativi dati:

SELECT      'id,newcolumn'
            || string_agg(E'\n' || case when posts.id::text is null then '-1' else posts.id::text end
            || string_agg(E'\n' || case when posts.newcolumn::text is null then '-1' else posts.newcolumn::text end
            ,''
            ORDER BY posts.id asc) as value
FROM        posts

Una volta aggiornato per supportare una query del genere, Power BI non avrebbe bisogno di attraversare più pagine, risultando in un recupero dei dati più veloce.

4 Mi Piace

Ciao! Sono relativamente nuovo su Power BI e molto nuovo su Discourse Data Explorer, quindi abbiate pazienza con me.

Sto cercando di connettermi: ho inserito l’URL del forum, il mio nome utente e la mia password nello script in alto. Ho eseguito lo script di test dei badge in Data Explorer. Tuttavia, quando provo a connettermi su Power BI, ottengo questo errore:

Mi connetto in modo anonimo perché, se provo qualsiasi altro livello di autorizzazione in Power BI, mi dice che i dati devono essere raccolti in modo anonimo.

Qualche consiglio?

In definitiva, sto cercando di connettere un gran numero dei nostri forum (diverse centinaia) a Power BI per ottenere le analisi. Se esiste un modo più semplice per farlo rispetto a farlo manualmente in questo modo, sarei felice di saperlo!

EDIT: Sono anche un po’ confuso riguardo alla query aggiornata per estrarre tutti i dati. Devo prima esportare come CSV? Questo non è un collegamento live?

1 Mi Piace

Non dovresti utilizzare le credenziali del tuo utente del Forum, ma una chiave API che puoi ottenere da Amministratore → API

Non inizierei con questo metodo prima di aver compreso quello originale, poiché è sostanzialmente un grande workaround per ottenere molti dati in una sola volta.

3 Mi Piace

Va bene!

Scusa, non so perché ho scritto password; intendevo chiave API e stavo pensando alla chiave API! Ho seguito quei passaggi per recuperarla e l’ho inserita nell’area che hai indicato nello script di PowerBI.

2 Mi Piace

Proverei prima di tutto con Postman per verificare se la chiamata API viene eseguita correttamente.

La chiamata API stessa è disponibile quando navighi alla pagina di query dell’esploratore dati nel tuo browser, apri la console di rete ed esegui la query. Il filtro XHR ti mostrerà tutti i parametri necessari che potrai quindi utilizzare in Postman per verificare che tutto funzioni correttamente.

2 Mi Piace

Si è scoperto che avevo un errore di battitura in Power BI, e questo stava causando il problema. Che sciocco! Ora funziona correttamente in Power BI; inizio il processo di estrazione di tutti o parte dei dati per iniziare a esaminarli.

2 Mi Piace

@loginerror - Mi chiedo se mi stia sfuggendo qualcosa di banale. (Sono molto nuovo di PowerBI, ma ho già realizzato alcuni dashboard di base basati su Excel)…

Mi dà continuamente problemi con le credenziali. So che sono corrette: le ho verificate con Postman. Mi chiedo se nella tua query debba in qualche modo rimuovere i simboli # o le virgolette attorno ai nomi dei parametri (ci ho provato, ma ho ottenuto numerosi errori di sintassi).

Penso di caricare tutto correttamente, anche se l’icona della tua query appare leggermente diversa dalla mia.



Se provo a inserire manualmente le credenziali, PowerBI continua a dirmi che devo inserire un nome in un campo che non mi viene mai fornito ;). Sono certo che non sia il modo corretto di utilizzare questo strumento, dato che non compare mai nei tuoi esempi sopra.

Potrebbe essere che ci sia un blocco a livello di rete da qualche altra parte, ma volevo prima escludere errori banali. Per favore, controlla se c’è qualcosa che non va e fammi sapere cosa ne pensi. Grazie.

Ciao @mattyoung,

Per Power BI, dovresti utilizzare le credenziali anonime. Questo perché la chiave API è già hard-coded nella funzione.

3 Mi Piace

Sono riuscito a farlo funzionare ora con la tua query di esempio, una nuova chiave API e un singolo utente associato a quella chiave API.

Elencherò alcuni errori che ho commesso e alcune aree confuse che non erano chiare per me… questo potrebbe aiutare anche altri, oltre a indicare quali sono i passaggi che effettivamente funzionano per me:

In Discourse, ho dovuto creare un’API e utilizzare un “Singolo utente” invece di “Tutti gli utenti” come API, specificando un nome utente reale.

In PowerBI, per utilizzare il sistema di query all’apertura di PowerBI, seleziona “Trasforma dati” per accedere all’area Power Query. Seleziona Nuova origine > Query vuota. Quando appare il cursore in un nuovo campo accanto a fx, dalla prima riga di pulsanti seleziona “Editor avanzato”, incolla la grande query fornita all’inizio di questo argomento, sostituendo il nome utente di Discourse e la chiave API già pronti. Seleziona Fatto. Apparirà un campo che chiede il tuo ID numero di query di Discourse. Inserisci il numero… e premi Invoca.

Apparirà un avviso iniziale che ti chiede di specificare come desideri autenticarti:

Seleziona Modifica credenziali.

Vedrai che questa è elencata come connessione “Anonima”, che è esattamente ciò che desideri. Lascia l’URL così com’è (purché sia un singolo URL senza sottodirectory elencate). In passato, stavo inserendo l’URL completo indicato nella query. Chiaramente, questo era un eccesso di pensiero da parte mia e un grande errore. :wink:

Dovresti vedere un output generato simile a questo e saprai che questa query di base ora funziona!

3 Mi Piace

Ciao! Sono di nuovo io!

Ho capito il metodo originale per estrarre i dati. Ho creato con successo diverse viste e le ho importate in Power BI. Evviva!

Tuttavia, ora sto riscontrando un problema di velocità. Sto cercando di importare solo i dati grezzi, quindi ad esempio uso SELECT * da user_visits/users/topics, ecc. Ho anche diversi forum. Attualmente sto testando con circa 15, ma l’aggiornamento sta diventando troppo lungo; ad esempio, con User Visits sono bloccato in un aggiornamento da un’ora.

In futuro importerò dati da centinaia di forum, quindi ovviamente questa soluzione non sarà sostenibile a lungo termine.

Sono davvero perso con il tuo workaround. Ho provato a modificarlo, ma non ha funzionato (principalmente perché non sono molto bravo a scrivere query SQL). Puoi aiutarmi a rielaborare il tuo workaround in modo che possa ottenere SELECT * FROM User_visits in modo più veloce?