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

You had too much free time on your hands. :laughing:

Thank you tho :slight_smile: very useful.

2 Mi Piace

For others like me who see Power BI and are confused.

5 Mi Piace

Dzięki @loginerror for providing that! I’ll be trying to achieve the same thing in Tableau. Not sure if it has similar advanced editor to what Power BI offers but will see

1 Mi Piace

For others like me who do not know about Tableau.

https://www.tableau.com/

Get a full picture of your business, inside and out.
Connect all of your data with critical external sources like public health status, economic indicators, and government policy.


From Wikipedia

Tableau products query relational databases, online analytical processing cubes, cloud databases, and spreadsheets to generate graph-type data visualizations. The products can also extract, store, and retrieve data from an in-memory data engine.

1 Mi Piace

hey @loginerror thanks for providing this!

I’m just getting into PowerBI and would be a fun project to work on a Discourse dashboard, and thanks to you I may be able to achieve the initial steps and get faster to the fun part.

But for this I’d like to ask a question…
I’ve tried to run the suggested query using a newly generated API key (to my user name) but can’t make it work for some reason.

I see that there is something going on Discourse - it indicates that the API key has been used but the PowerBI endlessly runs the query and doesn’t provide any data.

I’m not proficient in queries at all, so I may be missing something obvious… Could you please help?

It should simply work when plugged in.

Have you tried running it with the sample query that only returns one value?

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

SELECT count(*) from badges

OFFSET :page * 1000
LIMIT 1000

Otherwise, if you have a bit more pages (and we are limited to 1000 records per page), it might take longer to load all the data.

I’ve just tested the code by making a quick Power BI project with the code from the original post and it runs just fine (it seems to run just fine on either a System API key or a user one with admin permissions).

4 Mi Piace

Oh, I didn’t realize you answered so fast - thanks!
I may come as a complete noob, and probably that’s because I am. But where do I use this piece of code? Sorry, I’m really new to powerbi…

1 Mi Piace

This is a sample Data Explorer query you should save in your Data Explorer plugin. It is designed to only return 1 record, which should test out the function without forcing it to download a lot of data.

Afterwards, grab its ID from the URL and plug it in Power BI function created from the code from the first post:

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

Ah, I see now! Thanks so much. I was just looking at the things from Power BI point of view… how silly :slight_smile:

I’ll see how it goes from here.

Thanks again, great stuff.

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?