peterxcli opened a new issue, #5857:
URL: https://github.com/apache/datafusion-comet/issues/5857

   ### Describe the bug
   
   With `spark.sql.mapKeyDedupPolicy=LAST_WIN`, `str_to_map` raises 
`[DUPLICATED_MAP_KEY]` on an input string that repeats a key, while Spark 
returns a map holding the last value for that key. Comet fails the query where 
Spark succeeds.
   
   The error also surfaces as a raw native failure rather than Spark's 
`SparkRuntimeException`, because nothing translates it on the JVM side.
   
   
   ### Steps to reproduce
   
   ```sql
   SET spark.sql.mapKeyDedupPolicy=LAST_WIN;
   SELECT str_to_map('a:1,b:2,a:3');
   ```
   
   Spark returns `{a -> 3, b -> 2}`. Comet raises:
   
   ```
   [DUPLICATED_MAP_KEY] Duplicate map key 'a' was found, please check the input 
data.
   To allow duplicate keys with last-value-wins semantics, set
   `datafusion.spark.map_key_dedup_policy` to `LAST_WIN`.
   ```
   
   The default `EXCEPTION` policy is unaffected: both engines raise on a 
duplicate key there, so this only shows up once the policy is changed.
   
   ### Expected behavior
   
   `str_to_map` follows `spark.sql.mapKeyDedupPolicy` the way Spark's 
`ArrayBasedMapBuilder` does, keeping the last value for each duplicate key 
under `LAST_WIN`.
   
   
   ### Additional context
   
   The native kernel already implements this. `datafusion-spark`'s 
`SparkStrToMap` reads `datafusion.spark.map_key_dedup_policy` (see 
`datafusion_common::config::SparkOptions`), which takes the same `EXCEPTION` 
and `LAST_WIN` values as the Spark config. Two things stop the Spark setting 
from reaching it:
   
   1. `spark.sql.mapKeyDedupPolicy` never crosses JNI. 
`CometExecIterator.serializeCometSQLConfs` sends only keys under 
`spark.comet.`, plus a short explicit list.
   2. `create_scalar_function_expr` in `native/core/src/execution/planner.rs` 
hands every `ScalarFunctionExpr` a fresh `ConfigOptions::default()`, so a 
kernel reading a session option sees DataFusion's defaults rather than the 
session's values.
   
   `CometStrToMap.getSupportLevel` does not inspect the policy either, so the 
expression stays `Compatible` and takes the native path under `LAST_WIN` 
instead of routing through the JVM codegen dispatcher.
   
   `spark/src/test/resources/sql-tests/expressions/map/str_to_map.sql` carries 
a matching note:
   
   ```sql
   -- TODO: Add LAST_WIN policy tests when spark.sql.mapKeyDedupPolicy config 
is supported
   ```
   
   #5854 fixes both points above while closing #4680, and adds 
`str_to_map_dedup_policy.sql` covering `LAST_WIN`. This issue records the 
divergence on its own, since it reaches a different expression from the one 
#4680 and #5589 describe and would otherwise go untracked if that PR is split 
up.
   
   Related: #4680 (null keys in `map_from_arrays` / `map_from_entries`), #5589 
(`map_from_arrays` fallback under `LAST_WIN`).
   


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