Loading exported Parquet into a warehouse
Exports land under {prefix}/signal=<signal>/dt=<YYYY-MM-DD>/hh=<HH>/, Hive-style, so most engines discover the partitions by path.
Athena / Trino:
CREATE EXTERNAL TABLE … PARTITIONED BY (signal string, dt string, hh string) STORED AS PARQUET LOCATION 's3://bucket/prefix/', thenMSCK REPAIR TABLE.BigQuery: external table over
gs://bucket/prefix/*with hive partitioning modeAUTO.Snowflake: external stage on the prefix,
COPY INTO … FILE_FORMAT = (TYPE = PARQUET) MATCH_BY_COLUMN_NAME = CASE_INSENSITIVE.DuckDB:
SELECT * FROM read_parquet('s3://bucket/prefix/**/*.parquet', hive_partitioning = true).Iceberg destinations are appended as one snapshot per window; a snapshot summary property
watchtower-commit-key({schedule}:{window_start}) makes a repeated commit a no-op.
Delivery is at-least-once: a window whose cursor update was lost is rewritten to the same key, so file loads are safe to repeat; deduplicate on the full row when appending to a table from two overlapping runs.