anew commented on code in PR #57149:
URL: https://github.com/apache/spark/pull/57149#discussion_r3626462546


##########
docs/declarative-pipelines-programming-guide.md:
##########
@@ -517,6 +517,273 @@ AS INSERT INTO customers_us
 SELECT * FROM STREAM(customers_us_east);
 ```
 
+## Change Data Capture (CDC) with Auto CDC
+
+Many source systems emit a stream of *change events* rather than a snapshot of 
the current data: each record describes an insert, update, or delete to a row, 
identified by a key. Applying these events correctly to a target table by hand 
is tricky. You have to match events to existing rows, apply them in the right 
order, and handle out-of-order and duplicate events without corrupting the 
table.
+
+**Auto CDC** does this for you. You point it at a source of change events and 
tell it how to identify and order them, and SDP maintains a target streaming 
table that always reflects the latest state for each key.
+
+### What Auto CDC does
+
+Given an ordered stream of change events, Auto CDC keeps the target table in 
sync with the source:
+
+- **Inserts and updates** - For each key, the event with the highest sequence 
value wins. If no row exists for the key, it's inserted; if one exists, it's 
overwritten with the latest values.

Review Comment:
   what's a sequence value? Do you want to introduce that first? (a set of 
columns defining the event order)



##########
docs/declarative-pipelines-programming-guide.md:
##########
@@ -517,6 +517,273 @@ AS INSERT INTO customers_us
 SELECT * FROM STREAM(customers_us_east);
 ```
 
+## Change Data Capture (CDC) with Auto CDC
+
+Many source systems emit a stream of *change events* rather than a snapshot of 
the current data: each record describes an insert, update, or delete to a row, 
identified by a key. Applying these events correctly to a target table by hand 
is tricky. You have to match events to existing rows, apply them in the right 
order, and handle out-of-order and duplicate events without corrupting the 
table.
+
+**Auto CDC** does this for you. You point it at a source of change events and 
tell it how to identify and order them, and SDP maintains a target streaming 
table that always reflects the latest state for each key.
+
+### What Auto CDC does
+
+Given an ordered stream of change events, Auto CDC keeps the target table in 
sync with the source:
+
+- **Inserts and updates** - For each key, the event with the highest sequence 
value wins. If no row exists for the key, it's inserted; if one exists, it's 
overwritten with the latest values.
+- **Deletes** - Events that match a delete condition you supply remove the 
corresponding row from the target.
+- **Out-of-order events** - Events don't have to arrive in order. Auto CDC 
uses the sequencing expression to determine the latest state per key, so a 
late-arriving event with a lower sequence value doesn't overwrite newer data.
+
+This behavior implements **Slowly Changing Dimensions (SCD) Type 1**: the 
target keeps only the current version of each row, with no history of prior 
values. SCD Type 1 is the only mode currently supported.
+
+For example, given these change events (ordered by `version`):
+
+| id | name     | version | op     |
+|----|----------|---------|--------|
+| 1  | alice    | 1       | UPSERT |
+| 2  | bob      | 1       | UPSERT |
+| 1  | alice_v2 | 2       | UPSERT |
+| 2  | bob      | 2       | DELETE |
+| 3  | carol    | 1       | UPSERT |

Review Comment:
   this has no out-of order events for any of the keys, would it make sense?
   



