MergeOperator
Combines multiple PyArrow table inputs into a single table. Short name: merge · Category: Functional
Overview
The MergeOperator accepts two or more input tables and merges them using one of two strategies: row concatenation (stacking tables vertically) or column join (combining columns by document ID). Use it to recombine branches after parallel processing with BranchingOperator, or to merge documents from multiple ingest sources.
Key Features
- Two merge strategies: row concatenation and column join
- Column join supports inner join and full outer join
- Handles complex PyArrow types (lists, structs) in column merges
- Duplicate document detection in row merges (fails fast on collision)
- Column suffix applied automatically when column names conflict
Operator Configuration
{
"name": "merge_sources",
"type": "merge",
"depends_on": ["ingest_folder_1", "ingest_folder_2"],
"config": {
"merge_type": "rows", // "rows" or "columns"
"input_links": [
{ "link_name": "source1" },
{ "link_name": "source2" }
]
}
}
Parameters
| Parameter | Type | Required | Default | Description |
|---|---|---|---|---|
merge_type |
string |
Yes | — | "rows" to concatenate tables vertically; "columns" to join on the id column. |
column_option |
string |
Conditional | — | Required when merge_type is "columns". "inner_join" or "full_outer". |
input_links |
list[object] |
Yes | — | At least 2 link definitions. Each object has a link_name field matching a branch link_id. |
Output Columns
Row merge: output has the same columns as the input tables. Row count is the sum of all input tables.
Column merge: output has all columns from all input tables combined. Duplicate column names get a suffix based on their link_name (e.g. name_branch2). The id column is never suffixed.
Examples
Example 1: Merge two ingest sources (row merge)
{
"name": "merge_sources",
"type": "merge",
"depends_on": ["ingest_folder_1", "ingest_folder_2"],
"config": {
"merge_type": "rows",
"input_links": [
{ "link_name": "source1" },
{ "link_name": "source2" }
]
}
}
Example 2: Combine analysis results from parallel branches (column merge)
{
"name": "merge_analyses",
"type": "merge",
"depends_on": ["compute_readability", "detect_language"],
"config": {
"merge_type": "columns",
"column_option": "inner_join",
"input_links": [
{ "link_name": "readability" },
{ "link_name": "language" }
]
}
}
Example 3: Full outer join to preserve all documents
{
"name": "merge_all",
"type": "merge",
"depends_on": ["base_docs", "optional_scores"],
"config": {
"merge_type": "columns",
"column_option": "full_outer",
"input_links": [
{ "link_name": "base_docs" },
{ "link_name": "optional_scores" }
]
}
}
Troubleshooting
merge_type required — add "merge_type": "rows" or "merge_type": "columns" to the config.
column_option required when merge_type is "columns" — add "column_option": "inner_join" or "column_option": "full_outer".
The Merging operator received the same documents from multiple branches — duplicate document IDs detected in a row merge. Either use a column merge, or ensure branches process non-overlapping documents.
Fewer than 2 input links — input_links must contain at least 2 entries.
Sample Flow
See sample_flows/advanced/quality_branching_merge_pipeline.json for a complete example using merge to recombine branched pipelines.