This is an automated email from the ASF dual-hosted git repository.

MaxGekk pushed a commit to branch branch-4.x
in repository https://gitbox.apache.org/repos/asf/spark.git


The following commit(s) were added to refs/heads/branch-4.x by this push:
     new a6207b99ee30 [SPARK-57808][SQL][DOC] Document the microsecond-only 
limitation of typed encoders and UDFs for nanosecond timestamps
a6207b99ee30 is described below

commit a6207b99ee30c17c3f8f519b6bfd61f602415f2c
Author: AgenticSpark <[email protected]>
AuthorDate: Thu Jul 2 11:55:28 2026 +0200

    [SPARK-57808][SQL][DOC] Document the microsecond-only limitation of typed 
encoders and UDFs for nanosecond timestamps
    
    ### What changes were proposed in this pull request?
    
    This adds a note to `docs/sql-ref-datatypes.md` under the 
`TimestampNTZNanosType(precision)` / `TimestampLTZNanosType(precision)` entry. 
The note documents that typed encoders and typed Scala/Java UDF boundaries use 
the existing microsecond timestamp types for `java.time.Instant` and 
`java.time.LocalDateTime`, while Kryo encoders bypass the SQL type system. This 
is a sub-task of the SPARK-56822 nanosecond-timestamp SPIP.
    
    ### Why are the changes needed?
    
    Users can otherwise hit silent microsecond truncation when working with 
nanosecond timestamp values through typed encoders or typed UDFs. Per 
SPARK-57808, the decision is to document this limitation rather than change the 
typed encoder behavior. The note also points users to the schema-driven 
workaround: declare `TimestampLTZNanosType` or `TimestampNTZNanosType` in the 
schema and use the `Row` / `Encoders.row(schema)` path to preserve nanoseconds.
    
    ### Does this PR introduce _any_ user-facing change?
    
    No. Documentation-only.
    
    ### How was this patch tested?
    
    Docs-only change; no tests. Verified the referenced APIs, configuration, 
and type names exist in the codebase: `ScalaReflection` maps `Instant` / 
`LocalDateTime` to microsecond `TimestampType` / `TimestampNTZType`, 
`Encoders.row(schema)` exists, and `spark.sql.timestampNanosTypes.enabled`, 
`TimestampLTZNanosType`, and `TimestampNTZNanosType` exist.
    
    ### Was this patch authored or co-authored using generative AI tooling?
    
    Generated-by: GitHub Copilot CLI
    
    Closes #56956 from AgenticSpark/agenticspark/SPARK-57808-doc-nano-encoders.
    
    Authored-by: AgenticSpark <[email protected]>
    Signed-off-by: Max Gekk <[email protected]>
    (cherry picked from commit b3bc6fb46607534bef78f08abf32495bf48f22d9)
    Signed-off-by: Max Gekk <[email protected]>
---
 docs/sql-ref-datatypes.md | 1 +
 1 file changed, 1 insertion(+)

diff --git a/docs/sql-ref-datatypes.md b/docs/sql-ref-datatypes.md
index a5da7949d059..89fd79c48936 100644
--- a/docs/sql-ref-datatypes.md
+++ b/docs/sql-ref-datatypes.md
@@ -56,6 +56,7 @@ Spark SQL and DataFrames support the following data types:
   hour, minute, and second. All operations are performed without taking any 
time zone into account.
     - Note: TIMESTAMP in Spark is a user-specified alias associated with one 
of the TIMESTAMP_LTZ and TIMESTAMP_NTZ variations.  Users can set the default 
timestamp type as `TIMESTAMP_LTZ`(default value) or `TIMESTAMP_NTZ` via the 
configuration `spark.sql.timestampType`.
   - `TimestampNTZNanosType(precision)` / `TimestampLTZNanosType(precision)`: 
Preview nanosecond-capable variants of `TIMESTAMP_NTZ` and `TIMESTAMP_LTZ` with 
fractional seconds precision `precision` in `[7, 9]`. Unparameterized 
`TIMESTAMP`, `TIMESTAMP_NTZ`, and `TIMESTAMP_LTZ` remain microsecond types. In 
schema-driven Dataset/DataFrame conversion, Spark maps `TimestampNTZNanosType` 
to `java.time.LocalDateTime` and `TimestampLTZNanosType` to 
`java.time.Instant`; values with more sub-micro [...]
+    - Note: Nanosecond precision is only available through the schema-driven 
APIs above. Typed encoders derived from 
`java.time.Instant`/`java.time.LocalDateTime` (for example `ds.as[T]` for a 
case class and `spark.createDataFrame(Seq(...))` without an explicit schema) 
bind these types to the microsecond `TIMESTAMP_LTZ`/`TIMESTAMP_NTZ` types, and 
typed Scala/Java UDFs such as `udf((i: java.time.Instant) => ...)` coerce their 
inputs to microsecond precision at the UDF boundary. Kryo encod [...]
 
 * Interval types
   - `YearMonthIntervalType(startField, endField)`: Represents a year-month 
interval which is made up of a contiguous subset of the following fields:


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

Reply via email to