Intégration de Discourse Data Explorer avec Power BI

Intégration de Discourse Data Explorer avec Power BI

J’ai récemment créé une fonction Power BI intéressante qui récupère les données de Data Explorer directement dans Power BI avec un surcoût minimal.

Ainsi, si vous êtes comme moi et que vous souhaitez que les données soient automatiquement extraites et actualisées via l’application Power BI, voici le code de la fonction que vous devez placer dans l’Éditeur avancé de 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

Et voici une requête d’explorateur de données d’exemple. Elle inclut la pagination requise pour que la fonction ci-dessus fonctionne correctement (elle est requise même si votre requête ne renvoie qu’une seule page) :

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

SELECT count(*) from badges

OFFSET :page * 1000
LIMIT 1000

(vous pouvez facilement adapter vos requêtes existantes en incluant les deux premières et les deux dernières lignes de l’exemple ci-dessus)

Cette fonction continuera automatiquement d’itérer sur les pages jusqu’à ce qu’aucun résultat supplémentaire ne soit trouvé.

Comment le faire fonctionner ?

Après avoir chargé la fonction dans Power BI, vous devrez configurer deux éléments :

  1. Le nom d’utilisateur de l’API et la clé API (voir la fonction ci-dessus pour les espaces réservés) :

                         Headers = [ 
                         #"api-username"="yourAPIUsername",
                         #"api-key"="yourAPIKey",
    
  2. Le numéro d’ID de la requête.

    Pour récupérer vos données, tout ce que vous devez fournir est l’ID de la requête, facile à trouver dans l’URL de la requête :
    image

    Cela devrait ressembler à ceci dans Power BI après avoir cliqué sur la fonction :

Résultat d’exemple

Voici le résultat de la requête d’exemple :

image

C’est tout ! Vous pouvez maintenant modeler vos données comme vous le souhaitez.

11 « J'aime »

Tu avais trop de temps libre. :laughing:

Merci quand même :slight_smile: très utile.

2 « J'aime »

Pour les autres comme moi qui découvrent Power BI et qui sont perdus.

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

5 « J'aime »

Merci à @loginerror pour cela ! Je vais essayer de faire la même chose dans Tableau. Je ne sais pas s’il dispose d’un éditeur avancé similaire à celui que propose Power BI, mais nous verrons bien.

1 « J'aime »

Pour les autres comme moi qui ne connaissent pas Tableau.

https://www.tableau.com/

Obtenez une vue complète de votre entreprise, en interne et en externe.
Connectez toutes vos données à des sources externes critiques telles que l’état de santé publique, les indicateurs économiques et les politiques gouvernementales.


D’après Wikipedia

Les produits Tableau interrogent les bases de données relationnelles, les cubes d’analyse en ligne (OLAP), les bases de données cloud et les tableurs pour générer des visualisations de données de type graphique. Les produits peuvent également extraire, stocker et récupérer des données à partir d’un moteur de données en mémoire.

1 « J'aime »

Salut @loginerror, merci de nous avoir fourni cela !

Je commence tout juste à m’intéresser à PowerBI et cela serait un projet amusant de travailler sur un tableau de bord Discourse. Grâce à toi, je pourrais peut-être accomplir les premières étapes et accéder plus rapidement à la partie intéressante.

Mais pour cela, j’aimerais poser une question…
J’ai essayé d’exécuter la requête suggérée en utilisant une clé API nouvellement générée (pour mon nom d’utilisateur), mais elle ne fonctionne pas pour une raison quelconque.

Je vois qu’il se passe quelque chose sur Discourse : il indique que la clé API a été utilisée, mais PowerBI exécute la requête indéfiniment sans fournir de données.

Je ne suis pas du tout compétent en requêtes, il est donc possible que j’aie manqué quelque chose d’évident… Pourrais-tu s’il te plaît m’aider ?

Cela devrait simplement fonctionner une fois branché.

Avez-vous essayé de l’exécuter avec la requête d’exemple qui ne renvoie qu’une seule valeur ?

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

SELECT count(*) from badges

OFFSET :page * 1000
LIMIT 1000

Sinon, si vous avez un peu plus de pages (et que nous sommes limités à 1000 enregistrements par page), il se peut que le chargement de toutes les données prenne plus de temps.

Je viens de tester le code en créant un projet Power BI rapide avec le code issu du message original, et il fonctionne parfaitement (il semble fonctionner aussi bien avec une clé d’API système qu’avec une clé utilisateur disposant de permissions d’administrateur).

4 « J'aime »

Oh, je ne réalisais pas que vous répondiez si vite — merci !
Je peux paraître comme un complet débutant, et c’est probablement parce que je le suis. Mais où dois-je utiliser ce bout de code ? Désolé, je suis vraiment nouveau dans Power BI..

1 « J'aime »

Voici un exemple de requête Data Explorer que vous devez enregistrer dans votre plugin Data Explorer. Il est conçu pour ne renvoyer qu’un seul enregistrement, ce qui permet de tester la fonction sans la forcer à télécharger une grande quantité de données.

Ensuite, récupérez son ID à partir de l’URL et insérez-le dans la fonction Power BI créée à partir du code du premier message :

/admin/plugins/explorer?id=260
1 « J'aime »

Ah, je vois maintenant ! Merci beaucoup. Je regardais simplement les choses du point de vue de Power BI… comme c’est bête :slight_smile:

Je verrai comment cela évolue à partir d’ici.

Encore merci, excellent travail.

1 « J'aime »

Mise à jour rapide, au cas où quelqu’un souhaiterait améliorer le script du premier message.

Il est en fait possible de récupérer toutes les données en une seule fois, apparemment indépendamment du volume de données :sweat_smile:
(J’ai effectué des tests de charge sur une table posts de taille conséquente avec les colonnes id et raw, et cela a fonctionné !)

Requête d’exemple :

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

Lorsque vous l’exécutez, elle affichera votre fichier quasi CSV comme une seule valeur, donc sur une seule page. Vous devrez ensuite supprimer le value" et un autre " à la fin pour obtenir un CSV exploitable :

Vous pouvez naturellement ajouter plus de données en ajoutant une nouvelle colonne pour le fichier CSV et les données correspondantes pour cette colonne :

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

Une fois mis à jour pour prendre en charge une telle requête, Power BI n’aura plus besoin de parcourir plusieurs pages, ce qui accélérera la récupération des données.

4 « J'aime »

Bonjour ! Je débute à peine sur Power BI et je suis tout nouveau sur l’Explorateur de données Discourse, alors merci de votre indulgence.

J’essaie de me connecter : j’ai saisi l’URL de mon forum, mon nom d’utilisateur et mon mot de passe dans le script en haut. J’ai exécuté le script de test des badges dans l’Explorateur de données. Cependant, lorsque j’essaie de me connecter dans Power BI, j’obtiens cette erreur :

Je me connecte de manière anonyme, car si j’essaie n’importe quelle autre autorisation dans Power BI, il indique que les données doivent être collectées de manière anonyme.

Avez-vous des conseils ?

Je cherche finalement à connecter un grand nombre de nos forums (plusieurs centaines) à Power BI afin de pouvoir bénéficier des analyses. S’il existe un moyen plus simple de le faire que manuellement comme je le fais actuellement, je serais ravi de l’entendre !

EDIT : Je suis également un peu confus quant à la requête mise à jour pour extraire toutes les données. Dois-je d’abord exporter en CSV ? Ce n’est pas un lien en direct ?

1 « J'aime »

Vous ne devriez pas utiliser vos identifiants de compte du forum, mais une clé API que vous pouvez récupérer dans Admin → API

Je ne commencerais pas par cette méthode avant de comprendre la méthode originale, car il s’agit essentiellement d’une grosse solution de contournement pour obtenir beaucoup de données d’un coup.

3 « J'aime »

C’est logique !

Désolé, je ne sais pas pourquoi j’ai tapé « mot de passe », je voulais dire « clé API » et c’est bien ce à quoi je pensais ! J’ai suivi ces étapes pour la récupérer et je l’ai insérée dans la zone que vous avez indiquée dans le script PowerBI.

2 « J'aime »

Je commencerais par utiliser Postman pour vérifier si l’appel API s’exécute correctement.

L’appel API lui-même peut être trouvé lorsque vous naviguez vers la page de requête de l’explorateur de données dans votre navigateur, ouvrez la console Réseau et exécutez la requête. Le filtre XHR vous présentera tous les paramètres requis que vous pourrez ensuite utiliser dans Postman pour vérifier que tout se passe bien.

2 « J'aime »

Il s’avère que j’avais fait une faute de frappe dans Power BI, ce qui causait le problème. Quelle bêtise ! Tout fonctionne correctement dans Power BI maintenant. Je commence donc le processus pour extraire la totalité ou une partie des données afin de pouvoir commencer à les examiner.

2 « J'aime »

@loginerror - Je me demande si je ne passe pas à côté d’une erreur évidente. (Je débute tout juste avec PowerBI, mais j’ai déjà réalisé quelques tableaux de bord basés sur Excel) …

Je rencontre continuellement des problèmes avec les identifiants. Je sais qu’ils sont corrects. Je les ai vérifiés via Postman. Je me demande, dans votre requête, si je dois en quelque sorte retirer les # ou les guillemets autour des noms de paramètres (j’ai essayé mais j’ai obtenu de nombreuses erreurs de syntaxe).

Je pense que je charge tout correctement, même si l’icône de requête dans votre cas ressemble légèrement à la mienne.



Si j’essaie de saisir manuellement les identifiants, PowerBI me dit continuellement que je dois entrer un nom dans un champ qu’ils ne me fournissent jamais ;). Je suis sûr que ce n’est pas la bonne façon d’utiliser cela de toute façon, car cela n’apparaît jamais dans vos exemples ci-dessus.

