Skip to main content
Columnar segment processing builds Pinot segments column by column instead of converting every input record into rows first. It is designed for columnar input formats such as Parquet and for workflows that rebuild existing Pinot segments. For large Parquet ingestion jobs, columnar processing can reduce intermediate storage and improve segment generation throughput because the minion reads source columns directly into Pinot indexes.
Columnar segment processing is an opt-in task configuration. Keep row-based processing as the default until compare mode succeeds for your table.

When to use it

Supported task types

Additional segment rewrite tasks may use the same task properties as support is added in StarTree releases.

Configuration properties

Set these properties in the task config for the segment-building task.

Enable compare mode for FileIngestionTask

Compare mode is the safest migration path. It builds row-based and columnar output for the same input and fails the task if the generated segments differ.
Use tableMaxNumTasks=1 during compare mode so the validation run does not consume unnecessary minion capacity. Look for minion log messages that report row-based and columnar timings and whether segment comparison succeeded. If comparison fails, keep row-based processing enabled and inspect the columns reported in the comparison error.

Enable columnar processing

After compare mode succeeds on representative input, turn compare mode off and enable columnar processing.
You can also trigger an ad hoc ingestion with the same task configs:

Memory tuning

Columnar processing keeps active column data, partition mapping, stats collectors, and segment index creators in memory. Memory use grows with:
  • Number of active partitions in one task.
  • Number of concurrently built segments.
  • Column cardinality and configured indexes.
  • Parquet file width and nested column size.
If a task runs out of memory:

Behavioral differences to check

Columnar output is often closer to the Parquet source representation, but it can differ from row-based processing in edge cases.

Dependent transforms

Row-based processing evaluates all transforms for a row before final type conversion. Columnar processing can type-convert a derived column before a later derived column reads it. For example, if transformA is declared as INT and transformB uses transformA, columnar processing may use the converted integer value while row-based processing uses the intermediate expression value. Validate dependent transforms in compare mode before enabling columnar processing.

Nested Parquet values

Parquet struct and nested values can be represented differently from row-based conversion. For example, row-based conversion may stringify booleans or wrap nested values, while columnar processing preserves the Parquet value shape more directly.

Unsupported features

If the task detects unsupported features, it can fall back to row-based processing. Watch minion logs when using:
  • Sorted columns.
  • Complex type transformers.
  • Filter functions.
  • Partition transform functions.
  • Rollup or aggregation merge types.

Troubleshooting