FoodMart sample datasets
FoodMart is the classic OLAP sample dataset — a fictional grocery chain with five years of sales data across 37 tables (customer, product, store, time_by_day, sales_fact_1997, etc.). It’s the same dataset Saiku Cloud’s demo box uses, sized for fast iteration (~10 MB compressed) and shaped so every Mondrian feature has something to exercise.
This page lets you load FoodMart into your own test instance of any supported dialect, so you can connect it to Saiku Cloud via the regular BYOC flow and follow the Sign up & first cube walkthrough end-to-end. No warehouse migration required.
What’s included
All bundles include:
- The data — 37 tables loaded with five years of sales, customers, products, stores, employees, and inventory.
- Mondrian schema XML (
foodmart.xml) — upload this to Saiku Cloud’s Schema designer once your data is loaded. The XML is dialect-neutral; it works against any of the bundles below. - A reference loader script or runbook — per-dialect, since each warehouse has its own bulk-load semantics.
The Postgres dump is the canonical source. Every other dialect
bundle is mechanically translated from it (a small sed script
per dialect — see each tab below).
Per-dialect bundles
Postgres 12+ — load directly via pg_restore or psql.
# Download (9.1 MB compressed, ~95 MB uncompressed)curl -L https://raw.githubusercontent.com/spiculedata/saiku-cloud/develop/infra/foodmart-pg/init/01-foodmart.sql.gz \ -o foodmart.sql.gzcurl -L https://raw.githubusercontent.com/spiculedata/saiku-cloud/develop/infra/foodmart-pg/init/02-date-string-column.sql \ -o foodmart-date-string.sql
# Load (Postgres 12+; pipes the gzipped dump into psql)createdb foodmartgunzip -c foodmart.sql.gz | psql -d foodmartpsql -d foodmart -f foodmart-date-string.sqlThe 02-date-string-column.sql step adds an ALTER TABLE that
Saiku’s time_by_day schema expects — it’s a one-line date_string
column populated from the_date. Always run it after the bulk
load.
Connect with: PostgreSQL guide.
MySQL 5.7+ or MariaDB 10+ — load via a small sed translation of the Postgres dump.
# Download the source PG dump + the MySQL translation scriptcurl -L https://raw.githubusercontent.com/spiculedata/saiku-cloud/develop/infra/foodmart-pg/init/01-foodmart.sql.gz \ -o foodmart.sql.gzcurl -L https://raw.githubusercontent.com/spiculedata/saiku-cloud/develop/infra/hosts/app/foodmart-mysql/pg-to-mysql.sed \ -o pg-to-mysql.sed
# Translate + load (5 sed rules: type names, identifier quoting,# COPY → INSERT, sequence handling, schema-qualifier strip)gunzip -c foodmart.sql.gz | sed -E -f pg-to-mysql.sed > foodmart-mysql.sql
mysql -u root -p -e "CREATE DATABASE foodmart CHARACTER SET utf8mb4;"mysql -u root -p foodmart < foodmart-mysql.sqlConnect with: MySQL guide.
ClickHouse 23+ (Cloud or self-hosted) — the per-dialect loader pattern lives in the saiku-cloud repo. Adapt or copy from there.
# Translation script for ClickHouse (3 sed rules: type mappings# for INT/VARCHAR, single-quote vs double-quote identifiers, and# DDL preamble — ClickHouse needs explicit engine declarations).curl -L https://raw.githubusercontent.com/spiculedata/saiku-cloud/develop/infra/foodmart-pg/init/01-foodmart.sql.gz \ -o foodmart.sql.gz# Per-dialect translation rules are in the saiku-cloud loader# scripts under infra/hosts/app/foodmart-clickhouse/ — reuse them# to drive your own ClickHouse load.For ClickHouse Cloud, the easiest path is loading via the web SQL console once you’ve translated the dump locally.
Connect with: ClickHouse guide.
Snowflake — use the PUT + COPY INTO flow. The loader
runbook for Saiku’s own CI fixture lives in the saiku-cloud
repo at
docs/runbooks/load-foodmart-into-snowflake.md.
Adapt for your account:
-
Translate the Postgres dump for Snowflake (sed script in the
infra/hosts/app/foodmart-snowflake/folder of the repo). -
Split into per-table CSVs (the dump’s mixed DDL/DML doesn’t
COPY INTOcleanly). -
PUTeach CSV onto a Snowflake stage, thenCOPY INTO <table> FROM @<stage>per table. -
Apply the
date_stringALTER (same as Postgres).
Connect with: Snowflake guide.
BigQuery — the loader exports the canonical FoodMart DuckDB
file to Parquet (auto-schema-detected by BigQuery) and uploads
via load_table_from_file. ~10 MB total, free-tier-friendly
(1 TB queries/month + 10 GB storage included).
The runbook is at
docs/runbooks/load-foodmart-into-bigquery.md
in the saiku-cloud repo. Short version:
-
Create a BigQuery dataset (e.g.
foodmart). -
Set env vars:
GCP_PROJECT,BQ_DATASET,GOOGLE_APPLICATION_CREDENTIALS(service-account JSON). -
Run the loader:
Terminal window curl -L https://raw.githubusercontent.com/spiculedata/saiku-cloud/develop/infra/hosts/app/foodmart-bigquery/load-foodmart-bigquery.py \-o load-foodmart-bigquery.pypip install google-cloud-bigquery pyarrow duckdbpython load-foodmart-bigquery.py -
Total load time: 3–6 minutes (one LoadJob per table, ~5–10s each).
Connect with: BigQuery guide.
MotherDuck — load the same DuckDB file format MotherDuck
uses. Easiest path: load locally into a .duckdb file via the
DuckDB CLI, then push it to MotherDuck with ATTACH 'md:<db>'.
-
Build the FoodMart DuckDB file locally:
Terminal window curl -L https://raw.githubusercontent.com/spiculedata/saiku-cloud/develop/infra/hosts/app/foodmart-duckdb/build-foodmart-duckdb.sh \-o build-foodmart-duckdb.shcurl -L https://raw.githubusercontent.com/spiculedata/saiku-cloud/develop/infra/hosts/app/foodmart-duckdb/pg-to-duckdb.sed \-o pg-to-duckdb.sedcurl -L https://raw.githubusercontent.com/spiculedata/saiku-cloud/develop/infra/foodmart-pg/init/01-foodmart.sql.gz \-o foodmart.sql.gzchmod +x build-foodmart-duckdb.sh./build-foodmart-duckdb.sh# → produces foodmart.duckdb (~12 MB) -
Push to MotherDuck via the DuckDB CLI:
Terminal window export motherduck_token=<your-md-token>duckdb -c "ATTACH 'foodmart.duckdb' AS local; \ATTACH 'md:?motherduck_token=$motherduck_token' AS md; \CREATE OR REPLACE DATABASE md.foodmart FROM local;"
Connect with: MotherDuck guide.
Local DuckDB file — the simplest path. One ~12 MB file you can upload directly to Saiku Cloud’s Files dashboard and reference from your Mondrian schema.
curl -L https://raw.githubusercontent.com/spiculedata/saiku-cloud/develop/infra/hosts/app/foodmart-duckdb/build-foodmart-duckdb.sh \ -o build-foodmart-duckdb.shcurl -L https://raw.githubusercontent.com/spiculedata/saiku-cloud/develop/infra/hosts/app/foodmart-duckdb/pg-to-duckdb.sed \ -o pg-to-duckdb.sedcurl -L https://raw.githubusercontent.com/spiculedata/saiku-cloud/develop/infra/foodmart-pg/init/01-foodmart.sql.gz \ -o foodmart.sql.gzchmod +x build-foodmart-duckdb.sh./build-foodmart-duckdb.sh# → produces foodmart.duckdbUpload foodmart.duckdb via the Files dashboard;
Saiku Cloud automatically exposes it as a connection.
Connect with: DuckDB-file guide.
After the load: upload the Mondrian schema
Once your dialect of choice has FoodMart loaded, the last step is the Mondrian schema XML. It maps your physical tables to OLAP cubes (Sales, Warehouse, HR, etc.):
-
Download the schema XML:
Terminal window curl -L https://raw.githubusercontent.com/spiculedata/saiku-cloud/develop/infra/scripts/demo-seeds/foodmart.xml \-o foodmart.xml -
In Saiku Cloud, go to the Schemas dashboard and click Upload schema. Pick
foodmart.xml. -
The Schema designer cross-checks every
<Table>reference against your connection. If validation passes (green check on every cube), your FoodMart is ready to query. -
Head to the Analyze dashboard. Pick any cube. Drag
[Measures].[Unit Sales]to the rows shelf,[Time].[Year]to the columns shelf. You should see the year 1997 = 266,773.
That’s the same number every dialect produces — the canonical proof that Saiku Cloud is reading your data correctly.
Bundled .duckdb file for the impatient
If you want zero-translation, zero-setup, here’s the pre-built FoodMart DuckDB file directly — same one Saiku Cloud’s demo box uses, ~12 MB, ready to upload to the Files dashboard:
Direct download: see the
saiku-cloud releases
page for the latest foodmart-bundle-<version>.zip. The bundle
contains every artefact this page references — Postgres dump,
DuckDB file, schema XML, per-dialect translation scripts — in
one place.