##########
docs/declarative-pipelines-programming-guide.md:
##########
@@ -517,6 +517,273 @@ AS INSERT INTO customers_us
 SELECT * FROM STREAM(customers_us_east);
 ```
 
+## Change Data Capture (CDC) with Auto CDC
+
+Many source systems emit a stream of *change events* rather than a snapshot of 
the current data: each record describes an insert, update, or delete to a row, 
identified by a key. Applying these events correctly to a target table by hand 
is tricky. You have to match events to existing rows, apply them in the right 
order, and handle out-of-order and duplicate events without corrupting the 
table.
+
+**Auto CDC** does this for you. You point it at a source of change events and 
tell it how to identify and order them, and SDP maintains a target streaming 
table that always reflects the latest state for each key.
+
+### What Auto CDC does
+
+Given an ordered stream of change events, Auto CDC keeps the target table in 
sync with the source:
+
+- **Inserts and updates** - For each key, the event with the highest sequence 
value wins. If no row exists for the key, it's inserted; if one exists, it's 
overwritten with the latest values.
+- **Deletes** - Events that match a delete condition you supply remove the 
corresponding row from the target.
+- **Out-of-order events** - Events don't have to arrive in order. Auto CDC 
uses the sequencing expression to determine the latest state per key, so a 
late-arriving event with a lower sequence value doesn't overwrite newer data.
+
+This behavior implements **Slowly Changing Dimensions (SCD) Type 1**: the 
target keeps only the current version of each row, with no history of prior 
values. SCD Type 1 is the only mode currently supported.
+
+For example, given these change events (ordered by `version`):
+
+| id | name     | version | op     |
+|----|----------|---------|--------|
+| 1  | alice    | 1       | UPSERT |
+| 2  | bob      | 1       | UPSERT |
+| 1  | alice_v2 | 2       | UPSERT |

Review Comment:
   _v2 is a bit weird for a name. Would "alicia" be a more natural update?



##########
docs/declarative-pipelines-programming-guide.md:
##########
@@ -517,6 +517,273 @@ AS INSERT INTO customers_us
 SELECT * FROM STREAM(customers_us_east);
 ```
 
+## Change Data Capture (CDC) with Auto CDC
+
+Many source systems emit a stream of *change events* rather than a snapshot of 
the current data: each record describes an insert, update, or delete to a row, 
identified by a key. Applying these events correctly to a target table by hand 
is tricky. You have to match events to existing rows, apply them in the right 
order, and handle out-of-order and duplicate events without corrupting the 
table.
+
+**Auto CDC** does this for you. You point it at a source of change events and 
tell it how to identify and order them, and SDP maintains a target streaming 
table that always reflects the latest state for each key.
+
+### What Auto CDC does
+
+Given an ordered stream of change events, Auto CDC keeps the target table in 
sync with the source:
+
+- **Inserts and updates** - For each key, the event with the highest sequence 
value wins. If no row exists for the key, it's inserted; if one exists, it's 
overwritten with the latest values.
+- **Deletes** - Events that match a delete condition you supply remove the 
corresponding row from the target.
+- **Out-of-order events** - Events don't have to arrive in order. Auto CDC 
uses the sequencing expression to determine the latest state per key, so a 
late-arriving event with a lower sequence value doesn't overwrite newer data.
+
+This behavior implements **Slowly Changing Dimensions (SCD) Type 1**: the 
target keeps only the current version of each row, with no history of prior 
values. SCD Type 1 is the only mode currently supported.
+
+For example, given these change events (ordered by `version`):
+
+| id | name     | version | op     |
+|----|----------|---------|--------|
+| 1  | alice    | 1       | UPSERT |
+| 2  | bob      | 1       | UPSERT |
+| 1  | alice_v2 | 2       | UPSERT |
+| 2  | bob      | 2       | DELETE |
+| 3  | carol    | 1       | UPSERT |
+
+Auto CDC, keyed on `id` and sequenced by `version`, produces this target table:
+
+| id | name     | version |
+|----|----------|---------|
+| 1  | alice_v2 | 2       |
+| 3  | carol    | 1       |
+
+Row 1 is updated to its latest version, row 2 is deleted, and row 3 is 
inserted.
+
+### Requirements
+
+- The **target must be a streaming table** that already exists in the 
pipeline. Create it with `create_streaming_table` (Python) or `CREATE STREAMING 
TABLE` (SQL) before defining the Auto CDC flow, or use the combined SQL form 
shown below that does both at once.
+- The **source must be a streaming source** (read with `spark.readStream` in 
Python or `STREAM(...)` in SQL). CDC is an incremental operation over newly 
arriving change events.
+- You must provide a **key** (one or more columns that identify a row) and a 
**sequencing expression** (used to order events per key).

