[ 
https://issues.apache.org/jira/browse/SPARK-58118?page=com.atlassian.jira.plugin.system.issuetabpanels:comment-tabpanel&focusedCommentId=18100303#comment-18100303
 ] 

Andreas Neumann commented on SPARK-58118:
-----------------------------------------

Thanks, I will take a look at the PR. 

At this time, i am not sure what the right thing to do is here: in this case, 
we have two sources of truth: a table declaration with a schema, and an auto 
cdc flow with a column selection. At the least, these two are redundant, but 
they could be conflicting. I wonder whether, instead of allowing the table 
declaration to specify the schema with or without the metadata column, it would 
be wiser to simply not allow a schema for tables that have auto cdc flows. 

[~joseph.torres] [~anishmahto] [~szehon] what do you think? 

> Allow a user-specified AUTO CDC streaming-table schema to omit the reserved 
> metadata column
> -------------------------------------------------------------------------------------------
>
>                 Key: SPARK-58118
>                 URL: https://issues.apache.org/jira/browse/SPARK-58118
>             Project: Spark
>          Issue Type: Sub-task
>          Components: Declarative Pipelines
>    Affects Versions: 4.2.0, 4.3.0
>            Reporter: Andreas Neumann
>            Priority: Major
>              Labels: pull-request-available
>
> **Description:**
> An AUTO CDC (SCD Type 1) flow appends a reserved metadata column named 
> `__spark_autocdc_metadata` (a struct of `deleteSequence`/`upsertSequence`) to 
> its output schema(`AutoCdcMergeFlow.schema`). Because 
> `validateUserSpecifiedSchemas` requires the user-declared schema to *exactly 
> equal* the inferred schema, a user who declares a schema on an AUTO CDC 
> streaming table is currently forced to also declare this internal reserved 
> column, e.g.:
> ```
>     CREATE STREAMING TABLE t (
>       id INT NOT NULL, name STRING, version BIGINT NOT NULL,
>       __spark_autocdc_metadata 
> STRUCT<deleteSequence:BIGINT,upsertSequence:BIGINT> NOT NULL
>     ) FLOW AUTO CDC ...
> ```
> That column is an engine implementation detail; users should not need to know 
> its name or shape. Declaring only the logical data columns should be 
> accepted, with the engine owning the metadata column.
> Note: simply relaxing the validation is insufficient. 
> `DatasetManager.materializeTable` uses `table.specifiedSchema` verbatim as 
> the created-table schema, so if the user omits the metadata column the target 
> table is created without it and the SCD1 MERGE fails at runtime with 
> `UNRESOLVED_COLUMN ... __spark_autocdc_metadata` (verified empirically). The 
> fix must both:
> 1. Relax `validateUserSpecifiedSchemas` to permit the declared schema to 
> differ from the inferred schema *only* by the reserved AUTO CDC metadata 
> column(s), and
> 2. Backfill the reserved metadata column into the effective output schema at 
> materialization when a user schema is specified for an AUTO CDC target, so 
> the created table actually contains it.
> This is a deliberate semantics decision ("the user schema describes the 
> logical table; the engine owns reserved columns") and should be designed with 
> the SDP schema-model owners. Subsumes the ergonomic wart where the combined 
> form forces declaring the reserved column.
> Note: this came up during the review of SPARK-57402



--
This message was sent by Atlassian Jira
(v8.20.10#820010)

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

Reply via email to