Power BI for Time-Series Data: Connect Arc Through Microsoft Fabric

#Power BI#Microsoft Fabric#time-series database#IoT#telemetry#Direct Lake#Lakehouse#Apache Arrow#Python#Arc#tutorial
Cover image for Power BI for Time-Series Data: Connect Arc Through Microsoft Fabric

Power BI is where a lot of organisations look at their numbers. Time-series data is where it struggles: sensor readings every second, machine telemetry, metrics from thousands of devices. Loading that firehose into Power BI directly means huge imports, slow refreshes and a dataset model that was never designed for it.

The usual answer is to keep the raw data in a database built for it, and give Power BI the slice a report needs. Arc is that kind of database: it ingests millions of records per second, stores them as Parquet, and answers analytical SQL over them. The question is how to get from Arc to Power BI without a pile of moving parts.

This post shows a path that needs none of the usual ones. No Power BI Desktop, so no Windows machine. No on-premises data gateway. No custom connector. Just Microsoft Fabric in the browser, a Python notebook of about fifteen lines, and Arc's Arrow query endpoint, which every Arc release since 25.12.1 has. We built it from a Mac.

Who this is for

  • Power BI and Fabric users with time-series data: IoT and industrial telemetry, sensor networks, infrastructure and application metrics, energy and fleet data. Arc keeps the full history and does the heavy aggregation; Power BI gets a clean, typed table to report on.
  • Teams that already run Arc and work in a Microsoft shop. The data can stay in Arc and still reach the dashboards everyone else uses.
  • Analysts on macOS or Linux, who cannot run Power BI Desktop at all. Everything here happens in the browser.

What you get

  • Power BI reports on Arc data in minutes, with the column types intact: timestamps as timestamps, readings as numbers.
  • Arc does the work it is good at. You choose in SQL what crosses over (a time window, a few columns, hourly averages), so Power BI handles thousands of rows rather than billions.
  • Nothing to install or operate on the Arc side. The notebook is an ordinary HTTPS client with a read-only token, and it works with the Arc you already run.
  • Fast reports. Power BI reads the Lakehouse table directly (Direct Lake), so report interactions never wait on a query to Arc.

Everything below was run in a fresh Fabric trial workspace against our public demo instance, which runs Arc 26.09.4 and holds weather readings for three cities. The only change on the Arc side was a new read-only token.

How it works

Arc  ──POST /api/v1/query/arrow──▶  Fabric notebook  ──▶  Lakehouse table  ──▶  Power BI report
       (Arrow, over HTTPS)          (scheduled)          (Delta, OneLake)      (Direct Lake)

The notebook sends SQL to Arc and receives the result as an Arrow stream. It writes that to a Lakehouse table, Power BI reads the table directly (Direct Lake, no import step), and a schedule keeps it fresh.

It's a copy, not a live connection: the report shows Arc's data as of the last run. For most dashboards an hourly or fifteen-minute refresh is plenty, and it means Power BI never queries Arc while someone is clicking around a report.

Two things to create first

