Skip to content

[Feature] Support Spark expression: seconds_of_time #3129

Closed as not planned
Closed as not planned

Description

@andygrove

What is the problem the feature request solves?

Note: This issue was generated with AI assistance. The specification details have been extracted from Spark documentation and may need verification.

Comet does not currently support the Spark seconds_of_time function, causing queries using this function to fall back to Spark's JVM execution instead of running natively on DataFusion.

The SecondsOfTime expression extracts the seconds component from a time-related value. This is a unary expression that operates on a single child expression and returns the seconds portion as an integer value.

Supporting this expression would allow more Spark workloads to benefit from Comet's native acceleration.

Describe the potential solution

Spark Specification

Syntax:

-- SQL syntax (implementation-dependent)
SECONDS(time_expression)
// DataFrame API usage
import org.apache.spark.sql.catalyst.expressions.SecondsOfTime
SecondsOfTime(child_expression)

Arguments:

Argument Type Description
child Expression The input expression containing time data from which to extract seconds

Return Type: Integer type representing the seconds component (typically 0-59).

Supported Data Types:

  • Timestamp types
  • Time-related string formats
  • Date/time structures that contain seconds information

Edge Cases:

  • Null handling: Returns null if the child expression evaluates to null
  • Invalid time formats: Behavior depends on the underlying time parsing implementation
  • Leap seconds: Handles standard 0-59 seconds range, special leap second handling may vary
  • Timezone considerations: Seconds extraction is typically timezone-independent

Examples:

-- Example SQL usage (hypothetical)
SELECT SECONDS(current_timestamp()) as current_seconds;
SELECT SECONDS('2023-12-25 14:30:45') as extracted_seconds; -- Returns 45
// Example DataFrame API usage
import org.apache.spark.sql.functions._
import org.apache.spark.sql.catalyst.expressions.SecondsOfTime

// Using in a DataFrame transformation
df.select(SecondsOfTime(col("timestamp_column")))

Implementation Approach

See the Comet guide on adding new expressions for detailed instructions.

  1. Scala Serde: Add expression handler in spark/src/main/scala/org/apache/comet/serde/
  2. Register: Add to appropriate map in QueryPlanSerde.scala
  3. Protobuf: Add message type in native/proto/src/proto/expr.proto if needed
  4. Rust: Implement in native/spark-expr/src/ (check if DataFusion has built-in support first)

Additional context

Difficulty: Medium
Spark Expression Class: org.apache.spark.sql.catalyst.expressions.SecondsOfTime

Related:

  • MinutesOfTime - Extracts minutes component
  • HoursOfTime - Extracts hours component
  • second() - Built-in SQL function for seconds extraction
  • Time extraction expressions in Spark Catalyst

This issue was auto-generated from Spark reference documentation.

Activity

  1. 0lai0 commented on Feb 9, 2026

    @0lai0
    Contributor

    take

  2. andygrove commented on Jul 29, 2026

    @andygrove
    MemberAuthor

    SecondsOfTime is a RuntimeReplaceable expression. The ReplaceExpressions rule (Finish Analysis batch) substitutes it with its replacement before physical planning, so the class never appears in a physical plan and Comet's expression serde never sees it. Registering a CometExpressionSerde for it would be dead code.

    Its replacement is a StaticInvoke into DateTimeUtils.getSecondsOfTime, so this function is never gated on a serde for SecondsOfTime. Native support for seconds_of_time would have to come from supporting that replacement, which is a different piece of work than this issue describes.

    Closing as not actionable as specified. If the fallback matters in practice, a fresh issue should track the replacement path.

Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment

Metadata

Metadata

Assignees

Type

No type

Projects

No projects

    Milestone

    No milestone

    Relationships

    None yet

    Development

    No branches or pull requests

    Issue actions