Review Comment:
   can the sequence really be an arbitrary expression?



##########
docs/declarative-pipelines-programming-guide.md:
##########
@@ -517,6 +517,273 @@ AS INSERT INTO customers_us
 SELECT * FROM STREAM(customers_us_east);
 ```
 
+## Change Data Capture (CDC) with Auto CDC
+
+Many source systems emit a stream of *change events* rather than a snapshot of 
the current data: each record describes an insert, update, or delete to a row, 
identified by a key. Applying these events correctly to a target table by hand 
is tricky. You have to match events to existing rows, apply them in the right 
order, and handle out-of-order and duplicate events without corrupting the 
table.
+
+**Auto CDC** does this for you. You point it at a source of change events and 
tell it how to identify and order them, and SDP maintains a target streaming 
table that always reflects the latest state for each key.
+
+### What Auto CDC does
+
+Given an ordered stream of change events, Auto CDC keeps the target table in 
sync with the source:
+
+- **Inserts and updates** - For each key, the event with the highest sequence 
value wins. If no row exists for the key, it's inserted; if one exists, it's 
overwritten with the latest values.
+- **Deletes** - Events that match a delete condition you supply remove the 
corresponding row from the target.
+- **Out-of-order events** - Events don't have to arrive in order. Auto CDC 
uses the sequencing expression to determine the latest state per key, so a 
late-arriving event with a lower sequence value doesn't overwrite newer data.
+
+This behavior implements **Slowly Changing Dimensions (SCD) Type 1**: the 
target keeps only the current version of each row, with no history of prior 
values. SCD Type 1 is the only mode currently supported.

Review Comment:
   target table?



##########
docs/declarative-pipelines-programming-guide.md:
##########
@@ -517,6 +517,273 @@ AS INSERT INTO customers_us
 SELECT * FROM STREAM(customers_us_east);
 ```
 
