Integração do Discourse Data Explorer com Power BI

Integração do Discourse Data Explorer com Power BI

Recentemente, criei uma função legal do Power BI que busca dados do Data Explorer diretamente no Power BI com sobrecarga mínima.

Assim, se você é como eu e queria que os dados fossem puxados e atualizados automaticamente pelo aplicativo do Power BI, aqui está o código da função que você deve colocar no Editor Avançado do 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

E aqui está uma consulta de exemplo do Data Explorer. Ela inclui paginação que é necessária para que a função acima funcione corretamente (é necessária mesmo se sua consulta retornar apenas 1 página):

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

SELECT count(*) from badges

OFFSET :page * 1000
LIMIT 1000

(você pode adaptar facilmente suas consultas existentes incluindo a primeira e a última linha do exemplo acima)

Essa função continuará automaticamente a iterar sobre as páginas até que não haja mais resultados.

Como fazer funcionar?

Depois de carregar a função no Power BI, você precisará configurar 2 coisas:

  1. O api-username e api-key (veja a função acima para os espaços reservados):

                         Headers = [ 
                         #"api-username"="yourAPIUsername",
                         #"api-key"="yourAPIKey",
    
  2. O número do ID da consulta.

    Para buscar seus dados, tudo o que você precisa fornecer é o ID da consulta, que é fácil de encontrar na URL da consulta:
    image

    Isso deve ficar assim no Power BI depois que você clicar na função:

Saída de exemplo

Esta é a saída da consulta de exemplo:

image

É isso! Agora você pode moldar seus dados da maneira que quiser.

11 curtidas

Você tinha tempo demais sobrando. :laughing:

Mas obrigado mesmo assim :slight_smile: muito útil.

2 curtidas

Para outros como eu que veem o Power BI e ficam confusos.

https://powerbi.microsoft.com/pt-br/what-is-power-bi/

5 curtidas

Obrigado, @loginerror, por fornecer isso! Vou tentar fazer o mesmo no Tableau. Não tenho certeza se ele possui um editor avançado semelhante ao que o Power BI oferece, mas vou ver.

1 curtida

Para outros como eu que não conhecem o Tableau.

https://www.tableau.com/

Tenha uma visão completa do seu negócio, por dentro e por fora.
Conecte todos os seus dados a fontes externas críticas, como status de saúde pública, indicadores econômicos e políticas governamentais.


Da Wikipédia

Os produtos do Tableau consultam bancos de dados relacionais, cubos de processamento analítico online, bancos de dados em nuvem e planilhas para gerar visualizações de dados do tipo gráfico. Os produtos também podem extrair, armazenar e recuperar dados de um motor de dados em memória.

1 curtida

Ei @loginerror, obrigado por fornecer isso!

Estou começando agora no PowerBI e seria um projeto divertido trabalhar em um painel do Discourse. Graças a você, talvez eu consiga dar os primeiros passos e chegar mais rápido à parte divertida.

Mas, para isso, gostaria de fazer uma pergunta…
Tentei executar a consulta sugerida usando uma chave de API recém-gerada (para meu nome de usuário), mas, por algum motivo, não consegui fazê-la funcionar.

Vejo que algo está acontecendo no Discourse — ele indica que a chave de API foi usada, mas o PowerBI executa a consulta infinitamente e não retorna nenhum dado.

Não sou muito proficiente em consultas, então posso estar perdendo algo óbvio… Poderia me ajudar, por favor?

Deve funcionar simplesmente ao ser conectado.

Você já tentou executá-lo com a consulta de exemplo que retorna apenas um valor?

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

SELECT count(*) from badges

OFFSET :page * 1000
LIMIT 1000

Caso contrário, se houver mais páginas (e estamos limitados a 1000 registros por página), pode levar mais tempo para carregar todos os dados.

Acabei de testar o código criando um projeto rápido do Power BI com o código da postagem original, e ele funciona perfeitamente (parece funcionar bem tanto com uma chave de API do sistema quanto com uma chave de usuário com permissões de administrador).

4 curtidas

Ah, não percebi que você respondeu tão rápido – obrigado!
Posso parecer um completo iniciante, e provavelmente é porque sou. Mas onde devo usar esse trecho de código? Desculpe, estou realmente começando agora no Power BI.

1 curtida

Esta é uma consulta de exemplo do Data Explorer que você deve salvar no seu plugin Data Explorer. Ela foi projetada para retornar apenas 1 registro, o que permite testar a função sem forçar o download de grandes volumes de dados.

Em seguida, obtenha o ID dela a partir da URL e insira-o na função do Power BI criada a partir do código do primeiro post:

/admin/plugins/explorer?id=260
1 curtida

Ah, agora entendi! Muito obrigado. Eu estava apenas olhando as coisas do ponto de vista do Power BI… que bobagem :slight_smile:

Vou ver como as coisas evoluem daqui para frente.

Obrigado novamente, ótimo trabalho.

1 curtida

Uma atualização rápida, caso alguém queira melhorar o script do primeiro post.

Na verdade, é possível extrair todos os dados de uma só vez, aparentemente independentemente da quantidade de dados :sweat_smile:
(Eu testei isso sob pressão em uma tabela posts considerável com as colunas id e raw, e funcionou!)

Consulta de exemplo:

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

Ao executá-la, ela imprimirá seu arquivo quase-csv como um único valor, ou seja, em uma única página. Você precisará então remover o " inicial e outro " no final, e ele se tornará um CSV útil:

Naturalmente, você pode adicionar mais dados a ele incluindo uma nova coluna para o arquivo CSV e novos dados para essa coluna:

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

Ao ser atualizado para suportar essa consulta, o Power BI não precisaria navegar por várias páginas, resultando em uma recuperação de dados mais rápida.

4 curtidas

Olá! Sou relativamente novo no Power BI e muito novo no Discourse Data Explorer, então peço paciência.

Estou tentando me conectar. Inseri a URL do meu fórum, meu nome de usuário e minha senha no script no topo. Executei o script de testes de emblemas no Data Explorer. No entanto, ao tentar me conectar no Power BI, recebo este erro:

Conecto-me anonimamente porque, se tento usar qualquer outra permissão no Power BI, ele diz que os dados devem ser coletados anonimamente.

Alguma dica?

No final das contas, estou tentando conectar um grande número de nossos fóruns (vários centenas) ao Power BI para que possamos ter análises. Se houver uma maneira mais fácil de fazer isso do que manualmente, como estou fazendo, ficaria feliz em saber!

EDIT: Também estou um pouco confuso com a consulta atualizada para extrair todos os dados. Preciso exportar como CSV primeiro? Isso não é um link ao vivo?

1 curtida

Você não deve usar suas credenciais de usuário do Fórum, mas sim uma chave de API que você pode obter em Admin → API

Eu não começaria com este método antes de entender o original, pois é basicamente uma grande solução alternativa para obter muitos dados de uma só vez.

3 curtidas

Justo!

Desculpe, não tenho ideia do por que digitei ‘senha’. Queria dizer ‘chave de API’ e eu estava pensando em ‘chave de API’! Segui aqueles passos para obtê-la e a inseri na área que você indicou no script do Power BI.

2 curtidas

Primeiro, tente usar o Postman para verificar se a chamada à API é executada corretamente.

A própria chamada à API pode ser encontrada quando você navegar para a página de consulta do explorador de dados no seu navegador, abrir o console de rede e executar a consulta. O filtro XHR apresentará todos os parâmetros necessários que você poderá usar no Postman para verificar se tudo está correto.

2 curtidas

Acontece que eu tinha um erro de digitação no Power BI, e isso estava causando o problema. Que bobagem minha! Agora está funcionando corretamente no Power BI. Começo agora o processo de tentar extrair todos ou parte dos dados para que eu possa começar a analisá-los.

2 curtidas

@loginerror - Estou me perguntando se estou apenas ignorando algo bobo. (Sou muito novo no Power BI, mas já fiz alguns painéis básicos baseados no Excel)…

Continua me dando problemas com as credenciais. Sei que elas estão corretas. Já verifiquei usando o Postman. Estou me perguntando se, na sua consulta, preciso remover os # ou as aspas " ao redor dos nomes dos parâmetros (tentei, mas obtive vários erros de sintaxe).

Acho que estou carregando tudo corretamente, mesmo que o ícone de consulta na sua tela pareça ligeiramente diferente do meu.



Se eu tentar inserir as credenciais manualmente, o Power BI continua dizendo que preciso inserir um nome em um campo que eles nunca me fornecem ;). Tenho certeza de que essa não é a maneira correta de usar isso, já que isso nunca aparece nos seus exemplos acima.

