I den här snabbstarten autentiserar du till Power BI, kör en DAX-fråga mot en semantisk modell och deserialiserar Arrow-svaret till en lokal datastruktur.
Förutsättningar
- En Power BI arbetsyta med minst en semantisk modell.
-
Skapa och läsa behörigheter för semantikmodellen.
- En Microsoft Entra appregistrering (eller använda interaktiv autentisering för testning).
PowerShell 7.4 eller senare.
Installera modulen MSAL.PS :
Install-Module -Name MSAL.PS -Scope CurrentUser
1 – Autentisera
Hämta en bearertoken med omfånget https://analysis.windows.net/powerbi/api/.default.
from msal import PublicClientApplication
client_id = "YOUR_APP_CLIENT_ID"
authority = "https://login.microsoftonline.com/YOUR_TENANT_ID"
scopes = ["https://analysis.windows.net/powerbi/api/.default"]
app = PublicClientApplication(client_id, authority=authority)
result = app.acquire_token_interactive(scopes=scopes)
access_token = result["access_token"]
using Microsoft.Identity.Client;
var clientId = "YOUR_APP_CLIENT_ID";
var tenantId = "YOUR_TENANT_ID";
var scopes = new[] { "https://analysis.windows.net/powerbi/api/.default" };
var app = PublicClientApplicationBuilder
.Create(clientId)
.WithAuthority(AzureCloudInstance.AzurePublic, tenantId)
.WithRedirectUri("http://localhost")
.Build();
var result = await app.AcquireTokenInteractive(scopes).ExecuteAsync();
var accessToken = result.AccessToken;
$clientId = "YOUR_APP_CLIENT_ID"
$tenantId = "YOUR_TENANT_ID"
$scopes = @("https://analysis.windows.net/powerbi/api/.default")
$token = Get-MsalToken -ClientId $clientId -TenantId $tenantId -Scopes $scopes -Interactive
$accessToken = $token.AccessToken
2 – Kör en DAX-fråga
Skicka en POST-begäran till slutpunkten Execute Queries Arrow (Kör frågor) med en enkel EVALUATE instruktion.
import io
import pyarrow as pa
import requests
group_id = "YOUR_WORKSPACE_ID"
dataset_id = "YOUR_DATASET_ID"
url = (f"https://api.powerbi.com/v1.0/myorg/groups/{group_id}"
f"/datasets/{dataset_id}/executeDaxQueries")
headers = {
"Authorization": f"Bearer {access_token}",
"Content-Type": "application/json",
}
body = {"query": "EVALUATE TOPN(5, 'DimProduct')"}
response = requests.post(url, headers=headers, json=body)
response.raise_for_status()
reader = pa.ipc.open_stream(io.BytesIO(response.content))
table = reader.read_all()
df = table.to_pandas()
print(df)
using System.Net.Http.Headers;
using Apache.Arrow;
using Apache.Arrow.Ipc;
var groupId = "YOUR_WORKSPACE_ID";
var datasetId = "YOUR_DATASET_ID";
var url = $"https://api.powerbi.com/v1.0/myorg/groups/{groupId}"
+ $"/datasets/{datasetId}/executeDaxQueries";
using var client = new HttpClient();
client.DefaultRequestHeaders.Authorization =
new AuthenticationHeaderValue("Bearer", accessToken);
var body = new StringContent(
"""{"query": "EVALUATE TOPN(5, 'DimProduct')"}""",
System.Text.Encoding.UTF8,
"application/json");
var response = await client.PostAsync(url, body);
response.EnsureSuccessStatusCode();
using var stream = await response.Content.ReadAsStreamAsync();
using var reader = new ArrowStreamReader(stream);
var batch = await reader.ReadNextRecordBatchAsync();
Console.WriteLine($"Rows: {batch.Length}, Columns: {batch.ColumnCount}");
$groupId = "YOUR_WORKSPACE_ID"
$datasetId = "YOUR_DATASET_ID"
$url = "https://api.powerbi.com/v1.0/myorg/groups/$groupId" +
"/datasets/$datasetId/executeDaxQueries"
$headers = @{
"Authorization" = "Bearer $accessToken"
"Content-Type" = "application/json"
}
$body = @{ query = "EVALUATE TOPN(5, 'DimProduct')" } | ConvertTo-Json
$response = Invoke-WebRequest -Uri $url -Method Post -Headers $headers -Body $body
# Save the binary Arrow stream to a file for inspection
$arrowFile = "result.arrow"
[System.IO.File]::WriteAllBytes($arrowFile, $response.Content)
Write-Host "Arrow stream saved to $arrowFile ($($response.Content.Length) bytes)"
3 – Kontrollera resultatet
# Print the Arrow schema (column names and types)
print(table.schema)
# Show the first few rows as a pandas DataFrame
print(df.head())
# Access a specific column
print(table.column("ProductName").to_pylist()[:5])
// Print the schema (column names and types)
for (var i = 0; i < batch.Schema.FieldsList.Count; i++)
{
var field = batch.Schema.FieldsList[i];
Console.WriteLine($" {field.Name}: {field.DataType}");
}
// Print the first row's values
for (var i = 0; i < batch.ColumnCount; i++)
{
var column = batch.Column(i);
Console.Write($"{batch.Schema.FieldsList[i].Name}=");
Console.Write(column.GetType().GetMethod("GetValue")?.Invoke(column, new object[] { 0 }));
Console.Write(" ");
}
# Use Python with pyarrow to read the saved Arrow file
python -c @"
import pyarrow as pa
reader = pa.ipc.open_stream('result.arrow')
table = reader.read_all()
print(table.schema)
print(table.to_pandas().head())
"@
Rensa resurser
Om du har skapat en Microsoft Entra appregistrering enbart för testning går du till Azure-portalen och tar bort den. Åtkomsttoken upphör att gälla automatiskt och behöver inte manuellt återkallande.
Relaterat innehåll