Stephen Hodges created SPARK-60249:
--------------------------------------

             Summary: Reusing a named streaming DataFrame in a union fails with 
DUPLICATE_SOURCE_NAMES
                 Key: SPARK-60249
                 URL: https://issues.apache.org/jira/browse/SPARK-60249
             Project: Spark
          Issue Type: Bug
          Components: Structured Streaming
    Affects Versions: 4.2.0, 5.0.0
            Reporter: Stephen Hodges


With spark.sql.streaming.queryEvolution.enableSourceEvolution=true, reusing a 
named streaming data frame in multiple branches of a union causes query startup 
to fail with "STREAMING_QUERY_EVOLUTION_ERROR.DUPLICATE_SOURCE_NAMES"

The query contains one source reused twice. Duplicate-name validation counts 
both occurrences as *separate* sources, although micro-batch execution would 
reuse the same source instance.

To reproduce:
 # Write a parquet containing a single long column, id, with rows 1, 2, 2, 3


 # Read it once as a named streaming data frame e.g.
val source = spark.readStream.schema("id 
LONG").format("parquet").name("events").load(input)


 # Create a second branch from that same frame, e.g. 
val transformed = source.filter("id > 1").selectExpr("id + 10 AS id")


 # Combine them like
val combined = source.unionByName(transformed)


 # Start an append-mode memory sink with a query name and a fresh checkpoint 
directory like
combined.writeStream.format("memory").queryName("named_source_reuse_result").outputMode("append").option("checkpointLocation",
 checkpoint).start()

Actual result is that query startup throws AnalysisException with error class 
"STREAMING_QUERY_EVOLUTION_ERROR.DUPLICATE_SOURCE_NAMES"

 

Expected result is that the query starts and uses one source, so after 
processAllAvailable() the output contains 1, 2, 2, 3, 12, 12, 13.

 

I believe that the cause is that ResolveWriteToStream.checkDuplicateSourceNames 
collects source names from every matching relation occurrence and rejects 
repeated names without accounting for relation reuse.


MicroBatchExecution caches sources by full relation equality within each reader 
route. The validation therefore rejects a reuse pattern that execution actually 
supports.


Validation should IMO distinguish reuse of the same relation from independent 
sources assigned the same name. Independent sources with actual duplicate names 
should continue to fail.

 

Issue reproduced and possible fix tested on local source builds of Spark 
4.2.0-rc6 and 5.0.0-SNAPSHOT



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