Pode ser que eu esteja bloqueado em algum lugar da minha rede, mas quis descartar erros bobos primeiro. Por favor, verifique se há algo errado aqui e me diga o que você acha. Obrigado.

Olá @mattyoung

Para o Power BI, você deve usar credenciais anônimas. Isso ocorre porque a chave da API já está codificada na função.

3 curtidas

Consegui fazer funcionar agora com sua consulta de exemplo, uma nova chave de API e um único usuário associado a essa chave de API.

Vou listar alguns erros que cometi e algumas áreas confusas que não estavam claras para mim… o que pode ajudar outras pessoas, além de detalhar os passos que realmente funcionaram para mim:

No Discourse, na verdade, precisei criar uma API e usar um “Single User” (Usuário Único), e não “All Users” (Todos os Usuários), especificando um nome de usuário real.

No Power BI, para usar o sistema de consultas ao abrir o Power BI, selecione “Transformar Dados” para entrar na área do Power Query. Selecione Nova Fonte > Consulta em Branco. Em seguida, quando o cursor aparecer em um novo campo ao lado de fx, na primeira linha de botões, selecione “Editor Avançado”, cole a grande consulta fornecida no início deste tópico, com seu nome de usuário do Discourse e sua chave de API já substituídos. Selecione Concluir. Um campo pedindo seu número de ID da consulta do Discourse aparecerá. Insira o número… e clique em Invocar.