+## Change Data Capture (CDC) with Auto CDC
+
+Many source systems emit a stream of *change events* rather than a snapshot of 
the current data: each record describes an insert, update, or delete to a row, 
identified by a key. Applying these events correctly to a target table by hand 
is tricky. You have to match events to existing rows, apply them in the right 
order, and handle out-of-order and duplicate events without corrupting the 
table.
+
+**Auto CDC** does this for you. You point it at a source of change events and 
tell it how to identify and order them, and SDP maintains a target streaming 
table that always reflects the latest state for each key.
+
+### What Auto CDC does
+
+Given an ordered stream of change events, Auto CDC keeps the target table in 
sync with the source:
+
+- **Inserts and updates** - For each key, the event with the highest sequence 
value wins. If no row exists for the key, it's inserted; if one exists, it's 
overwritten with the latest values.
+- **Deletes** - Events that match a delete condition you supply remove the 
corresponding row from the target.
+- **Out-of-order events** - Events don't have to arrive in order. Auto CDC 
uses the sequencing expression to determine the latest state per key, so a 
late-arriving event with a lower sequence value doesn't overwrite newer data.
+
+This behavior implements **Slowly Changing Dimensions (SCD) Type 1**: the 
target keeps only the current version of each row, with no history of prior 
values. SCD Type 1 is the only mode currently supported.
+
+For example, given these change events (ordered by `version`):
+
+| id | name     | version | op     |
+|----|----------|---------|--------|
+| 1  | alice    | 1       | UPSERT |
+| 2  | bob      | 1       | UPSERT |
+| 1  | alice_v2 | 2       | UPSERT |
+| 2  | bob      | 2       | DELETE |
+| 3  | carol    | 1       | UPSERT |
+
+Auto CDC, keyed on `id` and sequenced by `version`, produces this target table:
+
+| id | name     | version |
+|----|----------|---------|
+| 1  | alice_v2 | 2       |
+| 3  | carol    | 1       |
+
+Row 1 is updated to its latest version, row 2 is deleted, and row 3 is 
inserted.
+
+### Requirements
+
+- The **target must be a streaming table** that already exists in the 
pipeline. Create it with `create_streaming_table` (Python) or `CREATE STREAMING 
TABLE` (SQL) before defining the Auto CDC flow, or use the combined SQL form 
shown below that does both at once.
+- The **source must be a streaming source** (read with `spark.readStream` in 
Python or `STREAM(...)` in SQL). CDC is an incremental operation over newly 
arriving change events.
+- You must provide a **key** (one or more columns that identify a row) and a 
**sequencing expression** (used to order events per key).
+
+### Defining an Auto CDC Flow in Python
+
+Use `create_auto_cdc_flow` to write change events into a target streaming 
table. Create the target with `create_streaming_table` first.
+
+```python
+from pyspark import pipelines as dp
+
+# The source of change events: a streaming read of the CDC feed.
[email protected]
+def cdc_events():
+    return spark.readStream.table("cdc_source")
+
+# The target that Auto CDC keeps in sync. It must be a streaming table.
+dp.create_streaming_table("customers")
+
+# The Auto CDC flow that applies the change events to the target.
+dp.create_auto_cdc_flow(
+    target="customers",
+    source="cdc_events",
+    keys=["id"],
+    sequence_by="version",
+    apply_as_deletes="op = 'DELETE'",
+    except_column_list=["op"],
+    stored_as_scd_type=1,
+)
+```
+
+`create_auto_cdc_flow` accepts the following arguments:
+
+| Parameter | Required | Description |
+|-----------|----------|-------------|
+| `target` | Yes | Name of the target streaming table that receives the 
changes. It must already be defined in the pipeline. |
+| `source` | Yes | Name of the CDC source dataset to stream change events 
from. |
+| `keys` | Yes | The column or columns that uniquely identify a row. A list of 
column names (strings) or `Column` objects, given as unqualified identifiers 
(for example `["id"]`, not `col("source.id")`). |
+| `sequence_by` | Yes | An expression used to order change events for each 
key. The highest value wins. A SQL expression string or a `Column`. |
+| `apply_as_deletes` | No | A boolean expression identifying events that 
represent deletes. Matching rows are removed from the target. A SQL expression 
string or a `Column`. |
+| `column_list` | No | The columns to include in the target. Mutually 
exclusive with `except_column_list`. |
+| `except_column_list` | No | The columns to exclude from the target; all 
other columns are included. Mutually exclusive with `column_list`. Commonly 
used to drop operation/metadata columns such as `op`. |
+| `stored_as_scd_type` | No | The SCD type of the target. Only `1` (or `"1"`) 
is supported. |
+| `name` | No | The name of the flow. Defaults to the target table name. |
+
+If you specify neither `column_list` nor `except_column_list`, all columns 
from the source are written to the target.

Review Comment:
   Maybe add: This is not recommended, because it would include the operation 
column in the target. 



