Skip to content
Pipelines

Pipelines

A pipeline describes what to read, how to type it and which rules to run. Full reference: pipeline configuration.

Pipeline file

ItemDetail
FormatsLocal .yaml, .yml or .json; JSON is strict RFC syntax
Shared validationDuplicate keys, shape, exact numbers, defaults, semantics
Top-level keysconfig_version, name, version, context, source, input, transforms, execution, output, rules, dataset_rules, stats
$schemaTop-level key accepted and ignored in JSON and YAML; in YAML a # yaml-language-server: $schema=… modeline also works (editor support)
CLI overrides-i/-o replace input/output; explicit execution flags override the document
Relative pathsSources, output, references, mappings and schema files resolve from the pipeline’s directory

Inputs and formats

SettingValues
source.urisOrdered list; local paths and s3:// URIs can mix
source.prefix + filter, recursiveDeterministic, sorted discovery; exclusive with uris
input.typecsv, json (streamed top-level array of objects), ndjson (one object per nonblank line), parquet (flat schemas)
Type inferenceFrom source suffix when omitted; trailing .gz ignored for text formats; explicit type wins

All inputs form one logical dataset. Inputs must be replayable files or objects; stdin is not supported.

Input modes

input.modeBehaviour
infer_types (default)Infer types from up to infer_schema_length rows (default 1,000,000), then freeze; a later incompatible value is an input error
raw_stringsKeep non-null CSV values as UTF-8 strings; null markers (null_values, default NULL, null, N/A, n/a, "") stay distinct
OptionValuesEffect
on_type_errorrow_error (default), abortWith a declared schema: conversion failure becomes an INGEST_TYPE row issue, or stops the run
on_malformedabort (default), rejectSee malformed input

Declared schemas

input.schema sets exact target types instead of inference.

input:
  schema:
    extra_fields: error   # or ignore
    columns:
      id: {type: string, required: true, nullable: false}
      amount: {type: decimal, precision: 18, scale: 2}
  • Conversion failures become ingestion issues and rejects, never silent nulls.
  • extra_fields: error rejects undeclared fields; ignore selects only declared columns.
  • valet plan --format pipeline writes a schema block from a sample.

Type names

Any letter case. C fixed-width names (without _t), Python and Arrow/Parquet names are accepted; reports and valet plan print the last column.

ValuesWriteReported as
Signed integersint8, int16, int32, int64; int, integer = int64int8 … int64
Unsigned integersuint8, uint16, uint32, uint64uint8 … uint64
32-bit floatsfloat32float32
64-bit floatsfloat64, double; float = float64float64
Exact decimalsdecimal, decimal128 with precision (1–38) and scaledecimal
Booleansbool, booleanbool
Textstr, string, utf8, large_string, large_utf8string
Bytesbytes, binary, large_binarybinary
Datesdate, date32, date64date
Timestampsdatetime, timestamptimestamp
Nulls onlynullnull
  • int and float follow Python (64-bit). In C, Arrow (pyarrow prints float32 as float) and Parquet (FLOAT), float is 32-bit: write float32 there.
  • Names whose size or sign varies by platform (long, char, short, unsigned) are rejected with the spelling to use; int32_t → write int32:
input.schema column "qty" type "long" is not a supported type: long is 32-bit on Windows and 64-bit on Linux and macOS; write int32 or int64