Power BI com Azure Synapse Analytics
Para cenários de grande volume de dados e análise avançada, o Azure Synapse Analytics é uma excelente opção. Este guia mostra como carregar os dados da nossa API em um pool de SQL dedicado do Azure Synapse e conectá-lo ao Power BI.
Pré-requisitos
- Python 3.6+ e bibliotecas necessárias:
pip install requests pandas pyodbc azure-identity - Azure Synapse Analytics: Um workspace do Azure Synapse com um pool de SQL dedicado.
- Credenciais do Azure: Configure a autenticação para o seu ambiente. O script usa
DefaultAzureCredential, que tenta vários métodos de autenticação (variáveis de ambiente, identidade gerenciada, Azure CLI, etc.). - ODBC Driver for SQL Server: Instale o driver ODBC da Microsoft para se conectar ao Synapse.
- Power BI Desktop.
- Token de Acesso para a nossa API.
Exemplo de Código
O script Python a seguir extrai os dados, conecta-se ao Azure Synapse e carrega as proposições em uma tabela.
- Python
import requests
import pandas as pd
import pyodbc
from azure.identity import DefaultAzureCredential
import json
# --- Configuração ---
ACCESS_TOKEN = "SEU_TOKEN_DE_ACESSO"
API_URL = "https://api-public.sigalei.com/graphql"
# --- Configuração do Azure Synapse ---
SYNAPSE_SERVER = "seu-workspace.sql.azuresynapse.net"
SYNAPSE_DATABASE = "seu_pool_sql"
SYNAPSE_TABLE = "dbo.proposicoes"
# O driver pode variar dependendo da sua instalação
ODBC_DRIVER = "{ODBC Driver 17 for SQL Server}"
# --- 1. Buscar Proposições (reutilizada do exemplo anterior) ---
def fetch_propositions():
"""Busca proposições da nossa API."""
query = """
query RecuperaProposicoes {
recuperaProposicoes(filter: {siglaTipo: "PL", ano: 2023}, first: 100) {
edges {node {id siglaTipo numero ano ementa}}
}
}
"""
headers = {"Authorization": f"Bearer {ACCESS_TOKEN}", "Content-Type": "application/json"}
response = requests.post(API_URL, json={"query": query}, headers=headers)
response.raise_for_status()
return [p["node"] for p in response.json()["data"]["recuperaProposicoes"]["edges"]]
# --- 2. Carregar Dados no Azure Synapse ---
def load_data_to_synapse(propositions):
"""Conecta ao Azure Synapse e carrega os dados das proposições."""
df = pd.DataFrame(propositions)
if df.empty:
print("Nenhuma proposição encontrada para carregar.")
return
try:
print("Obtendo credenciais do Azure...")
credential = DefaultAzureCredential(exclude_interactive_browser_credential=False)
token_object = credential.get_token("https://database.windows.net/.default")
conn_str = (
f"DRIVER={ODBC_DRIVER};"
f"SERVER={SYNAPSE_SERVER};"
f"DATABASE={SYNAPSE_DATABASE};"
"Authentication=ActiveDirectoryMsi"
)
# Para autenticação com token de acesso
token_bytes = token_object.token.encode("UTF-16-LE")
conn_attrs = pyodbc.SQL_COPT_SS_ACCESS_TOKEN, token_bytes
print("Conectando ao Azure Synapse...")
with pyodbc.connect(conn_str, attrs_before=conn_attrs) as conn:
conn.autocommit = True
cursor = conn.cursor()
print(f"Criando a tabela '{SYNAPSE_TABLE}' se não existir...")
cursor.execute(f"""
IF NOT EXISTS (SELECT * FROM sys.objects WHERE name = 'proposicoes' AND type = 'U')
CREATE TABLE {SYNAPSE_TABLE} (
id NVARCHAR(255) NOT NULL,
siglaTipo NVARCHAR(50),
numero INT,
ano INT,
ementa NVARCHAR(MAX)
)
WITH (DISTRIBUTION = ROUND_ROBIN, CLUSTERED COLUMNSTORE INDEX);
""")
print("Criando tabela temporária para o merge...")
temp_table = f"#{SYNAPSE_TABLE.replace('.', '_')}_temp"
cursor.execute(f"CREATE TABLE {temp_table} LIKE {SYNAPSE_TABLE};")
print(f"Inserindo dados na tabela temporária '{temp_table}'...")
values = [tuple(x) for x in df[['id', 'siglaTipo', 'numero', 'ano', 'ementa']].to_numpy()]
cursor.executemany(f"INSERT INTO {temp_table} VALUES (?, ?, ?, ?, ?)", values)
print("Executando o MERGE na tabela principal...")
merge_sql = f"""
MERGE {SYNAPSE_TABLE} AS target
USING {temp_table} AS source
ON (target.id = source.id)
WHEN MATCHED THEN
UPDATE SET
target.siglaTipo = source.siglaTipo,
target.numero = source.numero,
target.ano = source.ano,
target.ementa = source.ementa
WHEN NOT MATCHED BY TARGET THEN
INSERT (id, siglaTipo, numero, ano, ementa)
VALUES (source.id, source.siglaTipo, source.numero, source.ano, source.ementa);
"""
cursor.execute(merge_sql)
cursor.execute(f"DROP TABLE {temp_table};")
print(f"{cursor.rowcount} registros foram mesclados com sucesso!")
except pyodbc.Error as e:
print(f"Erro de banco de dados: {e}")
except Exception as e:
print(f"Ocorreu um erro inesperado: {e}")
# --- Execução ---
if __name__ == "__main__":
try:
print("Buscando proposições...")
propositions = fetch_propositions()
if propositions:
print(f"{len(propositions)} proposições encontradas.")
load_data_to_synapse(propositions)
else:
print("Nenhuma proposição foi retornada pela API.")
except Exception as e:
print(f"Erro: {e}")
Instruções de Implementação
- Autenticação no Azure: Certifique-se de que você está autenticado no Azure. A forma mais simples é executar
az loginno seu terminal se você tiver a Azure CLI instalada. - Substitua os Placeholders:
- No script, atualize
ACCESS_TOKEN,SYNAPSE_SERVEReSYNAPSE_DATABASEcom os seus valores.
- No script, atualize
- Execute o Script: Salve o código e execute-o para carregar os dados no Synapse.
Conectando o Power BI ao Azure Synapse
- Abra o Power BI Desktop.
- Em Obter Dados, selecione Azure e depois Azure Synapse Analytics SQL.
- Insira as Informações do Servidor:
- Servidor: O endereço do seu workspace Synapse (ex:
seu-workspace.sql.azuresynapse.net). - Banco de Dados (opcional): O nome do seu pool de SQL (ex:
seu_pool_sql).
- Servidor: O endereço do seu workspace Synapse (ex:
- Autenticação:
- Na tela de credenciais, escolha a opção Conta da Microsoft e entre com a sua conta do Azure.
- Selecione a Tabela:
- No Navegador, selecione a tabela
proposicoese clique em Carregar.
- No Navegador, selecione a tabela
Seus dados agora estão no Power BI, prontos para serem explorados com todo o poder de análise do Azure Synapse.