New to Kestra?
Use blueprints to kickstart your first workflows.
Automate ZIP to Parquet conversion in Kestra. Download a monthly CSV archive, unzip it, and transform it with pandas and pyarrow on Docker.
Turn raw, compressed CSV drops into clean, analytics-ready Parquet files on a predictable schedule. This blueprint shows a complete ETL pattern in Kestra: pull a monthly ZIP archive from a public HTTPS endpoint, decompress it, and convert the extracted CSV to columnar Parquet using pandas and pyarrow inside a Docker task runner. It is a reusable template for any pipeline that lands compressed CSV data and needs to prepare it for lakehouses, warehouses, or DuckDB and Spark queries.
The flow computes a file_id variable from execution.startDate shifted back three months, formatted as yyyyMM. That id is reused across tasks so each run targets a different monthly archive.
get_zipfile uses io.kestra.plugin.core.http.Download to fetch https://divvy-tripdata.s3.amazonaws.com/{file_id}-divvy-tripdata.zip over HTTPS into Kestra's internal storage.unzip uses io.kestra.plugin.compress.ArchiveDecompress with algorithm: ZIP to decompress the archive and expose the inner files via outputs.unzip.files.parquet_output runs io.kestra.plugin.scripts.python.Script on the io.kestra.plugin.scripts.runner.docker.Docker task runner. It installs pandas and pyarrow as dependencies, reads {file_id}-divvy-tripdata.csv with pd.read_csv, writes {file_id}.parquet with df.to_parquet, and captures the result through outputFiles: ["*.parquet"].file_id math produces the same target archive every time.Pandas and pyarrow have no scheduler, no retry policy, and no lineage. Kestra adds event and time triggers, automatic retries on flaky HTTP downloads, full execution history with inputs and outputs, and a declarative YAML definition you can version in Git. The Docker task runner isolates Python dependencies per execution, so upgrading pandas in one flow never breaks another.
divvy-tripdata.s3.amazonaws.com (or your own ZIP source).None. The source archive is public. If you adapt this flow to an authenticated endpoint, add the credentials as Kestra secrets and reference them with {{ secret('NAME') }}.
company.team.parquet_output task outputs to download or pass the file to a follow-up task.0 9 1 * *) to run on the first of every month.algorithm accordingly.io.kestra.plugin.scripts.python.Commands to run a versioned repo of transformations.io.kestra.plugin.jdbc.duckdb.Query or load it into BigQuery, Snowflake, or Postgres.