<?xml version="1.0" encoding="utf-8"?>
<feed xmlns="http://www.w3.org/2005/Atom"><title>Jupyter Blog - Antoine Prouvost</title><link href="https://jasongrout.github.io/medium-archive/pelican/" rel="alternate"/><link href="https://jasongrout.github.io/medium-archive/pelican/feeds/author-antoine-prouvost.atom.xml" rel="self"/><id>https://jasongrout.github.io/medium-archive/pelican/</id><updated>2026-02-04T14:50:00+00:00</updated><subtitle>The Project Jupyter blog: news, releases, and community stories, archived from blog.jupyter.org.</subtitle><entry><title>Instantly view Parquet files in JupyterLab with Arbalister</title><link href="https://jasongrout.github.io/medium-archive/pelican/posts/2026/instantly-view-parquet-files-in-jupyterlab-with/" rel="alternate"/><published>2026-01-29T16:18:00+00:00</published><updated>2026-02-04T14:50:00+00:00</updated><author><name>Antoine Prouvost</name></author><id>tag:jasongrout.github.io,2026-01-29:/medium-archive/pelican/posts/2026/instantly-view-parquet-files-in-jupyterlab-with/</id><summary type="html">&lt;p&gt;A colleague sends you a SQLite file, a Parquet dataset, or an Avro snapshot. You need to explore the content, but you’re not sure what’s…&lt;/p&gt;
</summary><content type="html">&lt;p&gt;A colleague sends you a SQLite file, a Parquet dataset, or an Avro snapshot.&lt;br&gt;
You need to explore the content, but you’re not sure what’s inside or even how to open it. You shouldn’t have to write code, craft SQL queries, or recall the syntax for &lt;code&gt;read_parquet&lt;/code&gt;in a Python library. Instead, you should be able to click the file once and instantly see the tables and metadata.&lt;/p&gt;
&lt;p&gt;Despite being the &lt;em&gt;de-facto&lt;/em&gt; standard for data science and exploration, JupyterLab lacks this basic capability out of the box. Of course, there are extremely well designed libraries to read, process, and transform tabular data — but opening and viewing a file with a table should be simpler. A workflow with libraries like Pandas or Polars require you to install relevant packages, create a notebook, and iterate on queries to get a full picture of the data.&lt;/p&gt;
&lt;div class="highlight"&gt;&lt;pre&gt;&lt;span&gt;&lt;/span&gt;&lt;code&gt;&lt;span class="kn"&gt;import&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="nn"&gt;pandas&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="k"&gt;as&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="nn"&gt;pd&lt;/span&gt;

&lt;span class="n"&gt;pd&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="n"&gt;set_option&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="s2"&gt;&amp;quot;display.max_rows&amp;quot;&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="mi"&gt;50&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;
&lt;span class="n"&gt;pd&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="n"&gt;set_option&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="s2"&gt;&amp;quot;display.max_columns&amp;quot;&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="mi"&gt;20&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;
&lt;span class="n"&gt;pd&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="n"&gt;set_option&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="s2"&gt;&amp;quot;display.width&amp;quot;&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="kc"&gt;None&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;

