Catalogs
S3, GCS, Azure & R2

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

TypeFields
S3Bucket, region, access key id, secret access key
GCSBucket, and an HMAC credentials JSON (interoperability keys, not a service-account key)
AzureContainer, storage account name and account key
Cloudflare R2Bucket, 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');