##########
docs/declarative-pipelines-programming-guide.md:
##########
@@ -517,6 +517,273 @@ AS INSERT INTO customers_us
 SELECT * FROM STREAM(customers_us_east);
 ```
 
+## Change Data Capture (CDC) with Auto CDC
+
+Many source systems emit a stream of *change events* rather than a snapshot of 
the current data: each record describes an insert, update, or delete to a row, 
identified by a key. Applying these events correctly to a target table by hand 
is tricky. You have to match events to existing rows, apply them in the right 
order, and handle out-of-order and duplicate events without corrupting the 
table.
+
+**Auto CDC** does this for you. You point it at a source of change events and 
tell it how to identify and order them, and SDP maintains a target streaming 
table that always reflects the latest state for each key.
+
+### What Auto CDC does
+
+Given an ordered stream of change events, Auto CDC keeps the target table in 
sync with the source:
+
+- **Inserts and updates** - For each key, the event with the highest sequence 
value wins. If no row exists for the key, it's inserted; if one exists, it's 
overwritten with the latest values.
+- **Deletes** - Events that match a delete condition you supply remove the 
corresponding row from the target.
+- **Out-of-order events** - Events don't have to arrive in order. Auto CDC 
uses the sequencing expression to determine the latest state per key, so a 
late-arriving event with a lower sequence value doesn't overwrite newer data.
+
+This behavior implements **Slowly Changing Dimensions (SCD) Type 1**: the 
target keeps only the current version of each row, with no history of prior 
values. SCD Type 1 is the only mode currently supported.
+
+For example, given these change events (ordered by `version`):
+
+| id | name     | version | op     |
+|----|----------|---------|--------|
+| 1  | alice    | 1       | UPSERT |
+| 2  | bob      | 1       | UPSERT |
+| 1  | alice_v2 | 2       | UPSERT |
+| 2  | bob      | 2       | DELETE |
+| 3  | carol    | 1       | UPSERT |
+
+Auto CDC, keyed on `id` and sequenced by `version`, produces this target table:
+
+| id | name     | version |
+|----|----------|---------|
+| 1  | alice_v2 | 2       |
+| 3  | carol    | 1       |
+
+Row 1 is updated to its latest version, row 2 is deleted, and row 3 is 
inserted.
+
+### Requirements
+
+- The **target must be a streaming table** that already exists in the 
pipeline. Create it with `create_streaming_table` (Python) or `CREATE STREAMING 
TABLE` (SQL) before defining the Auto CDC flow, or use the combined SQL form 
shown below that does both at once.
+- The **source must be a streaming source** (read with `spark.readStream` in 
Python or `STREAM(...)` in SQL). CDC is an incremental operation over newly 
arriving change events.
+- You must provide a **key** (one or more columns that identify a row) and a 
**sequencing expression** (used to order events per key).
+
+### Defining an Auto CDC Flow in Python
+
+Use `create_auto_cdc_flow` to write change events into a target streaming 
table. Create the target with `create_streaming_table` first.
+
+```python
+from pyspark import pipelines as dp
+
+# The source of change events: a streaming read of the CDC feed.
[email protected]
+def cdc_events():
+    return spark.readStream.table("cdc_source")
+
+# The target that Auto CDC keeps in sync. It must be a streaming table.
+dp.create_streaming_table("customers")
+
+# The Auto CDC flow that applies the change events to the target.
+dp.create_auto_cdc_flow(
+    target="customers",
+    source="cdc_events",
+    keys=["id"],
+    sequence_by="version",
+    apply_as_deletes="op = 'DELETE'",
+    except_column_list=["op"],
+    stored_as_scd_type=1,
+)
+```
+
+`create_auto_cdc_flow` accepts the following arguments:
+
+| Parameter | Required | Description |
+|-----------|----------|-------------|
+| `target` | Yes | Name of the target streaming table that receives the 
changes. It must already be defined in the pipeline. |
+| `source` | Yes | Name of the CDC source dataset to stream change events 
from. |
+| `keys` | Yes | The column or columns that uniquely identify a row. A list of 
column names (strings) or `Column` objects, given as unqualified identifiers 
(for example `["id"]`, not `col("source.id")`). |

Review Comment:
   for example, `"id"` or `col("id")`, but not `"source.id"`



##########
docs/declarative-pipelines-programming-guide.md:
##########
@@ -517,6 +517,273 @@ AS INSERT INTO customers_us
 SELECT * FROM STREAM(customers_us_east);
 ```
 