&lt;span class="n"&gt;df&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="n"&gt;pd&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="n"&gt;read_parquet&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="s2"&gt;&amp;quot;data/2025/PERFORMANCE_SNAPSHOT_2025_01_05.parquet&amp;quot;&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;
&lt;span class="n"&gt;df&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;
&lt;p&gt;Whether for a newcomer to data science, or someone that needs to investigate many different files with hard to remember schemas, this is a bit cumbersome. Comma separated value files (CSV) have better support: double click on the file to see it open (see figure below). That is a great way to understand the business logic and answer questions such as &lt;em&gt;What type of information is in this file? What do values typically look like? Does it seem to contain all the data I need? What is the difference between &lt;code&gt;customer_id&lt;/code&gt; and &lt;code&gt;user_id&lt;/code&gt;?&lt;/em&gt;&lt;/p&gt;
&lt;figure&gt;
&lt;img alt="The built-in CSV viewer of JupterLab shows data as a table." src="https://jasongrout.github.io/medium-archive/pelican/posts/2026/instantly-view-parquet-files-in-jupyterlab-with/images/001-1_pHSj3jmo0D69yzM86_XAZg.webp" loading="lazy" data-body-image=""&gt;
&lt;figcaption&gt;The JupyterLab CSV viewer&lt;/figcaption&gt;
&lt;/figure&gt;
&lt;p&gt;&lt;strong&gt;Arbalister&lt;/strong&gt;, our new JupyterLab extension, changes this. With Arbalister, you can &lt;strong&gt;double-click to instantly view&lt;/strong&gt; a wide range of tabular data files: &lt;strong&gt;Parquet, CSV, Avro, ORC, SQLite,&lt;/strong&gt; and more…&lt;/p&gt;
&lt;figure&gt;
&lt;img alt="Arbalister viewer can open Parquet files and more" src="https://jasongrout.github.io/medium-archive/pelican/posts/2026/instantly-view-parquet-files-in-jupyterlab-with/images/002-1_CHOorqcOpRmlHlHFIPpF-A.webp" loading="lazy" data-body-image=""&gt;
&lt;figcaption&gt;Arbalister viewer can open Parquet files and more&lt;/figcaption&gt;
&lt;/figure&gt;
&lt;p&gt;The extension will load data as it is displayed, making it possible to view it almost instantaneously even if the file does not fit in memory. A toolbar lets the user select some reading options, such as the delimiter for a CSV file, or selecting the table to display in the SQLite file!&lt;/p&gt;
&lt;h2 id="arrow-over-the-wire"&gt;Arrow over the wire&lt;/h2&gt;
&lt;p&gt;Fueling it all is the &lt;a href="https://arrow.apache.org/"&gt;Apache Arrow&lt;/a&gt; ecosystem, an in-memory format for tabular data used in most data science libraries. Plenty of files types can already be read into an Arrow data structure so we exploit it heavily in Arbalister (with &lt;a href="https://datafusion.apache.org/"&gt;Apache Datafusion&lt;/a&gt; in our case).&lt;/p&gt;
&lt;p&gt;The table displayed in the user’s browser reuses JupyterLab Lumino DataGrid with a custom data model. In the latter, we divide the whole table in chunks across both the rows and columns axes (&lt;em&gt;e.g.&lt;/em&gt; 512 rows and 24 columns). When we need to display data from a chunk that is not already available, we make an HTTP request to a server-side extension that open the file, read the relevant portion into an Arrow table and return it to the client. The table is returned as Arrow IPC (Inter Process Communication, a binary format close to the original Arrow memory) in the response body. In the client, a lightweight Arrow implementation can read it back efficiently.&lt;/p&gt;
&lt;figure&gt;
&lt;img alt="A diagram show a client server-server architecture for Arbalister, with the backend responsible for reading many different file types into an Arrow IPC format, while the frontend displays it." src="https://jasongrout.github.io/medium-archive/pelican/posts/2026/instantly-view-parquet-files-in-jupyterlab-with/images/003-1_6qFKCpSW5d3GT1p6EOfekg.webp" loading="lazy" data-body-image=""&gt;
&lt;figcaption&gt;Arbalister client-server architecture&lt;/figcaption&gt;
&lt;/figure&gt;
&lt;p&gt;When nothing else is happening, the implementation will also pre-fetch some of the next chunks in the background so that scrolling past a chunk boundary is imperceptible.&lt;/p&gt;
&lt;p&gt;Because it all works in Arrow, which is standard for tabular data, adding support for new types of files that can be read into the Arrow format is extremely easy. Vortex, Lance, or whichever other format becomes relevant. But that is not all…&lt;/p&gt;
&lt;p&gt;The existing SQLite support is made possible through &lt;a href="https://arrow.apache.org/adbc/"&gt;ADBC&lt;/a&gt;, an SQL connector that reads databases into Arrow format. SQLite databases fit into single files, which fit the abstraction used in Arbalister, but ADBC could also be used to add general database exploration (Postgres &lt;em&gt;etc&lt;/em&gt;.) into Arbalister. With Datafusion, we could also add visualization for data lakehouses: partitioned datasets (&lt;em&gt;e.g.&lt;/em&gt; &lt;a href="https://delta.io/"&gt;DeltaLake&lt;/a&gt; or &lt;a href="https://iceberg.apache.org/"&gt;Apache Iceberg&lt;/a&gt;) over remote object storage (S3). With Intelligent predicate and projections pushdowns, we could visualize remote tera-byte table instantly by only downloading the relevant parts.&lt;/p&gt;
&lt;h2 id="looking-further"&gt;Looking further&lt;/h2&gt;
&lt;p&gt;There are multiple things that would make great improvements to Arbalister. We have already mentioned:&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;Optional support for newer file types: Vortex, Lance;&lt;/li&gt;
&lt;li&gt;Object storage and data lakehouses support;&lt;/li&gt;
&lt;li&gt;SQL databases support.&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;Another direction is support for &lt;a href="https://jupyterlite.readthedocs.io/en/stable/"&gt;JupyterLite&lt;/a&gt;, a &lt;a href="https://webassembly.org/"&gt;WebAssembly&lt;/a&gt; distribution of JupyterLab running entirely in the browser. This setting is great for education because it does not require more than a static file server to host.&lt;br&gt;
Being able to work directly with Parquet files in the browser is great for making dashboard and interactive demonstrations. Arrow and Datafusion already have some experimental support for WebAssembly so this is not so far-fetched.&lt;/p&gt;
&lt;p&gt;Finally Arbalister could use a few features to investigate deeper questions about the data. For instance, beyond the &lt;em&gt;What does the data look like?&lt;/em&gt; question, some column filters could help answer questions &lt;em&gt;such as What does the data look like in November 2024 for John Doe?&lt;/em&gt; Perhaps even an SQL console for more advanced queries.&lt;/p&gt;
&lt;h2 id="an-extension-point"&gt;An extension point&lt;/h2&gt;
&lt;p&gt;The server extension being only a way to serve Arrow data, it can be reused by other libraries to use it in other ways. For instance, if we knew that our table contains time-series data, a second viewer could display it as a graph.&lt;br&gt;
Similarly for geospatial data.&lt;/p&gt;
&lt;p&gt;If you are interested to use or contribute to Arbalister, head to &lt;a href="https://github.com/QuantStack/Arbalister"&gt;our GitHub&lt;/a&gt;!&lt;/p&gt;
&lt;h2 id="about-the-author"&gt;About the Author&lt;/h2&gt;
&lt;p&gt;Antoine Prouvost is a senior scientific software engineer at QuantStack. His work on Arbalister was funded by Bloomberg.&lt;/p&gt;
</content><category term="JupyterLab"/><category term="visualization"/></entry></feed>