Интеграция Data Explorer для Discourse с Power BI

Интеграция Discourse Data Explorer с 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

А вот пример запроса Data Explorer. Он включает пагинацию, которая необходима для корректной работы функции выше (она требуется даже если ваш запрос возвращает только одну страницу):

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

SELECT count(*) from badges

OFFSET :page * 1000
LIMIT 1000

(вы можете легко адаптировать свои существующие запросы, добавив первую и последнюю строки из примера выше)

Эта функция будет автоматически перебирать страницы, пока не будут получены все результаты.

Как это настроить?

После загрузки функции в Power BI вам нужно настроить два параметра:

  1. Имя пользователя API (api-username) и ключ API (api-key) (см. плейсхолдеры в функции выше):

                         Headers = [ 
                         #"api-username"="yourAPIUsername",
                         #"api-key"="yourAPIKey",
    
  2. Номер ID запроса.

    Для получения данных вам нужно указать только ID запроса, который легко найти в URL запроса:
    image

    После нажатия на функцию в Power BI это должно выглядеть так:

Пример результата

Это результат выполнения примера запроса:

image

Всё готово! Теперь вы можете преобразовывать свои данные так, как вам нужно.

11 лайков

У тебя было слишком много свободного времени. :laughing:

Спасибо всё равно :slight_smile: очень полезно.

2 лайка

Для тех, кто, как и я, видит Power BI и не понимает, что это такое.

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

5 лайков

Спасибо @loginerror за это! Я попробую сделать то же самое в Tableau. Не уверен, есть ли у него аналогичный продвинутый редактор, как в Power BI, но посмотрим.

1 лайк

Для тех, кто, как и я, не знаком с Tableau.

https://www.tableau.com/

Получите полную картину вашего бизнеса, как изнутри, так и снаружи.
Объедините все ваши данные с важными внешними источниками, такими как показатели общественного здравоохранения, экономические индикаторы и государственная политика.


Из Википедии

Продукты Tableau выполняют запросы к реляционным базам данных, OLAP-кубам, облачным базам данных и электронным таблицам для создания визуализаций данных в виде графиков. Продукты также могут извлекать, хранить и получать данные из памяти с использованием собственного движка данных.

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 лайк

Это пример запроса в Data Explorer, который следует сохранить в вашем плагине Data Explorer. Он разработан так, чтобы возвращать только одну запись, что позволяет протестировать функцию без необходимости скачивать большой объем данных.

Затем скопируйте её ID из URL и вставьте его в функцию Power BI, созданную на основе кода из первого сообщения:

/admin/plugins/explorer?id=260
1 лайк

Ах, теперь я понял! Большое спасибо. Я просто смотрел на вещи с точки зрения Power BI… как же глупо :slight_smile:

Посмотрим, как всё сложится дальше.

Ещё раз спасибо, отличная работа.

1 лайк

Быстрое обновление, на случай если кто-то захочет улучшить скрипт из первого поста.

На самом деле можно извлечь все данные за один раз, и это, похоже, не зависит от объёма данных :sweat_smile:
(Я провёл стресс-тест на достаточно крупной таблице posts с колонками id и raw, и скрипт справился!)

Пример запроса:

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 Data Explorer, так что прошу меня понять.

Я пытаюсь подключиться: ввёл URL форума, имя пользователя и пароль в скрипт вверху. Запустил скрипт проверки бейджей в Data Explorer. Однако при попытке подключения в Power BI получаю эту ошибку:

Подключаюсь анонимно, потому что при попытке использовать любые другие разрешения в Power BI появляется сообщение о том, что данные должны собираться анонимно.

Есть какие-нибудь советы?

В конечном счёте я хочу подключить к Power BI множество наших форумов (несколько сотен), чтобы получить аналитику. Если есть более простой способ сделать это, чем вручную, как сейчас, буду рад узнать о нём!

РЕДАКТИРОВАНИЕ: Также я немного запутался из-за обновлённого запроса для извлечения всех данных. Нужно ли сначала экспортировать данные в CSV? Это не живая ссылка?

1 лайк

Вам не следует использовать учётные данные форума, а вместо этого — ключ API, который можно получить в разделе Администрирование → API.

Я бы не стал начинать с этого метода, пока не разберётесь с исходным, поскольку это по сути один большой обходной путь для получения большого объёма данных за один раз.

3 лайка

Справедливо!

Извините, не знаю, почему я ввёл «пароль» — я имел в виду ключ API, и именно о нём думал! Я прошёл указанные шаги, чтобы его получить, и вставил в то место, которое вы отметили в скрипте PowerBI.

2 лайка

Сначала попробуйте использовать Postman, чтобы проверить, проходит ли вызов API корректно.

Сам вызов API можно найти, перейдя на страницу запросов в обозревателе данных в вашем браузере, открыв консоль сети и запустив запрос. Фильтр XHR покажет вам все необходимые параметры, которые вы затем сможете использовать в Postman для проверки успешности выполнения.

2 лайка

Оказывается, у меня в Power BI была опечатка, и это вызывало проблему. Какая же я неуклюжая! Теперь в Power BI всё работает правильно, и я приступаю к процессу извлечения всех данных или их частей, чтобы начать их анализировать.

2 лайка

@loginerror — Мне интересно, не упускаю ли я какую-то очевидную мелочь. (Я очень новичок в PowerBI, но уже работал с простыми дашбордами на базе Excel)…

Постоянно возникают проблемы с учётными данными. Я знаю, что они верны — проверил их через Postman. Подскажите, нужно ли в вашем запросе как-то убрать символы # или кавычки вокруг имён параметров (пытался, но получил множество ошибок синтаксиса).

Кажется, я загружаю всё правильно, хотя иконка запроса у вас выглядит немного иначе, чем у меня.



Если я пытаюсь ввести учётные данные вручную, PowerBI постоянно сообщает, что нужно ввести имя в поле, которое мне никогда не показывают ;). Уверен, что это неправильный способ использования, тем более что такого поля нет в ваших примерах выше.

