From 407154787c516d4cb567a025e3616e849ba2cc91 Mon Sep 17 00:00:00 2001 From: Emil Sadek Date: Fri, 17 Apr 2026 15:08:08 -0700 Subject: [PATCH 1/3] feat: add datafusion table provier for adbc notebook --- data/penguins.duckdb | Bin 0 -> 536576 bytes .../datafusion-table-provider-for-adbc.ipynb | 276 ++++++++++++++++++ registry.json | 8 + 3 files changed, 284 insertions(+) create mode 100644 data/penguins.duckdb create mode 100644 notebooks/datafusion-table-provider-for-adbc.ipynb diff --git a/data/penguins.duckdb b/data/penguins.duckdb new file mode 100644 index 0000000000000000000000000000000000000000..a7006f3ee65a309ff98d7d13242776624b6f2a04 GIT binary patch literal 536576 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 z009C72oNAZfB*pk1PBlyK!5-N0t5&UAV7cs0RjXF5FkK+009C72oNAZfB*pk1PBly zK!5-N0t5&UAV7cs0RjXF5FkK+009C72oNAZfB*pk1PBlyK!5-N0t5&UAV7cs0RjXF z5FkK+009C72oNAZfB*pk1PBlyK!5-N0t5&UAV7cs0RjXF5FkK+009C72oNAZfB*pk z1PBlyK!5-N0t5&UAV7cs0RjXF5FkK+009C72oNAZfB*pk1PBlyK!5-N0t5&UAV7cs z0RjXF5FkK+009C72oNAZfB*pk1PBlyK!5-N0t5&UAV7cs0RjXF5FkK+009C72oNAZ zfB*pk1PBlyK!5-N0t5&UAV7cs0RjXF5FkK+009C72oNAZfB*pk1PBlyK!5-N0t5&U zAV7cs0RjXF5FkK+009C72oNAZfB*pk1PBlyK!5-N0t5&UAV7cs0RjXF5FkK+009C7 z2oNAZfB*pk1PBlyK!5-N0t5&UAV7cs0RjXF5FkK+009C72oNAZfB*pk1PBlyK!5-N z0t5&UAV7cs0RjXF5FkK+009C72oNAZfB*pk1PBlyK!5-N0t5&UAV7cs0RjXF5FkK+ z009C72oNAZfB*pk1PBlyK!5-N0t5&UAV7cs0RjXF5FkK+009C72oNAZfB*pk1PBly zK!5-N0t5&UAV7cs0RjXF5FkK+009C72oNAZfB*pk1PBlyK!5-N0t5&UAV7cs0RjXF z5FkK+009C72oNAZfB*pk1PBlyK!5-N0t5&UAV7cs0RjXF5FkK+009C72oNAZfB*pk z1PBlyK!5-N0t5&UAV7cs0RjXF5FkK+009C72oNAZfB*pk1PBlyK!5-N0t5&UAV7cs V0RjXF5FkK+009C72z;3Z{vW%}t=s?r literal 0 HcmV?d00001 diff --git a/notebooks/datafusion-table-provider-for-adbc.ipynb b/notebooks/datafusion-table-provider-for-adbc.ipynb new file mode 100644 index 0000000..601b8ac --- /dev/null +++ b/notebooks/datafusion-table-provider-for-adbc.ipynb @@ -0,0 +1,276 @@ +{ + "cells": [ + { + "cell_type": "markdown", + "id": "a1b2c3d4-e5f6-7890-abcd-ef1234567890", + "metadata": {}, + "source": [ + "[Apache DataFusion](https://datafusion.apache.org/) is an extensible query engine written in Rust that uses [Apache Arrow](https://arrow.apache.org/) as its in-memory format. One of its powerful features is table providers—an abstraction that allows DataFusion to query data from virtually any source while presenting a unified SQL interface. The [datafusion-table-providers](https://github.com/datafusion-contrib/datafusion-table-providers) crate offers ready-made table provider implementations for common data sources, including databases accessible via ADBC.\n", + "\n", + "[ADBC](https://arrow.apache.org/adbc/) (Arrow Database Connectivity) is a database-agnostic API that retrieves query results directly in Arrow format, eliminating serialization overhead. This makes it an efficient bridge between DataFusion and external databases like DuckDB, Snowflake, BigQuery, PostgreSQL, MySQL, and others with ADBC drivers.\n", + "\n", + "In this notebook, you will:\n", + "\n", + "1. Load an ADBC driver (DuckDB) and connect to a database.\n", + "2. Create an ADBC connection pool and table factory.\n", + "3. Register an external database table as a DataFusion table provider.\n", + "4. Query the data through DataFusion's SQL interface." + ] + }, + { + "cell_type": "markdown", + "id": "33b1e776-ebb0-48ed-8284-c73e25f3c1e1", + "metadata": {}, + "source": [ + "Install the DuckDB ADBC driver with [uv](https://docs.astral.sh/uv/) and [dbc](https://docs.columnar.tech/dbc/):" + ] + }, + { + "cell_type": "code", + "execution_count": null, + "id": "e0f14d77-9832-4f7a-9d3f-ffb10d93f6ef", + "metadata": {}, + "outputs": [], + "source": [ + "!uvx dbc install -q duckdb" + ] + }, + { + "cell_type": "markdown", + "id": "e5dc6c5f-babd-424b-81aa-bc4c0a6f983b", + "metadata": {}, + "source": [ + "Load the required crates:" + ] + }, + { + "cell_type": "code", + "execution_count": 2, + "id": "cf9cf722-d25d-4287-8616-64526a8f67ed", + "metadata": { + "vscode": { + "languageId": "rust" + } + }, + "outputs": [], + "source": [ + ":dep adbc_core = { version = \"0.21\" }\n", + ":dep adbc_driver_manager = { version = \"0.21\" }\n", + ":dep datafusion = { version = \"52.0\", default-features = false, features = [\"sql\"] }\n", + ":dep datafusion-table-providers = { version = \"0.10.1\", features = [\"adbc\"] }" + ] + }, + { + "cell_type": "markdown", + "id": "6860554e-0d0f-400f-b52c-7247883c9d8a", + "metadata": {}, + "source": [ + "Import the necessary types:" + ] + }, + { + "cell_type": "code", + "execution_count": 3, + "id": "fe14b884", + "metadata": { + "vscode": { + "languageId": "rust" + } + }, + "outputs": [], + "source": [ + "use adbc_core::options::{AdbcVersion, OptionDatabase};\n", + "use adbc_core::{Driver, LOAD_FLAG_DEFAULT};\n", + "use adbc_driver_manager::ManagedDriver;\n", + "use datafusion::prelude::SessionContext;\n", + "use datafusion::sql::TableReference;\n", + "use datafusion_table_providers::adbc::AdbcTableFactory;\n", + "use datafusion_table_providers::sql::db_connection_pool::adbcpool::ADBCPool;\n", + "use std::sync::Arc;" + ] + }, + { + "cell_type": "markdown", + "id": "bef3deb5-8692-4284-a38a-be9dc870994b", + "metadata": {}, + "source": [ + "Load the DuckDB ADBC driver and create a database handle:" + ] + }, + { + "cell_type": "code", + "execution_count": 4, + "id": "eb04f0f0-de9e-4b1a-8c28-cdeadc84cbf4", + "metadata": { + "vscode": { + "languageId": "rust" + } + }, + "outputs": [], + "source": [ + "let mut driver = ManagedDriver::load_from_name(\n", + " \"duckdb\",\n", + " None,\n", + " AdbcVersion::default(),\n", + " LOAD_FLAG_DEFAULT,\n", + " None,\n", + ")\n", + ".unwrap();\n", + "\n", + "let database = driver\n", + " .new_database_with_opts([(OptionDatabase::Uri, \"../data/penguins.duckdb\".into())])\n", + " .unwrap();" + ] + }, + { + "cell_type": "markdown", + "id": "ae93a625-425e-46eb-8dca-1a5837590b7d", + "metadata": {}, + "source": [ + "Create an ADBC connection pool and table factory:" + ] + }, + { + "cell_type": "code", + "execution_count": 5, + "id": "88ca022f-2793-49e5-894e-40fb187ccde5", + "metadata": { + "vscode": { + "languageId": "rust" + } + }, + "outputs": [], + "source": [ + "let adbc_pool = Arc::new(ADBCPool::new(database, None).unwrap());\n", + "let table_factory = AdbcTableFactory::new(adbc_pool.clone());" + ] + }, + { + "cell_type": "markdown", + "id": "18384331-ba9e-4381-b92d-b939114b4414", + "metadata": {}, + "source": [ + "Create a DataFusion session context:" + ] + }, + { + "cell_type": "code", + "execution_count": 6, + "id": "5041cf26-3de4-48be-a8ee-6a904c4aab02", + "metadata": { + "vscode": { + "languageId": "rust" + } + }, + "outputs": [], + "source": [ + "let ctx = SessionContext::new();" + ] + }, + { + "cell_type": "markdown", + "id": "6b23b8d7-4472-4bd2-a62d-40e52885b189", + "metadata": {}, + "source": [ + "Register the `penguins` table from DuckDB as a DataFusion table using the ADBC table factory:" + ] + }, + { + "cell_type": "code", + "execution_count": 7, + "id": "72fa1c20-1e19-46d7-b04b-50a5747866c3", + "metadata": { + "vscode": { + "languageId": "rust" + } + }, + "outputs": [ + { + "data": { + "text/plain": [ + "None" + ] + }, + "execution_count": 7, + "metadata": {}, + "output_type": "execute_result" + } + ], + "source": [ + "ctx.register_table(\n", + " \"penguins\",\n", + " table_factory\n", + " .table_provider(TableReference::bare(\"penguins\"), None)\n", + " .await\n", + " .unwrap(),\n", + ")\n", + ".unwrap()" + ] + }, + { + "cell_type": "markdown", + "id": "e34fa879-f3ed-497a-a610-7a6e74abcee3", + "metadata": {}, + "source": [ + "Execute a SQL query through DataFusion (which fetches data from DuckDB via ADBC) and display the results:" + ] + }, + { + "cell_type": "code", + "execution_count": 9, + "id": "33441f8d-32c2-473f-96a3-aef80d4c4f5a", + "metadata": { + "vscode": { + "languageId": "rust" + } + }, + "outputs": [ + { + "name": "stdout", + "output_type": "stream", + "text": [ + "+---------+-----------+----------------+---------------+-------------------+-------------+--------+------+\n", + "| species | island | bill_length_mm | bill_depth_mm | flipper_length_mm | body_mass_g | sex | year |\n", + "+---------+-----------+----------------+---------------+-------------------+-------------+--------+------+\n", + "| Adelie | Torgersen | 39.1 | 18.7 | 181 | 3750 | male | 2007 |\n", + "| Adelie | Torgersen | 39.5 | 17.4 | 186 | 3800 | female | 2007 |\n", + "| Adelie | Torgersen | 40.3 | 18.0 | 195 | 3250 | female | 2007 |\n", + "| Adelie | Torgersen | | | | | | 2007 |\n", + "| Adelie | Torgersen | 36.7 | 19.3 | 193 | 3450 | female | 2007 |\n", + "| Adelie | Torgersen | 39.3 | 20.6 | 190 | 3650 | male | 2007 |\n", + "| Adelie | Torgersen | 38.9 | 17.8 | 181 | 3625 | female | 2007 |\n", + "| Adelie | Torgersen | 39.2 | 19.6 | 195 | 4675 | male | 2007 |\n", + "| Adelie | Torgersen | 34.1 | 18.1 | 193 | 3475 | | 2007 |\n", + "| Adelie | Torgersen | 42.0 | 20.2 | 190 | 4250 | | 2007 |\n", + "+---------+-----------+----------------+---------------+-------------------+-------------+--------+------+\n" + ] + } + ], + "source": [ + "let df = ctx\n", + " .sql(\"SELECT * FROM datafusion.public.penguins LIMIT 10\")\n", + " .await\n", + " .unwrap();\n", + "\n", + "df.show().await.unwrap();" + ] + } + ], + "metadata": { + "kernelspec": { + "display_name": "Rust", + "language": "rust", + "name": "rust" + }, + "language_info": { + "codemirror_mode": "rust", + "file_extension": ".rs", + "mimetype": "text/rust", + "name": "Rust", + "pygment_lexer": "rust", + "version": "" + } + }, + "nbformat": 4, + "nbformat_minor": 5 +} diff --git a/registry.json b/registry.json index 3c9ad69..dd0aed5 100644 --- a/registry.json +++ b/registry.json @@ -134,5 +134,13 @@ "authors": ["ian-cook"], "description": "Define reusable, named connection configurations in TOML files and use them to connect to databases with ADBC, just like ODBC DSNs.", "categories": ["Database Connections"] + }, + { + "title": "DataFusion Table Provider for ADBC", + "path": "notebooks/datafusion-table-provider-for-adbc.ipynb", + "date": "2026-04-17", + "authors": ["emil-sadek"], + "description": "", + "categories": ["Database Connections"] } ] From e70a78b35ab895726940e12c5f2e12973d927906 Mon Sep 17 00:00:00 2001 From: Emil Sadek Date: Fri, 17 Apr 2026 15:08:35 -0700 Subject: [PATCH 2/3] fix: horizontal scroll for cells --- template/index.html.j2 | 8 -------- template/static/style.css | 9 +++++++++ 2 files changed, 9 insertions(+), 8 deletions(-) diff --git a/template/index.html.j2 b/template/index.html.j2 index 84a6228..9a0ec91 100644 --- a/template/index.html.j2 +++ b/template/index.html.j2 @@ -33,14 +33,6 @@ {%- block body_footer -%} - {% include 'components/footer.html.j2' %} {% include 'components/site-footer.html.j2' %} diff --git a/template/static/style.css b/template/static/style.css index 9f67613..4f0bbf4 100644 --- a/template/static/style.css +++ b/template/static/style.css @@ -68,6 +68,15 @@ div.jp-RenderedText pre { font-style: normal; } +.jp-RenderedText pre { + overflow-x: auto; + white-space: pre !important; +} + +.jp-InputArea-editor pre { + overflow-x: auto; +} + #navbar { font-family: var(--sans-serif); font-size: 1rem; From 17f003a2fc5b7c21c9be3752e515d2e94a42bc1e Mon Sep 17 00:00:00 2001 From: Emil Sadek Date: Thu, 23 Apr 2026 16:37:09 -0700 Subject: [PATCH 3/3] refactor: improve ADBC table provider description --- notebooks/datafusion-table-provider-for-adbc.ipynb | 8 ++++++-- 1 file changed, 6 insertions(+), 2 deletions(-) diff --git a/notebooks/datafusion-table-provider-for-adbc.ipynb b/notebooks/datafusion-table-provider-for-adbc.ipynb index 601b8ac..5b46175 100644 --- a/notebooks/datafusion-table-provider-for-adbc.ipynb +++ b/notebooks/datafusion-table-provider-for-adbc.ipynb @@ -7,7 +7,7 @@ "source": [ "[Apache DataFusion](https://datafusion.apache.org/) is an extensible query engine written in Rust that uses [Apache Arrow](https://arrow.apache.org/) as its in-memory format. One of its powerful features is table providers—an abstraction that allows DataFusion to query data from virtually any source while presenting a unified SQL interface. The [datafusion-table-providers](https://github.com/datafusion-contrib/datafusion-table-providers) crate offers ready-made table provider implementations for common data sources, including databases accessible via ADBC.\n", "\n", - "[ADBC](https://arrow.apache.org/adbc/) (Arrow Database Connectivity) is a database-agnostic API that retrieves query results directly in Arrow format, eliminating serialization overhead. This makes it an efficient bridge between DataFusion and external databases like DuckDB, Snowflake, BigQuery, PostgreSQL, MySQL, and others with ADBC drivers.\n", + "[ADBC](https://arrow.apache.org/adbc/) (Arrow Database Connectivity) is a database-agnostic API that retrieves query results directly in Arrow format, making it an efficient bridge between DataFusion and external databases. This demo uses DuckDB for simplicity, but ADBC's real value is providing DataFusion with access to more than a dozen different data systems that lack dedicated table providers.\n", "\n", "In this notebook, you will:\n", "\n", @@ -29,7 +29,11 @@ "cell_type": "code", "execution_count": null, "id": "e0f14d77-9832-4f7a-9d3f-ffb10d93f6ef", - "metadata": {}, + "metadata": { + "vscode": { + "languageId": "rust" + } + }, "outputs": [], "source": [ "!uvx dbc install -q duckdb"