[ 
https://issues.apache.org/jira/browse/SPARK-56975?page=com.atlassian.jira.plugin.system.issuetabpanels:all-tabpanel
 ]

You Zhou updated SPARK-56975:
-----------------------------
    Description: 
`DataStreamReader.table()` accepts a user-specified schema without complaint 
and then silently ignores it:

```scala
spark.readStream
  .schema(new StructType().add("a", IntegerType))
  .table("some_table")     // no error; the schema has no effect
```

User-specified schema is not a meaningful input to `.table()` — catalog tables 
declare their own schema, and `TableCatalog.loadTable(Identifier)` has no 
parameter to receive a user schema, so even if Spark wanted to forward one it 
couldn't. The user's `.schema(...)` call is therefore always a misconfiguration.

The rest of `DataStreamReader` already surfaces this kind of misconfiguration 
as a clear error:

- `.load()` goes through `DataSourceV2Utils.getTableFromProvider`, which throws 
`_LEGACY_ERROR_TEMP_2242` ("`<provider>` source does not support user-specified 
schema") when the provider does not implement `supportsExternalMetadata()`.
- `.changes()` explicitly calls `assertNoSpecifiedSchema("changes")` and throws 
`_LEGACY_ERROR_TEMP_1189` ("User specified schema not supported with 
`changes`.").

`.table()` is the odd one out: same invalid configuration, no error. Users can 
write `readStream.schema(s).table(name)`, see a working query, and reasonably 
assume `s` had an effect — when in fact the resulting stream uses the catalog 
schema and `s` was dropped. Surfacing this as a clear error aligns `.table()` 
with the existing behavior of `.load()` and `.changes()`.


  was:
`DataStreamReader.table()` accepts a user-specified schema without complaint
and then silently ignores it:

```scala
spark.readStream
  .schema(new StructType().add("a", IntegerType))
  .table("some_table")     // no error; the schema has no effect
```

User-specified schema is not a meaningful input to `.table()` — catalog
tables declare their own schema, and `TableCatalog.loadTable(Identifier)`
has no parameter to receive a user schema, so even if Spark wanted to
forward one it couldn't. The user's `.schema(...)` call is therefore
always a misconfiguration.

The rest of `DataStreamReader` already surfaces this kind of misconfiguration
as a clear error:

- `.load()` goes through `DataSourceV2Utils.getTableFromProvider`, which
  throws `_LEGACY_ERROR_TEMP_2242` ("`<provider>` source does not support
  user-specified schema") when the provider does not implement
  `supportsExternalMetadata()`.
- `.changes()` explicitly calls `assertNoSpecifiedSchema("changes")` and
  throws `_LEGACY_ERROR_TEMP_1189` ("User specified schema not supported
  with `changes`.").

`.table()` is the odd one out: same invalid configuration, no error.
Users can write `readStream.schema(s).table(name)`, see a working query,
and reasonably assume `s` had an effect — when in fact the resulting
stream uses the catalog schema and `s` was dropped. Surfacing this as a
clear error aligns `.table()` with the existing behavior of `.load()` and
`.changes()`.



> DataStreamReader.table() should reject user-specified schema instead of 
> silently ignoring it
> --------------------------------------------------------------------------------------------
>
>                 Key: SPARK-56975
>                 URL: https://issues.apache.org/jira/browse/SPARK-56975
>             Project: Spark
>          Issue Type: Improvement
>          Components: Structured Streaming
>    Affects Versions: 4.2.0
>            Reporter: You Zhou
>            Priority: Major
>             Fix For: 4.2.0
>
>
> `DataStreamReader.table()` accepts a user-specified schema without complaint 
> and then silently ignores it:
> ```scala
> spark.readStream
>   .schema(new StructType().add("a", IntegerType))
>   .table("some_table")     // no error; the schema has no effect
> ```
> User-specified schema is not a meaningful input to `.table()` — catalog 
> tables declare their own schema, and `TableCatalog.loadTable(Identifier)` has 
> no parameter to receive a user schema, so even if Spark wanted to forward one 
> it couldn't. The user's `.schema(...)` call is therefore always a 
> misconfiguration.
> The rest of `DataStreamReader` already surfaces this kind of misconfiguration 
> as a clear error:
> - `.load()` goes through `DataSourceV2Utils.getTableFromProvider`, which 
> throws `_LEGACY_ERROR_TEMP_2242` ("`<provider>` source does not support 
> user-specified schema") when the provider does not implement 
> `supportsExternalMetadata()`.
> - `.changes()` explicitly calls `assertNoSpecifiedSchema("changes")` and 
> throws `_LEGACY_ERROR_TEMP_1189` ("User specified schema not supported with 
> `changes`.").
> `.table()` is the odd one out: same invalid configuration, no error. Users 
> can write `readStream.schema(s).table(name)`, see a working query, and 
> reasonably assume `s` had an effect — when in fact the resulting stream uses 
> the catalog schema and `s` was dropped. Surfacing this as a clear error 
> aligns `.table()` with the existing behavior of `.load()` and `.changes()`.



--
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