Parquet File Connector Guide
The Parquet File connector reads Apache Parquet columnar files from tenant-scoped storage. Use it to inspect table schema, page through large datasets (up to roughly 100 MB on disk), and feed rows into ProcessFlow transforms or DataPool loads.
Document information
| Field | Value |
|---|---|
| Canonical URL | /docs/04_connecting-systems/connectors/p/parquet-file |
| Version (published date) | 2026-06-09 |
| Tags | connectors, reference, parquet-file |
| Connector ID | parquet-file-1.0.0 |
Configuration and storage scope
Configure the integration with a tenant-relative folder and Parquet filename. The connector resolves files under storage/<tenant_id>/ and blocks directory traversal.
filename(required): target file name ending in.parquet(for exampleexports/orders.parquetis invalid—usepath+orders.parquet).path(optional): relative folder under tenant storage (for exampleexports).default_limit(optional): default row page size forreadwhenlimitis omitted (default1000, maximum5000).timeout_seconds(optional): operation timeout for large files (default120).
Paths containing .. are rejected.
Inspect schema with schema
Call schema before reading rows to discover column names, physical/logical types, row counts, and row-group layout. This reads Parquet footer metadata only—not the full file.
const integrationId = "<INTEGRATION_ID>";
const response = await tf.connector.execute(integrationId, "schema", {
include_row_groups: true
});
if (!response?.success) {
throw new Error(response?.error ?? "schema failed");
}
const columns = response.data?.columns ?? [];curl -X POST "https://api.example.com/api/v1/integrations/<ENTITY_ID>/execute" \
-H "X-API-Key: <API_KEY>" \
-H "X-Tenant-ID: <TENANT_ID>" \
-H "Content-Type: application/json" \
-d '{
"operation": "schema",
"data": {
"include_row_groups": true
}
}'
Read rows with read
Use paginated read calls for large files. Each response returns at most limit rows (default 1000, max 5000). Loop until has_more is false.
Optional callData:
offset— 0-based row offset (default0)limit— rows per pagecolumns— project top-level columns onlyrow_groups— advanced: restrict to specific row-group indices
const integrationId = "<INTEGRATION_ID>";
async function readAllRows() {
let offset = 0;
const limit = 1000;
const rows: Record<string, unknown>[] = [];
for (;;) {
const page = await tf.connector.execute(integrationId, "read", {
offset,
limit,
columns: ["id", "amount", "created_at"]
});
if (!page?.success) throw new Error(page?.error ?? "read failed");
rows.push(...((page.data?.rows as Record<string, unknown>[]) ?? []));
if (!page.data?.has_more) break;
offset = Number(page.data?.next_offset ?? offset + limit);
}
return rows;
}For DataPool ingestion, insert each page inside the loop instead of accumulating all rows in memory.
Validate connectivity with test
Run test during integration setup to confirm the file exists, is readable, and contains valid Parquet metadata.
curl -X POST "https://api.example.com/api/v1/integrations/<ENTITY_ID>/execute" \
-H "X-API-Key: <API_KEY>" \
-H "X-Tenant-ID: <TENANT_ID>" \
-H "Content-Type: application/json" \
-d '{ "operation": "test" }'
Staging files in tenant storage
Parquet files often arrive through SFTP, S3, or WebApp uploads into processdata/<execution_id>/. Point the integration path and filename at the staged location, or copy the file into a stable folder (for example exports/) before scheduling reads.
Large files and compression
The connector uses range-based I/O and row-group-aware reads. Files around 100 MB are supported when you paginate read responses.
| Codec | Support |
|---|---|
| Uncompressed | Yes |
| Snappy | Yes |
| GZip, ZSTD, Brotli, LZ4 | Yes (via bundled decompressors) |
Type mapping
| Parquet | JSON in responses |
|---|---|
| INT32 / INT64 | number (or string if outside safe integer range) |
| FLOAT / DOUBLE | number |
| BOOLEAN | boolean |
| STRING / UTF8 | string |
| TIMESTAMP | ISO 8601 string |
| BYTE_ARRAY (binary) | { "encoding": "base64", "value": "..." } |
| Nested struct / list | JSON object or array (when present in file) |
Reliability guidance
- Call
schemaonce per file version before mapping fields. - Keep
limitat or below1000for wide rows. - Check
successon every connector response. - Prefer inserting each page into DataPool rather than holding the full dataset in a single step variable.