Il se peut que je sois simplement bloqué quelque part sur mon réseau, mais je voulais d’abord écarter les erreurs évidentes. Veuillez vérifier si quelque chose ici semble incorrect et faites-moi savoir ce que vous en pensez. Merci.

Bonjour @mattyoung,

Pour Power BI, choisissez les identifiants anonymes. En effet, la clé API est déjà codée en dur dans la fonction.

3 « J'aime »

J’ai réussi à faire fonctionner cela maintenant avec votre requête d’exemple, une nouvelle clé API et un seul utilisateur associé à cette clé API.

Je vais énumérer certaines erreurs que j’ai commises et des zones confuses qui n’étaient pas claires pour moi… cela pourrait aider d’autres personnes, ainsi que les étapes qui fonctionnent réellement pour moi :

Dans Discourse, j’ai dû créer une API et utiliser un « Utilisateur unique » (Single User) et non « Tous les utilisateurs » (All Users), en spécifiant un nom d’utilisateur réel.

Dans PowerBI, pour utiliser le système de requêtes lors de l’ouverture de PowerBI, sélectionnez « Transformer les données » pour accéder à l’interface Power Query. Sélectionnez Nouvelle source > Requête vide. Ensuite, lorsque le curseur apparaît dans un nouveau champ à côté de fx, dans la rangée supérieure de boutons, sélectionnez « Éditeur avancé » et collez la grande requête fournie au début de ce sujet, avec votre nom d’utilisateur Discourse et votre clé API déjà remplacés. Cliquez sur Terminé. Un champ vous demandera votre numéro d’ID de requête Discourse. Saisissez le numéro… puis cliquez sur Exécuter.