Um aviso inicial aparecerá pedindo que você especifique como deseja autenticar:

Selecione Editar Credenciais.

Você verá que isso está listado como uma conexão “Anônima”, que é o que você deseja. Deixe a URL como está (desde que seja apenas uma URL única, sem subdiretórios listados). Anteriormente, eu colocava a URL completa listada na consulta. Claramente, isso foi excesso de pensamento da minha parte e um grande erro. :wink:

Você deverá ver uma saída gerada semelhante a esta, e saberá que essa consulta básica agora está funcionando!

3 curtidas

Olá! Sou eu de novo!

Entendi a maneira original de extrair os dados. Criei com sucesso várias visualizações e as importei para o Power BI. Uhuu!

No entanto, agora estou enfrentando um problema de velocidade. Estou tentando importar apenas os dados brutos; por exemplo, uso SELECT * FROM user_visits/users/topics, etc. Também tenho vários fóruns. Atualmente, estou testando com cerca de 15, mas a atualização começou a ficar excessivamente longa; por exemplo, no caso de “User Visits”. No momento, estou há uma hora aguardando uma atualização. Eventualmente, vou importar dados de centenas de fóruns, então, obviamente, isso não funcionará a longo prazo.

Estou realmente perdido com a sua solução alternativa. Tentei ajustá-la, mas não funcionou (principalmente porque sou bastante ruim em escrever consultas SQL). Você pode me ajudar a reestruturar sua solução alternativa para que eu possa obter, por exemplo, SELECT * FROM user_visits de uma maneira mais rápida?