New to Kestra?
Use blueprints to kickstart your first workflows.
Run cross-catalog ELT with Trino and Kestra. One INSERT SELECT moves daily Postgres orders into Iceberg, verifies the count, and notifies Slack.
Move data between systems with one SQL statement. Because Trino federates catalogs, an INSERT INTO iceberg... SELECT ... FROM postgres... is a complete extract-and-load pipeline, with no export files, no staging bucket, and no custom code. This blueprint runs that statement daily through io.kestra.plugin.jdbc.trino.Query, scoped to a single date taken from the schedule, then verifies the landed row count and posts it to Slack.
load_daily_orders (io.kestra.plugin.jdbc.trino.Query, fetchType: NONE) executes INSERT INTO iceberg.analytics.daily_orders SELECT ... FROM postgres.public.orders for exactly one order_date. The date literal is rendered from {{ (trigger.date ?? execution.startDate) | date('yyyy-MM-dd') }}, so scheduled runs load their own day and manual or backfill executions pick the right date automatically.verify_load (fetchType: FETCH_ONE) counts rows in the target table for the same date, returning a single loaded_rows scalar.notify posts the verified count and the loaded date to Slack; a run that inserted nothing reports 0 instead of silence.errors block posts a distinct Slack alert naming the possibly missing date.Schedule trigger runs the load daily at 05:00. Trino has no multi-statement transactions, so the load and the verification are deliberately separate single-statement tasks.The single statement is only a pipeline if something runs it every day, at the right date boundary, retries transient cluster failures, replays missed days, and tells someone when a day is missing. Kestra supplies the schedule, the trigger.date context that makes backfills exact rather than approximate, per-task retries, and the success and failure notifications, while the data movement itself stays inside Trino at full engine speed.
postgres catalog and an iceberg catalog, plus a target table matching iceberg.analytics.daily_orders with the same column layout as the SELECT.TRINO_URL: JDBC URL, e.g. jdbc:trino://host:443/iceberg/analytics (use https on 443 in production; password authentication requires TLS).TRINO_USERNAME: Trino username.TRINO_PASSWORD: Trino password.SLACK_WEBHOOK_URL: Slack incoming webhook URL.disabled: false on the daily trigger; use Kestra backfills to load historical dates.DELETE FROM iceberg.analytics.daily_orders WHERE order_date = DATE '...' task before the insert to make reloads idempotent.io.kestra.plugin.core.flow.ForEach.