Export Dataset to Parquet - Typed Schema for DuckDB & BigQuery avatar

Export Dataset to Parquet - Typed Schema for DuckDB & BigQuery

Pricing

$2.00 / 1,000 1,000 rows converteds

Go to Apify Store
Export Dataset to Parquet - Typed Schema for DuckDB & BigQuery

Export Dataset to Parquet - Typed Schema for DuckDB & BigQuery

Apify exports JSON, CSV and Excel but not Parquet. Pick any dataset and get typed Parquet files (inferred schema, flattened nested fields, detected timestamps) in the key-value store, optionally pushed to S3, R2 or Google Cloud Storage. Ready for DuckDB, BigQuery, Athena.

Pricing

$2.00 / 1,000 1,000 rows converteds

Rating

0.0

(0)

Developer

mohamed alaya

mohamed alaya

Maintained by Community

Actor stats

0

Bookmarked

2

Total users

1

Monthly active users

15 days ago

Last modified

Share

Converts any Apify dataset (or pasted JSON/CSV rows) into typed Parquet files, saved in the key-value store and optionally uploaded to Amazon S3, an S3-compatible service or Google Cloud Storage. For data engineers and analysts who load scrapes into DuckDB, BigQuery, Athena or Spark and are tired of CSV type guessing: Apify exports JSON, CSV, Excel, XML and RSS, but not Parquet.

Quick start

  1. Run any scraper, then start this Actor and pick that run's dataset in Dataset(s) to convert.
  2. Open the run's key-value store: dataset.parquet is there, with a SCHEMA record that lists every column and type.
  3. Query it: SELECT * FROM read_parquet('dataset.parquet') in DuckDB, or load it into BigQuery / Athena / Spark.

Run with empty input to convert a demo of 1,500 nested order rows.

Input examples

1. Dataset from a scraper

{ "datasets": ["<pick with the dataset picker>"], "fileName": "google-maps-2026-10" }

2. Pasted rows

{ "rows": [{ "id": 1, "customer": { "name": "Ann" }, "tags": ["a", "b"], "createdAt": "2026-05-01T10:00:00Z" }] }

3. Dataset to Parquet files in S3 as well

{
"datasets": ["<pick with the dataset picker>"],
"s3Bucket": "my-data-lake", "s3Region": "eu-west-1", "s3KeyPrefix": "scrapes/",
"s3AccessKeyId": "AKIA...", "s3SecretAccessKey": "..."
}

Input guide

FieldWhat it does
datasetsPick one or more datasets; they are appended into one schema.
rows, rowsCsvPaste JSON rows, a JSON array or CSV (numbers and true/false in CSV are detected).
fileNameBase name of the output file(s).
nestedFieldsflatten (a.b becomes column a_b) or json (keep nested objects as one JSON column). Arrays are always JSON columns.
inferDatesColumns of ISO 8601 dates/date-times become TIMESTAMP (no time zone = UTC).
sanitizeColumnNamesLetters, digits and _ only, unique names (needed for BigQuery and Athena).
rowsPerFile / maxRowsSplit big datasets into several files / safety limit.
s3*Optional S3 or S3-compatible upload (set s3Endpoint for Cloudflare R2, MinIO, Backblaze B2).
gcs*Optional Google Cloud Storage upload with a service-account JSON key.

Credentials are marked secret, so Apify stores them encrypted. Use a key that can only write to one bucket.

Output

The dataset has one row per Parquet file:

FieldMeaning
fileNameKey of the file in the run's key-value store.
urlAPI URL of the file (needs your Apify token or a logged-in browser).
rows, columns, bytesSize of the file.
schemaColumn name to Parquet type (INT32, INT64, DOUBLE, BOOLEAN, TIMESTAMP, STRING, JSON).
uploadsResult of each S3 / GCS upload: ok with the location, or the error.

Type rules: a column with only integers is INT32 (INT64 if any value is larger), integers mixed with decimals become DOUBLE, true/false is BOOLEAN, ISO dates are TIMESTAMP, nested arrays are JSON, and a column that mixes incompatible types (for example numbers and text) is stored as STRING. Empty values become NULL.

Sample row:

{ "type": "parquet-file", "fileName": "dataset.parquet", "rows": 1500, "columns": 9, "bytes": 40021, "schema": { "orderId": "INT32", "customer_name": "STRING", "total": "DOUBLE", "paid": "BOOLEAN", "createdAt": "TIMESTAMP", "tags": "JSON" }, "uploads": [] }

Use it with

Any scraper -> this Actor -> DuckDB / BigQuery / Athena / Snowflake. Chain it with the Google Maps scraper and the other data-cleaning Actors from the same author (names, countries, hours) before exporting.

FAQ

Why not CSV? CSV loses types (everything is text), mangles nested data and is 5 to 10 times bigger.

Does it use DuckDB? It uses a pure JavaScript Parquet writer (hyparquet-writer, Snappy compression), so there is no native build to break. The output was checked by reading it back with DuckDB.

Is BigQuery fine with the JSON columns? BigQuery loads them as STRING; DuckDB reads them as JSON. Use nestedFields: flatten and avoid arrays if you need pure scalar columns.

Honest limits

  • The S3 and GCS uploads are plain single-request uploads (fine up to roughly 1 to 2 GB per file; lower rowsPerFile for bigger data). They are built on the standard signing protocols but were not tested against every provider.
  • All rows of one file are held in memory while it is written (the dataset itself is streamed). Keep rowsPerFile modest for very wide rows.
  • Schemas are inferred from all rows; there is no way to force a type per column yet.

Price

Pay per event: $0.002 per 1,000 rows written to Parquet (billed per started 1,000 rows of each file; failed files and the uploads are free). 100,000 rows = $0.20, 1 million rows = $2.