Discourse Data Explorer 与 Power BI 的集成

Discourse 数据探索器 Power BI 集成

我最近开发了一个很棒的 Power BI 函数,可以直接将数据探索器(Data Explorer)的数据获取到 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

这里有一个数据探索器查询示例。它包含了必需的分页功能,以便上述函数正常工作(即使您的查询只返回 1 页结果,这也是必需的):

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

SELECT count(*) from badges

OFFSET :page * 1000
LIMIT 1000

(您可以通过包含上述示例的第一行和最后一行,轻松适配您现有的查询)

此函数将自动继续迭代页面,直到找不到更多结果为止。

如何使其生效?

将函数加载到 Power BI 后,您需要设置两件事:

  1. api-username 和 api-key(请参阅上方函数中的占位符):

                         Headers = [ 
                         #"api-username"="yourAPIUsername",
                         #"api-key"="yourAPIKey",
    
  2. 查询 ID 编号。

    要获取您的数据,您只需提供查询的 ID,该 ID 很容易在查询 URL 中找到:
    image

    点击函数后,Power BI 中的显示应如下所示:

示例输出

这是示例查询的输出:

image

就是这样!现在您可以随意塑造您的数据了。

11 个赞

你太闲了。:laughing:

不过还是谢谢你 :slight_smile: 很有用。

2 个赞

对于那些像我一样看到 Power BI 感到困惑的人来说。

https://powerbi.microsoft.com/zh-cn/what-is-power-bi/

5 个赞

感谢 @loginerror 提供这个!我将在 Tableau 中尝试实现同样的功能。不确定它是否像 Power BI 那样提供类似的高级编辑器,但我会试试看。

1 个赞

对于像我这样不了解 Tableau 的人:

https://www.tableau.com/

全面掌握您企业的内外情况。
将所有数据与关键外部数据源(如公共卫生状况、经济指标和政府政策)连接起来。


来自 维基百科

Tableau 产品可查询 关系型数据库在线分析处理立方体云数据库电子表格,以生成图形类数据可视化。这些产品还可从内存数据引擎中提取、存储和检索数据。

1 个赞

@loginerror,感谢分享!

我刚开始接触 PowerBI,觉得做一个 Discourse 仪表盘会是个有趣的项目。多亏了你,我或许能完成初步步骤,更快进入有趣的环节。

不过,我想问一个问题……
我尝试使用刚生成的 API 密钥(关联我的用户名)运行建议的查询,但不知为何无法成功。

我看到 Discourse 上似乎有操作发生——它显示 API 密钥已被使用,但 PowerBI 却不断运行查询,没有返回任何数据。

我对查询完全不熟悉,可能忽略了某个明显的地方……能否请您帮忙?

插入后应能直接正常工作。

您是否尝试过使用仅返回单个值的示例查询来运行它?

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

SELECT count(*) from badges

OFFSET :page * 1000
LIMIT 1000

否则,如果您有更多分页(且每页限制为 1000 条记录),加载所有数据可能需要更长时间。

我刚刚使用原始帖子中的代码快速创建了一个 Power BI 项目并进行了测试,代码运行正常(似乎使用系统 API 密钥或具有管理员权限的用户密钥均可正常运行)。

4 个赞

哦,我没想到你回复得这么快——谢谢!
我可能完全是个新手,大概也确实如此。但这段代码该用在哪里呢?抱歉,我对 Power BI 真的很陌生。

1 个赞

这是一个示例数据资源管理器查询,您应将其保存到数据资源管理器插件中。该查询旨在仅返回 1 条记录,以便在不强制下载大量数据的情况下测试函数功能。

之后,从 URL 中获取其 ID,并将其填入由首帖代码创建的 Power BI 函数中:

/admin/plugins/explorer?id=260
1 个赞

啊,我明白了!非常感谢。我刚才只是从 Power BI 的角度来看这个问题……真有点傻 :slight_smile:

我会看看接下来进展如何。

再次感谢,内容很棒。

1 个赞

快速更新,以防有人想改进首帖中的脚本。

实际上,可以一次性提取所有数据,似乎与数据量大小无关::sweat_smile:
(我已在包含 idraw 列的大型 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 格式的文件作为一个值打印出来,因此所有内容都会显示在一页上。您随后只需去掉 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 数据探索器更是刚接触,请大家多多包涵。

我正在尝试连接,已在脚本顶部输入了我的论坛 URL、用户名和密码。我已在数据探索器中运行了“测试徽章”脚本。然而,当我尝试在 Power BI 中连接时,出现了以下错误:

我选择匿名连接,因为如果在 Power BI 中尝试其他任何权限,系统都会提示数据必须匿名收集。

有什么建议吗?

我最终的目标是将我们的大量论坛(数百个)连接到 Power BI,以便进行分析。如果除了这种手动方式之外还有更简便的方法,我也很乐意了解!

编辑:另外,我对用于提取所有数据的更新查询也有些困惑。我需要先将其导出为 CSV 吗?这是否不是一个实时链接?

1 个赞

您不应使用论坛用户凭据,而应使用可从“管理” → “API”获取的 API 密钥。

在理解原始方法之前,我不建议您先尝试这种方法,因为它本质上是一个巨大的变通方案,用于一次性获取大量数据。

3 个赞

说得对!

抱歉,我不知道为什么打成了“密码”,我指的是 API 密钥,我当时想的也是 API 密钥!我按照那些步骤获取了它,并将其插入到你指出的 PowerBI 脚本区域中。

2 个赞

我建议先使用 Postman 测试 API 调用是否能正常执行。

要获取 API 调用的具体信息,请在浏览器中导航至数据资源管理器查询页面,打开网络(Network)控制台并运行查询。XHR 过滤器将显示所有必需的参数,您可以将这些参数用于 Postman 以验证一切是否正常。

2 个赞

原来我在 Power BI 里有个拼写错误,导致了这个问题。真是粗心!现在 Power BI 已经正常运行了,接下来我将开始尝试提取全部或部分数据,以便开始筛选。

2 个赞

@loginerror - 我在想是否只是忽略了一些愚蠢的细节。(我是 PowerBI 的新手,但做过一些基于 Excel 的基本仪表板开发)……

凭证问题一直困扰着我。我知道凭证是正确的,我已经通过 Postman 验证过。我在想,在您的查询中,我是否必须移除参数名周围的 # 符号或引号(我尝试过,但得到了许多语法错误)。

我认为即使您的查询图标与我的略有不同,我也正确加载了所有内容。



如果我尝试手动输入凭证,PowerBI 会不断提示我必须在某个字段中输入名称,但该字段从未提供给我;)。我确信这也不是正确的使用方法,因为您的上述示例中从未出现过这种情况。

可能是我在网络的某个地方被阻止了,但我想先排除一些愚蠢的错误。请查看是否有任何地方看起来不对,并告诉我您的看法。谢谢。

你好 @mattyoung

对于 Power BI,您应选择匿名凭据。这是因为 API 密钥已硬编码在函数中。

3 个赞

我现在已经能够使用您的示例查询、新的 API 密钥以及仅针对该 API 密钥的单个用户使其正常工作了。

我将列出一些我犯过的错误,以及一些对我来说尚不清晰的困惑之处……这或许也能帮助其他人,并说明对我实际有效的步骤:

在 Discourse 中,我实际上需要创建一个 API,并使用“单个用户”(Single User)而非“所有用户”(All Users)的 API,并指定一个实际的用户名。

在 Power BI 中,要在进入 Power BI 时使用查询系统,请选择“转换数据”(Transform Data)以进入 Power Query 区域。选择“新建源”>“空白查询”。然后,当光标在 fx 旁边的新字段中显示时,从顶部的按钮行中选择“高级编辑器”(Advanced Editor),粘贴本主题开头提供的大段查询,并替换为您已有的 Discourse 用户名和 API 密钥。选择“完成”。此时会出现一个要求输入 Discourse 查询 ID 号的字段。输入该号码……然后点击“调用”(Invoke)。

首先会出现一个警告,要求您指定认证方式:

选择“编辑凭据”(Edit Credentials)。

您会看到此处被列为“匿名”(Anonymous)连接,这正是您需要的。请保持 URL 不变(只要它只是一个没有列出子目录的单一 URL 即可)。以前我曾在查询中输入完整的 URL。显然这是我多虑了,是一个大错误。:wink:

您应该会看到类似于以下内容的输出,这意味着这个基本查询现在可以正常工作了!

3 个赞

你好!又是我!

我已经理解了原始的数据提取方式。我成功创建了几个视图,并将它们导入到了 Power BI 中。太好了!

不过,现在我遇到了速度问题。我正试图仅提取原始数据,例如使用 Select * from user_visits/users/topics 等。我还有多个论坛。目前我正在测试大约 15 个论坛,但刷新时间已经变得过长,例如“用户访问”数据的刷新。目前,我已经等待刷新超过一个小时了。最终,我将从数百个论坛导入数据,显然这种方法从长远来看是不可行的。

对于您提供的变通方法,我确实感到困惑。我尝试过调整它,但没有成功(主要是因为我编写 SQL 查询的能力较弱)。您能帮我重新调整您的变通方法,让我能够更快地执行 Select * From User_visits 吗?