Integración de Discourse Data Explorer con Power BI

Integración de Power BI con Discourse Data Explorer

Recientemente creé una función útil de Power BI que recupera datos de Data Explorer directamente en Power BI con una sobrecarga mínima.

Por lo tanto, si eres como yo y deseas que los datos se extraigan y actualicen automáticamente a través de la aplicación Power BI, aquí tienes el código de la función que debes colocar en el Editor Avanzado 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

Y aquí tienes una consulta de ejemplo de Data Explorer. Incluye la paginación necesaria para que la función anterior funcione correctamente (es necesaria incluso si tu consulta devuelve solo 1 página):

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

SELECT count(*) from badges

OFFSET :page * 1000
LIMIT 1000

(puedes adaptar fácilmente tus consultas existentes incluyendo las dos primeras y las dos últimas líneas del ejemplo anterior)

Esta función continuará iterando automáticamente sobre las páginas hasta que no se encuentren más resultados.

¿Cómo hacerlo funcionar?

Después de cargar la función en Power BI, necesitarás configurar 2 cosas:

  1. El nombre de usuario de la API y la clave de la API (consulta la función anterior para ver los marcadores de posición):

                         Headers = [ 
                         #"api-username"="yourAPIUsername",
                         #"api-key"="yourAPIKey",
    
  2. El número de ID de la consulta.

    Para obtener tus datos, todo lo que debes proporcionar es el ID de la consulta, que es fácil de encontrar en la URL de la consulta:
    image

    Esto debería verse así en Power BI después de hacer clic en la función:

Salida de ejemplo

Esta es la salida de la consulta de ejemplo:

image

¡Eso es todo! Ahora puedes dar forma a tus datos como quieras.

11 Me gusta

Tenías demasiado tiempo libre. :laughing:

Gracias de todos modos :slight_smile: muy útil.

2 Me gusta

Para otros como yo que ven Power BI y se confunden.

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

5 Me gusta

¡Gracias a @loginerror por proporcionarlo! Voy a intentar lograr lo mismo en Tableau. No estoy seguro de si tiene un editor avanzado similar al que ofrece Power BI, pero lo veré.

1 me gusta

Para otros como yo que no conocen Tableau.

https://www.tableau.com/

Obtenga una visión completa de su negocio, por dentro y por fuera.
Conecte todos sus datos con fuentes externas críticas como el estado de salud pública, indicadores económicos y políticas gubernamentales.


De Wikipedia

Los productos de Tableau consultan bases de datos relacionales, cubos de procesamiento analítico en línea, bases de datos en la nube y hojas de cálculo para generar visualizaciones de datos de tipo gráfico. Los productos también pueden extraer, almacenar y recuperar datos de un motor de datos en memoria.

1 me gusta

¡Hola @loginerror, gracias por compartir esto!

Estoy empezando con PowerBI y me encantaría trabajar en un panel de control de Discourse como proyecto. Gracias a ti, quizás pueda dar los primeros pasos y llegar más rápido a la parte divertida.

Pero para ello, me gustaría hacerte una pregunta…
He intentado ejecutar la consulta sugerida usando una clave de API recién generada (para mi nombre de usuario), pero por alguna razón no funciona.

Veo que algo está ocurriendo en Discourse: indica que la clave de API ha sido utilizada, pero PowerBI ejecuta la consulta indefinidamente y no proporciona ningún dato.

No soy nada experto en consultas, así que quizás me esté perdiendo algo obvio… ¿Podrías ayudarme, por favor?

Debería funcionar simplemente al conectarlo.

¿Has probado ejecutarlo con la consulta de ejemplo que solo devuelve un valor?

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

SELECT count(*) from badges

OFFSET :page * 1000
LIMIT 1000

De lo contrario, si tienes más páginas (y estamos limitados a 1000 registros por página), podría tardar más en cargar todos los datos.

Acabo de probar el código creando un proyecto rápido de Power BI con el código del post original y funciona perfectamente (parece funcionar bien tanto con una clave de API del sistema como con una de usuario con permisos de administrador).

4 Me gusta

¡Oh, no sabía que responderías tan rápido, gracias!
Puede que parezca un completo novato, y probablemente lo sea. Pero, ¿dónde uso este fragmento de código? Lo siento, soy realmente nuevo en Power BI.

1 me gusta

Esta es una consulta de ejemplo del Explorador de Datos que debes guardar en tu complemento Explorador de Datos. Está diseñada para devolver solo 1 registro, lo que permitirá probar la función sin obligarla a descargar grandes cantidades de datos.

Después, obtén su ID de la URL e insértala en la función de Power BI creada a partir del código del primer mensaje:

/admin/plugins/explorer?id=260
1 me gusta

¡Ah, ya lo veo! Muchas gracias. Solo estaba mirando las cosas desde el punto de vista de Power BI… ¡qué tonto :slight_smile:

Veré cómo evoluciona a partir de aquí.

Gracias de nuevo, gran trabajo.

1 me gusta

Actualización rápida, por si alguien quiere mejorar el script del primer mensaje.

De hecho, es posible extraer todos los datos de una sola vez, aparentemente independientemente de la cantidad de datos :sweat_smile:
(¡Lo sometí a pruebas de estrés en una tabla posts considerable con columnas id y raw y lo logró!)

Consulta de ejemplo:

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

Al ejecutarla, imprimirá tu archivo casi en formato CSV como un único valor, es decir, en una sola página. Luego solo necesitarás recortar el value" y otro " al final, y tendrás un CSV útil:

Por supuesto, puedes añadir más datos agregando una nueva columna para el archivo CSV y los datos correspondientes a esa columna:

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

Al actualizarlo para admitir dicha consulta, Power BI no tendría que recorrer múltiples páginas, lo que resultaría en una recuperación de datos más rápida.

4 Me gusta

¡Hola! Soy nuevo en Power BI y muy nuevo en el Discourse Data Explorer, así que tengan paciencia conmigo.

Estoy intentando conectarme; he ingresado la URL de mi foro, mi nombre de usuario y mi contraseña en el script de la parte superior. He ejecutado el script de prueba de insignias en el Data Explorer. Sin embargo, cuando intento conectarme en Power BI, obtengo este error:

Me conecto de forma anónima porque, si intento cualquiera de los otros permisos en Power BI, dice que los datos deben recopilarse de forma anónima.

¿Alguna sugerencia?

Finalmente, estoy intentando conectar un montón de nuestros foros (varios cientos) a Power BI para poder tener analíticas. Si hay una manera más fácil de hacerlo que hacerlo manualmente así, también estaría encantado de escucharla.

EDITO: También estoy un poco confundido con la consulta actualizada para extraer todos los datos. ¿Debo exportar primero como CSV? ¿Esto no es un enlace en vivo?

1 me gusta

No debes usar tus credenciales de usuario del foro, sino una clave API que puedes obtener en Admin → API

No recomendaría empezar con este método antes de entender el original, ya que básicamente es un gran truco para obtener una gran cantidad de datos de una sola vez.

3 Me gusta

¡Vale!

Lo siento, no tengo idea de por qué escribí “contraseña”, quería decir “clave API” y ¡estaba pensando en “clave API”! Seguí esos pasos para obtenerla y la inserté en la zona que indicaste en el script de Power BI.

2 Me gusta

Primero, prueba con Postman para ver si la llamada a la API se realiza correctamente.

La propia llamada a la API se puede encontrar al navegar a la página de consultas del explorador de datos en tu navegador, abrir la consola de Red y ejecutar la consulta. El filtro XHR te mostrará todos los parámetros necesarios que podrás usar en Postman para verificar que todo funcione bien.

2 Me gusta

Resulta que tenía un error tipográfico en Power BI, y eso era lo que causaba el problema. ¡Qué tonto soy! Ahora funciona correctamente en Power BI; comienzo el proceso de intentar extraer todos o parte de los datos para empezar a revisarlos.

2 Me gusta

@loginerror - Me pregunto si estoy pasando por alto algo obvio. (Soy muy nuevo en Power BI, aunque he creado algunos paneles básicos en Excel)…

Constantemente me da problemas con las credenciales. Sé que son correctas; las he verificado con Postman. Me pregunto si en tu consulta debo eliminar de alguna manera los #'s o las comillas alrededor de los nombres de los parámetros (lo intenté, pero obtuve numerosos errores de sintaxis).

Creo que estoy cargando todo correctamente, aunque el icono de consulta en tu ejemplo se ve ligeramente diferente al mío.



Si intento ingresar las credenciales manualmente, Power BI me dice constantemente que debo ingresar un nombre en un campo que nunca me proporcionan. Estoy seguro de que esa no es la forma correcta de usarlo, ya que eso nunca aparece en tus ejemplos anteriores.

Es posible que esté bloqueado en algún otro lugar de mi red, pero quería descartar errores obvios primero. Por favor, revisa si algo aquí parece incorrecto y dime qué opinas. Gracias.

Hola @mattyoung

Para Power BI, debes utilizar credenciales anónimas. Esto se debe a que la clave de API ya está codificada en la función.

3 Me gusta

¡Logré que funcionara ahora con tu consulta de ejemplo, una nueva clave de API y un único usuario asociado a esa clave!

Voy a enumerar algunos errores que cometí y algunas áreas confusas que no me quedaron claras… lo cual podría ayudar a otros, así como los pasos que realmente funcionaron para mí:

En Discourse, en realidad tuve que crear una API y utilizar un “Usuario único” en lugar de “Todos los usuarios” en la configuración de la API, especificando un nombre de usuario real.

En PowerBI, para utilizar el sistema de consultas al entrar en PowerBI, selecciona “Transformar datos” para acceder al área de Power Query. Selecciona Nueva fuente > Consulta en blanco. Luego, cuando aparezca el cursor en un nuevo campo junto a fx, desde la fila superior de botones selecciona “Editor avanzado”, pega la consulta completa proporcionada al inicio de este tema, con tu nombre de usuario de Discourse y tu clave de API ya reemplazados. Selecciona “Hecho”. Aparecerá un campo preguntando por tu número de ID de consulta de Discourse. Ingresa el número… y haz clic en Invocar.

Aparecerá una advertencia inicial pidiéndote que especifiques cómo deseas autenticarte:

Selecciona “Editar credenciales”.

Verás que esto se lista como una conexión “Anónima”, que es lo que necesitas. Deja la URL tal cual (siempre que sea una única URL sin subdirectorios listados). Anteriormente, había estado ingresando la URL completa que aparecía en la consulta. Claramente, esto fue sobreanalizarlo por mi parte y un gran error. :wink:

Deberías ver una salida generada similar a esta y sabrás que esta consulta básica ahora funciona:

3 Me gusta

¡Hola! Soy yo de nuevo.

He entendido la forma original de extraer los datos. He creado varias vistas con éxito y las he importado a Power BI. ¡Genial!

Sin embargo, ahora estoy teniendo un problema de velocidad. Estoy intentando cargar solo los datos sin procesar; por ejemplo, uso SELECT * FROM user_visits/users/topics, etc. También tengo varios foros. Actualmente estoy probando con unos 15, pero la actualización se ha vuelto demasiado larga; por ejemplo, con “User Visits” llevo una hora esperando la actualización. Eventualmente voy a importar datos de cientos de foros, así que, obviamente, esto no funcionará a largo plazo.

Realmente me siento perdido con su solución alternativa. Intenté ajustarla, pero no funcionó (principalmente porque soy bastante malo escribiendo consultas SQL). ¿Podría ayudarme a reestructurar su solución alternativa para que pueda obtener SELECT * FROM user_visits de una manera más rápida?