Discourse Data Explorer Power BI-Integration

Discourse Data Explorer Power BI-Integration

Ich habe kürzlich eine praktische Power BI-Funktion erstellt, die Daten aus dem Data Explorer mit minimalem Aufwand direkt nach Power BI abruft.

Wenn Sie also wie ich möchten, dass die Daten automatisch über die Power BI-App abgerufen und aktualisiert werden, finden Sie hier den Code der Funktion, den Sie im erweiterten Editor in Power BI einfügen sollten:

(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

Und hier ist eine Beispiel-Data-Explorer-Abfrage. Sie enthält eine erforderliche Paginierung, damit die oben genannte Funktion ordnungsgemäß funktioniert (diese ist erforderlich, selbst wenn Ihre Abfrage nur eine Seite zurückgibt):

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

SELECT count(*) from badges

OFFSET :page * 1000
LIMIT 1000

(Sie können Ihre vorhandenen Abfragen leicht anpassen, indem Sie die erste und letzte Zeile des obigen Beispiels einfügen.)

Diese Funktion iteriert automatisch über die Seiten, bis keine weiteren Ergebnisse mehr gefunden werden.

So funktioniert es?

Nachdem Sie die Funktion in Power BI geladen haben, müssen Sie zwei Dinge einstellen:

  1. Den api-username und api-key (siehe Funktion oben für die Platzhalter):

                         Headers = [ 
                         #"api-username"="yourAPIUsername",
                         #"api-key"="yourAPIKey",
    
  2. Die Abfrage-ID-Nummer.

    Um Ihre Daten abzurufen, müssen Sie lediglich die ID der Abfrage angeben, die Sie leicht in der Abfrage-URL finden:
    image

    Nach dem Klicken auf die Funktion sollte dies in Power BI so aussehen:

Beispieloutput

Dies ist die Ausgabe der Beispielabfrage:

image

Das war’s! Sie können Ihre Daten nun beliebig weiterverarbeiten.

11 „Gefällt mir“

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

Thank you tho :slight_smile: very useful.

2 „Gefällt mir“

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

5 „Gefällt mir“

Danke @loginerror für die Bereitstellung! Ich werde versuchen, dasselbe in Tableau zu erreichen. Ich bin mir nicht sicher, ob es einen ähnlichen erweiterten Editor wie bei Power BI gibt, aber ich werde es sehen.

1 „Gefällt mir“

Für andere wie mich, die nichts über Tableau wissen.

https://www.tableau.com/

Erhalten Sie einen vollständigen Überblick über Ihr Unternehmen, innen und außen.
Verbinden Sie alle Ihre Daten mit kritischen externen Quellen wie öffentlichem Gesundheitsstatus, Wirtschaftsindikatoren und Regierungspolitik.


Von Wikipedia

Tableau-Produkte fragen relationale Datenbanken, Online-Analyse-Verarbeitungswürfel, Cloud-Datenbanken und Tabellenkalkulationen ab, um grafische Datenvisualisierungen zu erstellen. Die Produkte können auch Daten aus einer In-Memory-Datenengine extrahieren, speichern und abrufen.

1 „Gefällt mir“

Hey @loginerror, danke, dass du das zur Verfügung gestellt hast!

Ich stecke gerade erst in PowerBI ein, und ein Discourse-Dashboard wäre ein spannendes Projekt. Dank dir könnte ich die ersten Schritte schaffen und schneller zum Spaßteil kommen.

Dazu hätte ich aber eine Frage…
Ich habe versucht, die vorgeschlagene Abfrage mit einem neu generierten API-Schlüssel (für meinen Benutzernamen) auszuführen, aber aus irgendeinem Grund funktioniert es nicht.

Ich sehe, dass auf Discourse etwas passiert – es wird angezeigt, dass der API-Schlüssel verwendet wurde, aber PowerBI führt die Abfrage endlos aus und liefert keine Daten.

Ich bin mit Abfragen überhaupt nicht vertraut, daher könnte mir etwas Offensichtliches entgangen sein… Könntest du bitte helfen?

Es sollte einfach funktionieren, sobald es eingesteckt ist.

Haben Sie es mit der Beispielfrage versucht, die nur einen Wert zurückgibt?

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

SELECT count(*) from badges

OFFSET :page * 1000
LIMIT 1000

Andernfalls, wenn Sie etwas mehr Seiten haben (und wir auf 1000 Datensätze pro Seite beschränkt sind), kann das Laden aller Daten länger dauern.

Ich habe den Code gerade getestet, indem ich ein schnelles Power BI-Projekt mit dem Code aus dem ursprünglichen Beitrag erstellt habe, und er läuft einwandfrei (es scheint sowohl mit einem System-API-Schlüssel als auch mit einem Benutzer-API-Schlüssel mit Administratorrechten einwandfrei zu funktionieren).

4 „Gefällt mir“

Oh, ich habe gar nicht gemerkt, dass du so schnell geantwortet hast – danke! Ich komme vielleicht wie ein absoluter Anfänger rüber, und wahrscheinlich bin ich das auch. Aber wo verwende ich diesen Code-Teil? Entschuldigung, ich bin wirklich neu bei Power BI.

1 „Gefällt mir“

Dies ist eine Beispiel-Data Explorer-Abfrage, die Sie in Ihrem Data Explorer-Plugin speichern sollten. Sie ist so konzipiert, dass sie nur einen Datensatz zurückgibt, wodurch die Funktion getestet werden kann, ohne dass große Datenmengen heruntergeladen werden müssen.

Anschließend können Sie die ID aus der URL kopieren und in die Power BI-Funktion einfügen, die aus dem Code im ersten Beitrag erstellt wurde:

/admin/plugins/explorer?id=260
1 „Gefällt mir“

Ah, jetzt verstehe ich! Vielen Dank. Ich habe die Dinge nur aus der Perspektive von Power BI betrachtet.. wie dumm :slight_smile:

Ich werde mal sehen, wie es weitergeht.

Nochmals vielen Dank, tolle Sache.

1 „Gefällt mir“

Kurzes Update, falls jemand das Skript aus dem ersten Beitrag verbessern möchte.

Es ist tatsächlich möglich, alle Daten auf einmal abzurufen, scheinbar unabhängig von der Datenmenge :sweat_smile:
(Ich habe dies an einer beträchtlichen posts-Tabelle mit den Spalten id und raw einem Stresstest unterzogen, und es hat funktioniert!)

Beispielabfrage:

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

Wenn Sie diese ausführen, wird Ihre fast-CSV-Datei als ein einziger Wert ausgegeben, also auch auf einer einzigen Seite. Sie müssten dann das value-Feld sowie ein weiteres " am Ende abschneiden, und es wird zu einer brauchbaren CSV:

Natürlich können Sie weitere Daten hinzufügen, indem Sie eine neue Spalte für die CSV-Datei und entsprechende Daten für diese Spalte hinzufügen:

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

Wenn Power BI so eine Abfrage unterstützt, muss es nicht mehr über mehrere Seiten iterieren, was zu einer schnelleren Datenabfrage führt.

4 „Gefällt mir“

Hallo! Ich bin relativ neu bei Power BI und noch ganz neu im Discourse Data Explorer, also habt bitte etwas Geduld.

Ich versuche eine Verbindung herzustellen. Ich habe meine Forum-URL, meinen Benutzernamen und mein Passwort oben im Skript eingegeben. Ich habe das Test-Badges-Skript im Data Explorer ausgeführt. Wenn ich jedoch versuche, eine Verbindung in Power BI herzustellen, erhalte ich diesen Fehler:

Ich verbinde anonym, da bei Versuch, andere Berechtigungen in Power BI zu nutzen, die Meldung erscheint, dass die Daten anonym gesammelt werden müssen.

Irgendwelche Tipps?

Letztendlich möchte ich eine ganze Reihe unserer Foren (mehrere hundert) mit Power BI verbinden, damit wir Analysen durchführen können. Falls es eine einfachere Möglichkeit gibt, dies nicht manuell wie hier zu tun, würde ich mich auch sehr über Hinweise freuen!

EDIT: Ich bin auch etwas verwirrt bezüglich der aktualisierten Abfrage zum Abrufen aller Daten. Muss ich zuerst als CSV exportieren? Ist dies kein Live-Link?

1 „Gefällt mir“

Du solltest keine Forum-Benutzerdaten verwenden, sondern einen API-Schlüssel, den du unter Admin → API abrufen kannst.

Ich würde diese Methode nicht bevor der ursprünglichen Methode verstehen, da es im Grunde eine riesige Umgehung ist, um viele Daten auf einmal zu erhalten.

3 „Gefällt mir“

Fair enough!

Entschuldigung, ich weiß nicht, warum ich ‘Passwort’ eingegeben habe. Ich meinte den API-Schlüssel und habe auch an den API-Schlüssel gedacht! Ich habe diese Schritte durchlaufen, um ihn zu erhalten, und ihn in den Bereich eingefügt, den Sie im PowerBI-Skript notiert haben.

2 „Gefällt mir“

Ich würde zunächst Postman verwenden, um zu prüfen, ob der API-Aufruf korrekt funktioniert.

Den API-Aufruf selbst finden Sie, indem Sie in Ihrem Browser zur Seite des Daten-Explorers navigieren, die Netzwerkkonsole öffnen und die Abfrage ausführen. Der XHR-Filter zeigt Ihnen alle erforderlichen Parameter an, die Sie dann in Postman verwenden können, um zu überprüfen, ob alles reibungslos funktioniert.

2 „Gefällt mir“

Es stellt sich heraus, dass ich in Power BI einen Tippfehler hatte, der das Problem verursacht hat. Wie dumm von mir! In Power BI funktioniert es jetzt einwandfrei. Jetzt beginne ich damit, alle oder Teile der Daten herauszufiltern, um sie zu sichten.

2 „Gefällt mir“

@loginerror – Ich frage mich, ob ich etwas Offensichtliches übersehe. (Ich bin noch sehr neu in Power BI, habe aber bereits einige grundlegende Excel-basierte Dashboards erstellt) …

Es gibt ständig Probleme mit den Zugangsdaten. Ich weiß, dass diese korrekt sind. Ich habe sie mit Postman überprüft. Ich frage mich, ob ich in Ihrer Abfrage die ‘#’ oder Anführungszeichen um die Parameternamen entfernen muss (ich habe es versucht, bekam aber zahlreiche Syntaxfehler).

Ich glaube, ich lade alles richtig hoch, obwohl Ihr Abfrage-Symbol etwas anders aussieht als meines.



Wenn ich versuche, die Zugangsdaten manuell einzugeben, sagt mir Power BI ständig, ich müsse einen Namen in ein Feld eingeben, das mir nie angezeigt wird ;). Ich bin mir sicher, dass das ohnehin nicht der richtige Weg ist, da dies in Ihren Beispielen oben nie vorkommt.

Es könnte sein, dass ich irgendwo in meinem Netzwerk blockiert bin, aber ich wollte zuerst lächerliche Fehler ausschließen. Bitte prüfen Sie, ob hier etwas falsch aussieht, und lassen Sie mich wissen, was Sie denken. Vielen Dank.

Hallo @mattyoung,

Für Power BI solltest du anonyme Anmeldeinformationen verwenden. Der Grund dafür ist, dass der API-Schlüssel bereits in der Funktion hart codiert ist.

3 „Gefällt mir“

Ich habe es nun mit Ihrer Beispielfrage und einem neuen API-Schlüssel sowie einem einzelnen Benutzer mit diesem API-Schlüssel zum Laufen gebracht.

Ich werde einige Fehler auflisten, die ich gemacht habe, und einige verwirrende Bereiche, die mir nicht klar waren – das könnte auch anderen helfen, sowie die Schritte, die bei mir tatsächlich funktionieren:

In Discourse musste ich tatsächlich eine API erstellen und eine „Single User" (Einzelner Benutzer) statt „All Users" (Alle Benutzer)-API verwenden und einen tatsächlichen Benutzernamen angeben.

In PowerBI müssen Sie, um das Abfragesystem bei der Eingabe in PowerBI zu nutzen, „Daten transformieren" auswählen, um in den Power Query-Bereich zu gelangen. Wählen Sie Neue Quelle > Leere Abfrage. Wenn dann Ihr Cursor in einem neuen Feld neben fx erscheint, wählen Sie in der oberen Zeile der Schaltflächen „Erweiterter Editor", fügen Sie die große Abfrage ein, die am Anfang dieses Themas angegeben ist, wobei Sie Ihren bereits ersetzten Discourse-Benutzernamen und API-Schlüssel verwendet haben. Wählen Sie „Fertig". Ein Feld, in dem Sie nach Ihrer Discourse-Abfrage-ID-Nummer gefragt werden, erscheint. Geben Sie die Nummer ein… und klicken Sie auf „Ausführen".

Eine erste Warnung erscheint und fragt Sie, wie Sie sich authentifizieren möchten:

Wählen Sie „Anmeldeinformationen bearbeiten".

Sie werden sehen, dass dies als „Anonyme" Verbindung aufgeführt ist, was genau das ist, was Sie wollen. Lassen Sie die URL unverändert (sofern es sich nur um eine einzelne URL ohne aufgeführte Unterverzeichnisse handelt). Früher habe ich die in der Abfrage aufgeführte vollständige URL eingegeben. Offensichtlich habe ich das überdacht und einen großen Fehler gemacht. :wink:

Sie sollten eine Ausgabe generiert sehen, die ähnlich wie diese aussieht, und Sie wissen dann, dass diese grundlegende Abfrage jetzt funktioniert!

3 „Gefällt mir“

Hallo! Ich bin’s wieder!

Ich habe die ursprüngliche Methode zum Abrufen von Daten verstanden. Ich habe erfolgreich mehrere Ansichten erstellt und sie in Power BI importiert. Hurra!

Allerdings habe ich jetzt ein Geschwindigkeitsproblem. Ich versuche, nur die Rohdaten zu laden, zum Beispiel mit SELECT * FROM user_visits, users, topics usw. Ich habe auch mehrere Foren. Momentan teste ich mit etwa 15, aber die Aktualisierung wird immer länger – zum Beispiel dauert die Aktualisierung für „User Visits" bereits seit einer Stunde. Irgendwann werde ich Daten aus Hunderten von Foren importieren, und das wird auf Dauer offensichtlich nicht funktionieren.

Ich bin bei Ihrer Lösung jedoch völlig ratlos. Ich habe versucht, sie anzupassen, aber es hat nicht funktioniert (hauptsächlich, weil ich SQL-Abfragen eher schlecht schreibe). Können Sie mir helfen, Ihre Lösung so umzuarbeiten, dass ich beispielsweise SELECT * FROM user_visits schneller abrufen kann?