Discourse Data Explorer Power BI 連携

Discourse Data Explorer と Power BI の連携

最近、Discourse の Data Explorer からデータを最小限のオーバーヘッドで直接 Power BI に取得する、便利な Power BI 関数を作成しました。

もしあなたが私と同じように、Power BI アプリを通じてデータを自動的に取得・更新したいと考えているなら、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

また、以下はサンプルの Data Explorer クエリです。上記の関数が正しく機能するためには、ページネーションが必須となります(クエリが 1 ページしか返さない場合でも必要です)。

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

SELECT count(*) from badges

OFFSET :page * 1000
LIMIT 1000

(既存のクエリも、上記の最初の 2 行と最後の 2 行を追加するだけで簡単に適応できます)

この関数は、結果がなくなるまで自動的にページを反復処理し続けます。

動作させるには?

Power BI にこの関数をロードした後、以下の 2 点を設定する必要があります。

  1. api-username と api-key の設定(上記の関数内のプレースホルダーを参照):

                         Headers = [ 
                         #"api-username"="yourAPIUsername",
                         #"api-key"="yourAPIKey",
    
  2. クエリ ID の設定。

    データを取得するには、クエリ URL で簡単に確認できるクエリ ID を指定するだけです。
    image

    Power BI で関数をクリックした後、以下のように表示されるはずです。

サンプル出力

これはサンプルクエリの出力結果です。

image

これで完了です!あとはお好みのようにデータを整形して利用できます。

「いいね!」 11

時間が余りすぎたんですね。:laughing:

でもありがとう :slight_smile: とても役立ちました。

「いいね!」 2

Power BI を見て混乱している、私のような方のために。

https://powerbi.microsoft.com/ja-jp/what-is-power-bi/

「いいね!」 5

@loginerror さん、ありがとうございます!私も Tableau で同じことを実現してみたいと思います。Power BI が提供する高度なエディタと似た機能が Tableau にもあるかどうかわかりませんが、試してみます。

「いいね!」 1

Tableau について詳しくない方のために。

https://www.tableau.com/

社内外のビジネス全体を把握できます。
公衆衛生状況、経済指標、政府政策などの重要な外部データソースと、すべてのデータを接続できます。


Wikipedia より

Tableau の製品は、関係データベースオンライン分析処理キューブクラウドデータベーススプレッドシート にクエリを実行して、グラフ形式のデータ可視化を生成します。また、これらの製品は、メモリ内データエンジンからデータを抽出、保存、取得することもできます。

「いいね!」 1

@loginerror さん、ありがとうございます!

Power BI の使い方を始めたばかりなので、Discourse のダッシュボードを作成するのは楽しいプロジェクトになりそうです。あなたのおかげで、最初のステップを踏み出し、すぐに楽しい部分に進めるかもしれません。

ただ、一つ質問があります…
新しく生成した API キー(自分のユーザー名用)を使って提案されたクエリを実行してみましたが、何らかの理由で動作しません。

Discourse 側では何かが動いているようです。API キーが使用されたことを示す表示はありますが、Power BI はクエリを無限に実行し続け、データを提供してくれません。

クエリには全く詳しくないので、何か明らかな見落としがあるのかもしれません…お手伝いいただけませんか?

プラグインするだけで動作するはずです。

1 つの値のみを返すサンプルクエリで実行を試みましたか?

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

SELECT count(*) from badges

OFFSET :page * 1000
LIMIT 1000

それ以外の場合、ページ数が少し多い場合(1 ページあたりのレコード数は 1000 に制限されています)、すべてのデータを読み込むのに時間がかかる可能性があります。

元の投稿のコードを使用して素早く Power BI プロジェクトを作成し、コードをテストしましたが、問題なく動作しました(システム API キーでも、管理者権限を持つユーザーキーでも問題なく動作しているようです)。

「いいね!」 4

あっ、こんなに早くお答えいただいているなんて気づきませんでした。ありがとうございます!
私が完全に初心者だからかもしれませんが、このコードはどこで使うのでしょうか?すみません、Power BIは本当に初めてなんです。

「いいね!」 1

これは、Data Explorer プラグインに保存するべきサンプルの Data Explorer クエリです。大量のデータをダウンロードさせることなく関数をテストできるよう、1 件のレコードのみを返すように設計されています。

その後、URL から ID を取得し、最初の投稿のコードから作成した Power BI 関数に設定してください:

/admin/plugins/explorer?id=260
「いいね!」 1

ああ、今わかりました!ありがとうございます。Power BI の視点から見ていただけで、なんてばかな :slight_smile:

これからどうなるか見てみます。

またしてもありがとうございます。素晴らしい内容ですね。

「いいね!」 1

最初の投稿のスクリプトを改善したい方のために、簡単な更新情報です。

実は、データの量に関係なく、一度にすべてのデータを取得することが可能です :sweat_smile:
(id カラムと raw カラムを持つそれなりのサイズの posts テーブルでストレステストしましたが、問題なく動作しました!)

サンプルクエリ:

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

これを実行すると、ほぼ CSV 形式のファイルが 1 つの値として出力され、1 ページに収まります。その後、value の先頭と末尾の " を削除すれば、そのまま使える CSV になります:

もちろん、CSV ファイルに新しいカラムを追加し、そのカラムに対応するデータを追加することで、さらに多くのデータを取得できます:

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

このようなクエリに対応するように更新すれば、Power BI が複数のページを横断する必要がなくなり、データの取得が高速化されます。

「いいね!」 4

こんにちは!Power BI は最近使い始めたばかりで、Discourse Data Explorer はさらに初心者です。ご容赦ください。

接続を試みていますが、スクリプトの冒頭にフォーラムの URL、ユーザー名、パスワードを入力しました。Data Explorer で「test badges」スクリプトを実行しました。しかし、Power BI で接続しようとすると、次のエラーが表示されます:

匿名で接続しています。Power BI で他の権限を試みると、「データは匿名で収集される必要があります」と表示されるためです。

何かヒントはありませんか?

最終的には、数百あるフォーラム全体を Power BI に接続して分析データを取得したいと考えています。このように手動で行うよりも簡単な方法があれば、ぜひ教えてください!

編集:すべてのデータを取得するための更新されたクエリについても少し混乱しています。まず CSV としてエクスポートする必要がありますか?これはライブリンクではないのでしょうか?

「いいね!」 1

フォーラムのユーザー認証情報を使うのではなく、管理者パネルの「API」セクションから取得できる API キーを使用してください。

この方法は、大量のデータを一度に取得するための大きな回避策に過ぎないため、元の仕組みを理解する前にこの方法から始めるのはお勧めしません。

「いいね!」 3

なるほど!

申し訳ありません。なぜ「password」と入力してしまったのか自分でもわかりません。「API キー」のつもりでしたし、考えてもいたのは「API キー」です!その手順に従って取得し、PowerBI スクリプトで指摘いただいた箇所に挿入しました。

「いいね!」 2

まず、Postman を使って API リクエストが正しく送信されるか確認することをお勧めします。

API リクエスト自体は、ブラウザでデータエクスプローラーのクエリページに移動し、ネットワークコンソールを開いてクエリを実行することで確認できます。XHR フィルターを使用すると、必要なパラメータがすべて表示されるため、これらを Postman で使用して、すべてが正常に動作するか検証できます。

「いいね!」 2

Power BI にタイプミスがあったことが判明し、それが問題の原因でした。私なんて!Power BI では正常に動作するようになったので、今からデータをすべて、または一部を抽出して精査し始める作業に取り掛かります。

「いいね!」 2

@loginerror - 単に些細な見落としをしているだけではないかと疑問に思っています(Power BI はごく初心者ですが、Excel ベースの簡易ダッシュボード作成は経験があります)…

認証情報(credents)の問題で常にエラーになります。認証情報は正しいと確信しています。Postman で確認済みです。クエリ内で、パラメータ名の前後にある # や " を何らかの方法で削除する必要があるのかと考えています(試しましたが、多数の構文エラーが発生しました)。

クエリアイコンが私のものと少し異なっていますが、すべて正しく読み込めているつもりです。



もし手動で認証情報を入力しようとすると、Power BI が「入力欄に名前を入力してください」と繰り返し伝えてきますが、その入力欄は実際には提供されません ;)。そもそも、上記の例ではその入力欄は表示されないため、これは使い方が間違っているのだと思います。