A workspace on a Fabric trial or capacity (notebooks don't exist on a Power BI Pro-only workspace), and a Lakehouse inside it:

The Microsoft Fabric New Lakehouse dialog, with the name arc_lakehouse, the location Arc Demo and Lakehouse schemas ticked.
A Lakehouse named arc_lakehouse in a new workspace.

Then a notebook attached to that Lakehouse. That's all the setup there is.

Fifteen lines of Python

The token goes in its own cell, hidden, so it never ends up in a screenshot or a shared notebook. The query cell does the work:

import requests, pyarrow.ipc as ipc
 
ARC_URL = "https://arc.demos.basekick.net"
SQL = """
SELECT * FROM weather_tracking.weather_observations
WHERE time > now() - INTERVAL 30 DAY
"""
 
r = requests.post(f"{ARC_URL}/api/v1/query/arrow",
                  headers={"Authorization": f"Bearer {ARC_TOKEN}"},
                  json={"sql": SQL}, stream=True, timeout=300)
r.raise_for_status()
table = ipc.open_stream(r.raw).read_all()   # Arrow: columnar, no JSON
print(f"{table.num_rows} rows from Arc")
 
spark.createDataFrame(table.to_pandas()) \
     .write.mode("overwrite").saveAsTable("weather_observations")

It is ordinary Arc SQL, so you choose what crosses over: a time window, a few columns, or an aggregate instead of raw rows.

A Fabric notebook after a run. The first cell's input is hidden. The second cell posts the SQL to arc.demos.basekick.net/api/v1/query/arrow and writes the result to weather_observations. Output: Spark jobs 6 of 6 succeeded, 12762 rows from Arc. The Explorer shows arc_lakehouse, Tables, dbo, weather_observations with columns time, city, clouds, conditions, feels_like, humidity, pressure, temperature and wind_speed.
12,762 rows from Arc, written to a Lakehouse table with every column typed.

12,762 rows, thirty days of readings for three cities, and the column types arrived intact: time as a timestamp, the readings as numbers, city as text. That's the reason to use the Arrow endpoint rather than Arc's JSON one. JSON has no types, so timestamps arrive as strings to parse, and a float column whose values happen to be whole numbers comes back as integers. Arrow carries the schema with the data.

One Fabric detail that cost us a minute: the new table shows up in the Explorer only after you refresh it (dbo → ⋯ → Refresh).

From table to report

In the Lakehouse, New semantic model turns the table into something Power BI can use. Pick the table, confirm:

The New semantic model dialog: Direct Lake semantic model name weather, workspace Arc Demo, and dbo.weather_observations selected.
A Direct Lake semantic model on the Arc table.

Then a report: a line chart with time on the X-axis, temperature on the Y-axis and city as the legend. Set the measure to Average: Power BI sums numbers by default, which adds up readings that share a timestamp.

A Power BI report named Weather in three cities: average temperature over time for Buenos Aires, London and Tokyo from late October to November 12, with a city filter listing 4254 rows for each city.
Thirty days of Arc data in Power BI: 4,254 readings per city.

The filter pane shows 4,254 rows per city. Three cities make 12,762, exactly what the notebook received from Arc.

Keeping it fresh

The notebook's Settings → Schedule runs it on an interval. Hourly is a sensible start:

The notebook schedule panel: repeat hourly, interval 1 hour, start and end dates, time zone, and an optional email for failure notifications.
An hourly schedule, with an optional email when a run fails.

Each run replaces the table with the latest window from Arc. A report that is already open doesn't redraw by itself: click Refresh to see the new data.

What to watch for

  • The token. Use a read-only token limited to the databases the report needs. On Arc Enterprise, RBAC applies to these queries like any other, and they appear in the audit log. For anything beyond a trial, keep the token in Azure Key Vault rather than in the notebook.
  • Row caps. If the token has an Enterprise governance policy with a row cap, a query that hits it stops at the cap. Keep the cap above the window you pull.
  • Size. The whole result passes through the notebook's memory. Bound it by time, or aggregate in SQL, rather than pulling a measurement's entire history every hour.
  • Old versions. Before 25.12.1 there is no Arrow endpoint, but the JSON endpoint works with a few more lines. The guide has both.

What comes next

This is the path that works today. Two things in the next release make it shorter:

  • Arrow Flight SQL. Arc 27.01.1 adds a native Flight SQL listener for ADBC clients. Power BI itself ships a Flight SQL ADBC driver, which opens the door to a direct connector.
  • Iceberg on object storage. When Arc keeps its data in a bucket, its Iceberg export publishes tables a lakehouse engine can read in place, with no notebook copying data in between.

The step-by-step version, with every screenshot and the JSON variant for older releases, is in the docs: Microsoft Fabric and Power BI.

Ready to handle billion-record workloads?

Deploy Arc in minutes. Own your data in open files on your storage. Use for analytics, observability, AI, IoT, or data warehousing.

Get Started ->