+## Change Data Capture (CDC) with Auto CDC
+
+Many source systems emit a stream of *change events* rather than a snapshot of 
the current data: each record describes an insert, update, or delete to a row, 
identified by a key. Applying these events correctly to a target table by hand 
is tricky. You have to match events to existing rows, apply them in the right 
order, and handle out-of-order and duplicate events without corrupting the 
table.
+
+**Auto CDC** does this for you. You point it at a source of change events and 
tell it how to identify and order them, and SDP maintains a target streaming 
table that always reflects the latest state for each key.
+
+### What Auto CDC does
+
+Given an ordered stream of change events, Auto CDC keeps the target table in 
sync with the source:
+
+- **Inserts and updates** - For each key, the event with the highest sequence 
value wins. If no row exists for the key, it's inserted; if one exists, it's 
overwritten with the latest values.
+- **Deletes** - Events that match a delete condition you supply remove the 
corresponding row from the target.
+- **Out-of-order events** - Events don't have to arrive in order. Auto CDC 
uses the sequencing expression to determine the latest state per key, so a 
late-arriving event with a lower sequence value doesn't overwrite newer data.
+
+This behavior implements **Slowly Changing Dimensions (SCD) Type 1**: the 
target keeps only the current version of each row, with no history of prior 
values. SCD Type 1 is the only mode currently supported.
+
+For example, given these change events (ordered by `version`):
+
+| id | name     | version | op     |
+|----|----------|---------|--------|
+| 1  | alice    | 1       | UPSERT |
+| 2  | bob      | 1       | UPSERT |
+| 1  | alice_v2 | 2       | UPSERT |
+| 2  | bob      | 2       | DELETE |
+| 3  | carol    | 1       | UPSERT |
+
+Auto CDC, keyed on `id` and sequenced by `version`, produces this target table:
+
+| id | name     | version |
+|----|----------|---------|
+| 1  | alice_v2 | 2       |
+| 3  | carol    | 1       |
+
+Row 1 is updated to its latest version, row 2 is deleted, and row 3 is 
inserted.
+
+### Requirements
+
+- The **target must be a streaming table** that already exists in the 
pipeline. Create it with `create_streaming_table` (Python) or `CREATE STREAMING 
TABLE` (SQL) before defining the Auto CDC flow, or use the combined SQL form 
shown below that does both at once.
+- The **source must be a streaming source** (read with `spark.readStream` in 
Python or `STREAM(...)` in SQL). CDC is an incremental operation over newly 
arriving change events.
+- You must provide a **key** (one or more columns that identify a row) and a 
**sequencing expression** (used to order events per key).
+
+### Defining an Auto CDC Flow in Python
+
+Use `create_auto_cdc_flow` to write change events into a target streaming 
table. Create the target with `create_streaming_table` first.
+
+```python
+from pyspark import pipelines as dp
+
+# The source of change events: a streaming read of the CDC feed.
[email protected]
+def cdc_events():
+    return spark.readStream.table("cdc_source")
+
+# The target that Auto CDC keeps in sync. It must be a streaming table.
+dp.create_streaming_table("customers")
+
+# The Auto CDC flow that applies the change events to the target.
+dp.create_auto_cdc_flow(
+    target="customers",
+    source="cdc_events",
+    keys=["id"],
+    sequence_by="version",
+    apply_as_deletes="op = 'DELETE'",
+    except_column_list=["op"],
+    stored_as_scd_type=1,
+)
+```
+
+`create_auto_cdc_flow` accepts the following arguments:
+
+| Parameter | Required | Description |
+|-----------|----------|-------------|
+| `target` | Yes | Name of the target streaming table that receives the 
changes. It must already be defined in the pipeline. |
+| `source` | Yes | Name of the CDC source dataset to stream change events 
from. |
+| `keys` | Yes | The column or columns that uniquely identify a row. A list of 
column names (strings) or `Column` objects, given as unqualified identifiers 
(for example `["id"]`, not `col("source.id")`). |
+| `sequence_by` | Yes | An expression used to order change events for each 
key. The highest value wins. A SQL expression string or a `Column`. |
+| `apply_as_deletes` | No | A boolean expression identifying events that 
represent deletes. Matching rows are removed from the target. A SQL expression 
string or a `Column`. |
+| `column_list` | No | The columns to include in the target. Mutually 
exclusive with `except_column_list`. |
+| `except_column_list` | No | The columns to exclude from the target; all 
other columns are included. Mutually exclusive with `column_list`. Commonly 
used to drop operation/metadata columns such as `op`. |
+| `stored_as_scd_type` | No | The SCD type of the target. Only `1` (or `"1"`) 
is supported. |
+| `name` | No | The name of the flow. Defaults to the target table name. |
+
+If you specify neither `column_list` nor `except_column_list`, all columns 
from the source are written to the target.
+
+`keys`, `sequence_by`, `column_list`, and `except_column_list` must be given 
as unqualified column identifiers. They cannot be qualified references such as 
`col("cdc_events.id")`.
+
+### Defining an Auto CDC Flow in SQL
+
+SQL provides two forms. The first attaches an Auto CDC flow to a streaming 
table you have already declared:
+
+```sql
+CREATE STREAMING TABLE customers;
+
+CREATE FLOW customers_cdc AS AUTO CDC INTO customers
+FROM STREAM(cdc_events)
+KEYS (id)
+APPLY AS DELETE WHEN op = 'DELETE'
+SEQUENCE BY version
+COLUMNS * EXCEPT (op);
+```
+
+The second declares the streaming table and its Auto CDC flow together:
+
+```sql
+CREATE STREAMING TABLE customers
+FLOW AUTO CDC
+FROM STREAM(cdc_events)
+KEYS (id)
+APPLY AS DELETE WHEN op = 'DELETE'
+SEQUENCE BY version
+COLUMNS * EXCEPT (op);
+```
+
+The clauses must appear in this order:
+
+- `FROM STREAM(source)` - the streaming CDC source. **Required.**
+- `KEYS (col, ...)` - the key columns that identify a row. **Required.**
+- `APPLY AS DELETE WHEN condition` - marks events that represent deletes. 
Optional.
+- `SEQUENCE BY expr` - the expression that orders events per key. **Required.**
+- `COLUMNS (col, ...)` or `COLUMNS * EXCEPT (col, ...)` - selects or excludes 
columns. Optional; if omitted, all source columns are written.
+
+`CREATE FLOW ... AS AUTO CDC INTO` also accepts an optional `COMMENT`, and 
`CREATE STREAMING TABLE ... FLOW AUTO CDC` accepts `IF NOT EXISTS`. Both forms 
target SCD Type 1; there is no SQL clause to select the SCD type.
+
+### End-to-End Example
+
+This example builds a small pipeline that ingests a stream of customer change 
events and maintains a `customers` table containing the latest state of each 
customer. It uses Delta as the table format, but Auto CDC works with any format 
that supports the required row-level operations.
+
+Create a pipeline project:
+
+```bash
+spark-pipelines init --name cdc_demo
+cd cdc_demo
+```
+
+Add a transformation that defines the CDC source, the target streaming table, 
and the Auto CDC flow. Place the following in 
`transformations/customers_cdc.py`:
+
+```python
+from pyspark import pipelines as dp
+
+# Ingest the raw change events as a streaming table. In a real pipeline this
+# would read from Kafka, cloud storage, or a CDC feed; here it reads a Delta
+# table that another process appends change events to.
[email protected](name="cdc_events", format="delta")
+def cdc_events():
+    return spark.readStream.format("delta").load("/path/to/cdc_source")
+
+# Declare the target streaming table that Auto CDC will maintain.
+dp.create_streaming_table("customers", format="delta")
+
+# Apply the change events to the target.
+dp.create_auto_cdc_flow(
+    target="customers",
+    source="cdc_events",
+    keys=["id"],
+    sequence_by="version",
+    apply_as_deletes="op = 'DELETE'",
+    except_column_list=["op"],
+    stored_as_scd_type=1,
+)
+```
+
+Suppose the source receives two batches of change events. The first batch 
inserts two customers:
+
+| id | name  | version | op     |

Review Comment:
   again, no out-of-order events. What about an example that has an out-of 
order late update (or delete) in batch 2? And you run the pipeline after each 
batch? Then it wold demonstrate that the late event had no effect. 



-- 
This is an automated message from the Apache Git Service.
To respond to the message, please log on to GitHub and use the
URL above to go to the specific comment.

To unsubscribe, e-mail: [email protected]

For queries about this service, please contact Infrastructure at:
[email protected]


---------------------------------------------------------------------
To unsubscribe, e-mail: [email protected]
For additional commands, e-mail: [email protected]

Reply via email to