S3, GCS, Azure Blob Storage & Cloudflare R2
Object-storage catalogs hold files, not tables. There is nothing to address
as catalog.schema.table; you read by path, and the catalog name resolves to
its bucket or container.
SELECT * FROM read_parquet('raw_files/events/2026/*.parquet');
SELECT * FROM read_csv('raw_files/exports/customers.csv');
SELECT * FROM read_json('raw_files/logs/*.jsonl');
SELECT * FROM read_xlsx('raw_files/finance/budget.xlsx');raw_files/ is the catalog name. It is rewritten to the real bucket URL with the
catalog's own credentials, so no s3:// URLs and no keys appear in your SQL.
What you need
| Type | Fields |
|---|---|
| S3 | Bucket, region, access key id, secret access key |
| GCS | Bucket, and an HMAC credentials JSON (interoperability keys, not a service-account key) |
| Azure | Container, storage account name and account key |
| Cloudflare R2 | Bucket, account ID, and an R2 API token's access key ID and secret access key (step-by-step setup) |
One catalog is one bucket or container — there is no prefix scoping, so a catalog grants access to everything in it. For anything shared, use a dedicated bucket and a read-only identity confined to it.
For R2, create the token under R2 → Manage API tokens with Object Read only, scoped to the one bucket. The account ID is the 32-character ID shown on the same page. Buckets in a jurisdiction (EU, FedRAMP) are not supported yet.
Hive partitioning
Partitioned layouts work, and the partition keys come back as columns:
SELECT partdate, count(*)
FROM read_json('raw_files/src_events/*/*.jsonl', hive_partitioning = true)
GROUP BY partdate
ORDER BY partdate;No discovery
These catalogs do not appear on the Tables page with a table list, because there is nothing to enumerate — files are not schemas. That is expected, not a failed refresh.
Excel specifics
read_xlsx is available everywhere, including in dbt models. One gotcha: xlsx
has no integer type, so whole numbers arrive as DOUBLE. Cast them if you plan
to join on them:
SELECT CAST(id AS BIGINT) AS id, name
FROM read_xlsx('raw_files/finance/budget.xlsx', sheet = 'Sheet2');