もしかすると、私のネットワーク上でどこかでブロックされているのかもしれませんが、まずは些細なエラーを排除したくて投稿しました。ここに何か間違っている箇所があれば指摘し、ご意見を聞かせてください。よろしくお願いいたします。

@mattyoung さん、こんにちは

Power BI の場合は、匿名認証を選択してください。API キーがすでに関数内にハードコードされているためです。

「いいね!」 3

サンプルクエリと新しい API キー、そしてその API キーを持つ単一のユーザーを使って、ようやく動作させることができました。

私が犯した間違いや、私にとって不明瞭だった混乱する点についていくつか挙げます。これらが他の皆様にも役立つかもしれません。また、実際に私が機能した手順も記載します。

Discourse では、「All Users」API ではなく「Single User」API を作成し、実際のユーザー名を指定する必要がありました。

Power BI では、Power BI を起動してクエリシステムを使用するには、「Transform Data」を選択して Power Query エリアに入る必要があります。「New Source」>「Blank Query」を選択します。すると fx の横に新しいフィールドにカーソルが表示されるので、上部のボタン列から「Advanced Editor」を選択し、このトピックの冒頭で提供された大きなクエリを貼り付けます(すでに Discourse のユーザー名と API キーに置き換えておいてください)。「Done」を選択します。Discourse クエリ ID 番号を入力するフィールドが表示されるので、番号を入力し「Invoke」を押します。

認証方法を指定するよう求める初期の警告が表示されます。

「Edit Credentials」を選択します。

これは「Anonymous」接続としてリストされていることが確認できるはずです。これが目的とする設定です。URL はそのままにしてください(サブディレクトリがリストされていない単一の URL である限り)。以前は、クエリに記載されていた完全な URL を入力していました。明らかにこれは私の考えすぎであり、大きな間違いでした。:wink:

以下のような出力が生成され、この基本的なクエリが正常に動作していることが確認できるはずです。

「いいね!」 3

こんにちは!また登場です!

データの抽出元のやり方は理解できました。いくつかのビューを作成し、Power BI にインポートすることに成功しました。やったー!

ただ、今は速度の問題に直面しています。生データだけを抽出しようとしていて、例えば SELECT * FROM user_visits/users/topics などをしています。また、いくつかのフォーラムもあります。現在は約 15 のフォーラムでテストしていますが、更新が非常に長くなりすぎています。例えば「User Visits」の更新では、現在 1 時間以上経過しても終わっていません。将来的には数百のフォーラムからデータをインポートする予定なので、このままでは長期的には通用しません。

さて、あなたのワークアラウンドについては本当に困っています。調整してみましたが、うまくいきませんでした(主に SQL クエリの作成があまり得意ではないためです)。あなたのワークアラウンドを改良して、SELECT * FROM User_visits をより素早く取得できるように手助けしていただけませんか?