Un avertissement initial apparaîtra vous demandant de spécifier comment vous souhaitez vous authentifier :

Sélectionnez Modifier les informations d’identification.

Vous verrez que cela est répertorié comme une connexion « Anonyme », ce qui est ce que vous souhaitez. Laissez l’URL telle quelle (tant qu’il s’agit d’une seule URL sans sous-répertoires listés). Auparavant, je mettais l’URL complète indiquée dans la requête. Clairement, c’était une suranalyse de ma part et une grosse erreur. :wink:

Vous devriez voir une sortie générée similaire à celle-ci, et vous saurez que cette requête de base fonctionne maintenant !

3 « J'aime »

Bonjour ! C’est encore moi !

J’ai compris la méthode originale pour extraire les données. J’ai réussi à créer plusieurs vues et à les importer dans Power BI. Super !

Cependant, je rencontre maintenant un problème de vitesse. J’essaie d’importer uniquement les données brutes, donc par exemple, j’utilise SELECT * FROM user_visits/users/topics, etc. J’ai également plusieurs forums. Actuellement, je teste avec environ 15 forums, mais l’actualisation commence à devenir beaucoup trop longue, par exemple pour les visites des utilisateurs. Je suis actuellement bloqué sur une actualisation depuis plus d’une heure. À terme, je vais devoir importer des données provenant de centaines de forums, donc cette solution ne fonctionnera pas à long terme.

Je suis vraiment perdu avec votre solution de contournement. J’ai essayé de l’ajuster, mais cela n’a pas fonctionné (principalement parce que je suis assez mauvais pour écrire des requêtes SQL). Pouvez-vous m’aider à retravailler votre solution de contournement pour que je puisse obtenir un SELECT * FROM user_visits plus rapidement ?