Возможно, проблема в блокировке на моей сети где-то ещё, но сначала хотел исключить очевидные ошибки. Посмотрите, пожалуйста, нет ли здесь чего-то неправильного, и напишите, что вы думаете. Спасибо.

Привет @mattyoung

Для Power BI используйте анонимные учетные данные. Это связано с тем, что ключ API уже зашит в функцию.

3 лайка

Мне удалось заставить это работать с вашим примером запроса, новым API-ключом и одним пользователем, привязанным к этому ключу.

Я перечислю некоторые ошибки, которые я допускал, и некоторые неясные моменты, которые были для меня непонятны… это может помочь другим, а также описать шаги, которые действительно сработали у меня:

В Discourse мне фактически пришлось создать API и использовать «Одного пользователя» (Single User), а не «Всех пользователей» (All Users), и указать конкретное имя пользователя.

В PowerBI, чтобы использовать систему запросов при входе в PowerBI, выберите «Преобразовать данные» (Transform Data), чтобы перейти в область Power Query. Выберите «Новый источник» > «Пустой запрос» (Blank Query). Затем, когда курсор появится в новом поле рядом с fx, из верхней строки кнопок выберите «Расширенный редактор» (Advanced Editor), вставьте большой запрос, приведенный в начале этой темы, предварительно заменив в нём имя пользователя Discourse и API-ключ. Нажмите «Готово» (Done). Появится поле, запрашивающее ваш номер ID запроса Discourse. Введите номер… и нажмите «Выполнить» (Invoke).

Появится начальное предупреждение с просьбой указать способ аутентификации:

Выберите «Изменить учетные данные» (Edit Credentials).

Вы увидите, что это соединение указано как «Анонимное» (Anonymous), что именно вам и нужно. Оставьте URL без изменений (при условии, что это просто один URL без перечисленных подкаталогов). Ранее я вводил полный URL, указанный в запросе. Очевидно, я слишком усложнил задачу и совершил большую ошибку. :wink:

Вы должны увидеть сгенерированный вывод, похожий на этот, и тогда вы поймёте, что этот базовый запрос теперь работает!

3 лайка

Привет! Это снова я!

Я понял, как изначально извлекать данные. Я успешно создал несколько представлений и импортировал их в Power BI. Ура!

Однако теперь я столкнулся с проблемой скорости. Я пытаюсь загрузить только необработанные данные, поэтому, например, использую SELECT * FROM user_visits/users/topics и т.д. У меня также есть несколько форумов. В настоящее время я тестирую около 15, но обновление начало занимать слишком много времени, например, в случае с данными о посещениях пользователей. Сейчас обновление уже длится больше часа.

В конечном итоге я планирую импортировать данные из сотен форумов, так что такой подход явно не сработает в долгосрочной перспективе.

Я совершенно растерян относительно вашего обходного пути. Я пытался его адаптировать, но у меня не получилось (в основном потому, что я довольно слабо пишу SQL-запросы). Не могли бы вы помочь мне переделать ваш обходной путь, чтобы я мог, например, быстрее получать данные через SELECT * FROM user_visits?