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

uros-b pushed a commit to branch master
in repository https://gitbox.apache.org/repos/asf/spark.git


The following commit(s) were added to refs/heads/master by this push:
     new 9da9f8d67391 [SPARK-58166][SQL] Replace TypeTag on PhysicalDataType 
with ClassTag
9da9f8d67391 is described below

commit 9da9f8d673914d1648514f59d85e3adafb300d1a
Author: Emil Ejbyfeldt <[email protected]>
AuthorDate: Sun Aug 23 13:41:05 2026 +0000

    [SPARK-58166][SQL] Replace TypeTag on PhysicalDataType with ClassTag
    
    ### What changes were proposed in this pull request?
    Replace the TypeTag in PhysicalDataType with a ClassTag.
    
    ### Why are the changes needed?
    Because of this issue https://github.com/scala/scala3/issues/25896 the 
change top make it possible to use Spark from Scala 3.8.0 or later.
    
    ### Does this PR introduce _any_ user-facing change?
    No.
    
    ### How was this patch tested?
    Existing tests ensure no regressions. That it makes the code more 
compatible with Scala 3.8 was done by running a local build against the tests 
in https://github.com/unum-io/tyda (a Scala 3 library that can use Spark as a 
backend).
    
    ### Was this patch authored or co-authored using generative AI tooling?
    No.
    
    Closes #57296 from eejbyfeldt/SPARK-58166.
    
    Authored-by: Emil Ejbyfeldt <[email protected]>
    Signed-off-by: Uros Bojanic <[email protected]>
---
 .../expressions/collectionOperations.scala         |  2 +-
 .../sql/catalyst/types/PhysicalDataType.scala      | 46 +++++++++++-----------
 2 files changed, 24 insertions(+), 24 deletions(-)

diff --git 
a/sql/catalyst/src/main/scala/org/apache/spark/sql/catalyst/expressions/collectionOperations.scala
 
b/sql/catalyst/src/main/scala/org/apache/spark/sql/catalyst/expressions/collectionOperations.scala
index 9120cfa5f275..8561ce3aae8e 100644
--- 
a/sql/catalyst/src/main/scala/org/apache/spark/sql/catalyst/expressions/collectionOperations.scala
+++ 
b/sql/catalyst/src/main/scala/org/apache/spark/sql/catalyst/expressions/collectionOperations.scala
@@ -3631,7 +3631,7 @@ case class Sequence(
       val physicalDataType = PhysicalDataType(iType)
       type T = physicalDataType.InternalType
       val integral = PhysicalIntegralType.integral(iType)
-      val ct = 
ClassTag[T](physicalDataType.tag.mirror.runtimeClass(physicalDataType.tag.tpe))
+      val ct = physicalDataType.tag
       new IntegralSequenceImpl[T](iType)(ct, 
integral.asInstanceOf[Integral[T]])
 
     case TimestampType | TimestampNTZType =>
diff --git 
a/sql/catalyst/src/main/scala/org/apache/spark/sql/catalyst/types/PhysicalDataType.scala
 
b/sql/catalyst/src/main/scala/org/apache/spark/sql/catalyst/types/PhysicalDataType.scala
index 9acbf4be66f9..d77da0b159af 100644
--- 
a/sql/catalyst/src/main/scala/org/apache/spark/sql/catalyst/types/PhysicalDataType.scala
+++ 
b/sql/catalyst/src/main/scala/org/apache/spark/sql/catalyst/types/PhysicalDataType.scala
@@ -17,8 +17,8 @@
 
 package org.apache.spark.sql.catalyst.types
 
-import scala.reflect.runtime.universe.TypeTag
-import scala.reflect.runtime.universe.typeTag
+import scala.reflect.ClassTag
+import scala.reflect.classTag
 
 import org.apache.spark.sql.catalyst.expressions.{Ascending, BoundReference, 
InterpretedOrdering, SortOrder}
 import org.apache.spark.sql.catalyst.types.ops.TypeOps
@@ -31,7 +31,7 @@ import org.apache.spark.util.ArrayImplicits._
 sealed abstract class PhysicalDataType {
   private[sql] type InternalType
   private[sql] def ordering: Ordering[InternalType]
-  private[sql] val tag: TypeTag[InternalType]
+  private[sql] val tag: ClassTag[InternalType]
 }
 
 object PhysicalDataType {
@@ -133,7 +133,7 @@ class PhysicalBinaryType() extends PhysicalDataType {
     (x: Array[Byte], y: Array[Byte]) => ByteArray.compareBinary(x, y)
 
   private[sql] type InternalType = Array[Byte]
-  @transient private[sql] lazy val tag = typeTag[InternalType]
+  @transient private[sql] lazy val tag = classTag[InternalType]
 }
 case object PhysicalBinaryType extends PhysicalBinaryType
 
@@ -143,14 +143,14 @@ class PhysicalBooleanType extends PhysicalDataType with 
PhysicalPrimitiveType {
   // Defined with a private constructor so the companion object is the only 
possible instantiation.
   private[sql] type InternalType = Boolean
   private[sql] val ordering = implicitly[Ordering[InternalType]]
-  @transient private[sql] lazy val tag = typeTag[InternalType]
+  @transient private[sql] lazy val tag = classTag[InternalType]
 }
 case object PhysicalBooleanType extends PhysicalBooleanType
 
 class PhysicalByteType() extends PhysicalIntegralType with 
PhysicalPrimitiveType {
   private[sql] type InternalType = Byte
   private[sql] val ordering = implicitly[Ordering[InternalType]]
-  @transient private[sql] lazy val tag = typeTag[InternalType]
+  @transient private[sql] lazy val tag = classTag[InternalType]
   private[sql] val numeric = implicitly[Numeric[Byte]]
   override private[sql] val exactNumeric = ByteExactNumeric
   private[sql] val integral = implicitly[Integral[Byte]]
@@ -162,7 +162,7 @@ class PhysicalCalendarIntervalType() extends 
PhysicalDataType {
     throw QueryExecutionErrors.orderedOperationUnsupportedByDataTypeError(
       "PhysicalCalendarIntervalType")
   override private[sql] type InternalType = Any
-  @transient private[sql] lazy val tag = typeTag[InternalType]
+  @transient private[sql] lazy val tag = classTag[InternalType]
 }
 case object PhysicalCalendarIntervalType extends PhysicalCalendarIntervalType
 
@@ -180,7 +180,7 @@ case object PhysicalCalendarIntervalType extends 
PhysicalCalendarIntervalType
 class PhysicalTimestampNTZNanosType() extends PhysicalDataType {
   override private[sql] type InternalType = TimestampNanosVal
   override private[sql] val ordering = implicitly[Ordering[InternalType]]
-  @transient private[sql] lazy val tag = typeTag[InternalType]
+  @transient private[sql] lazy val tag = classTag[InternalType]
 }
 case object PhysicalTimestampNTZNanosType extends PhysicalTimestampNTZNanosType
 
@@ -198,14 +198,14 @@ case object PhysicalTimestampNTZNanosType extends 
PhysicalTimestampNTZNanosType
 class PhysicalTimestampLTZNanosType() extends PhysicalDataType {
   override private[sql] type InternalType = TimestampNanosVal
   override private[sql] val ordering = implicitly[Ordering[InternalType]]
-  @transient private[sql] lazy val tag = typeTag[InternalType]
+  @transient private[sql] lazy val tag = classTag[InternalType]
 }
 case object PhysicalTimestampLTZNanosType extends PhysicalTimestampLTZNanosType
 
 case class PhysicalDecimalType(precision: Int, scale: Int) extends 
PhysicalFractionalType {
   private[sql] type InternalType = Decimal
   private[sql] val ordering = Decimal.DecimalIsFractional
-  @transient private[sql] lazy val tag = typeTag[InternalType]
+  @transient private[sql] lazy val tag = classTag[InternalType]
   private[sql] val numeric = Decimal.DecimalIsFractional
   override private[sql] def exactNumeric = DecimalExactNumeric
   private[sql] val fractional = Decimal.DecimalIsFractional
@@ -225,7 +225,7 @@ class PhysicalDoubleType() extends PhysicalFractionalType 
with PhysicalPrimitive
   private[sql] type InternalType = Double
   private[sql] val ordering =
     (x: Double, y: Double) => SQLOrderingUtil.compareDoubles(x, y)
-  @transient private[sql] lazy val tag = typeTag[InternalType]
+  @transient private[sql] lazy val tag = classTag[InternalType]
   private[sql] val numeric = implicitly[Numeric[Double]]
   override private[sql] def exactNumeric = DoubleExactNumeric
   private[sql] val fractional = implicitly[Fractional[Double]]
@@ -240,7 +240,7 @@ class PhysicalFloatType() extends PhysicalFractionalType 
with PhysicalPrimitiveT
   private[sql] type InternalType = Float
   private[sql] val ordering =
     (x: Float, y: Float) => SQLOrderingUtil.compareFloats(x, y)
-  @transient private[sql] lazy val tag = typeTag[InternalType]
+  @transient private[sql] lazy val tag = classTag[InternalType]
   private[sql] val numeric = implicitly[Numeric[Float]]
   override private[sql] def exactNumeric = FloatExactNumeric
   private[sql] val fractional = implicitly[Fractional[Float]]
@@ -254,7 +254,7 @@ class PhysicalIntegerType() extends PhysicalIntegralType 
with PhysicalPrimitiveT
   // Defined with a private constructor so the companion object is the only 
possible instantiation.
   private[sql] type InternalType = Int
   private[sql] val ordering = implicitly[Ordering[InternalType]]
-  @transient private[sql] lazy val tag = typeTag[InternalType]
+  @transient private[sql] lazy val tag = classTag[InternalType]
   private[sql] val numeric = implicitly[Numeric[Int]]
   override private[sql] val exactNumeric = IntegerExactNumeric
   private[sql] val integral = implicitly[Integral[Int]]
@@ -267,7 +267,7 @@ class PhysicalLongType() extends PhysicalIntegralType with 
PhysicalPrimitiveType
   // Defined with a private constructor so the companion object is the only 
possible instantiation.
   private[sql] type InternalType = Long
   private[sql] val ordering = implicitly[Ordering[InternalType]]
-  @transient private[sql] lazy val tag = typeTag[InternalType]
+  @transient private[sql] lazy val tag = classTag[InternalType]
   private[sql] val numeric = implicitly[Numeric[Long]]
   override private[sql] val exactNumeric = LongExactNumeric
   private[sql] val integral = implicitly[Integral[Long]]
@@ -279,7 +279,7 @@ case class PhysicalMapType(keyType: DataType, valueType: 
DataType, valueContains
   // maps are not orderable, we use `ordering` just to support group by queries
   override private[sql] def ordering = interpretedOrdering
   override private[sql] type InternalType = MapData
-  @transient private[sql] lazy val tag = typeTag[InternalType]
+  @transient private[sql] lazy val tag = classTag[InternalType]
 
   @transient
   private[sql] lazy val interpretedOrdering: Ordering[MapData] = new 
Ordering[MapData] {
@@ -348,14 +348,14 @@ class PhysicalNullType() extends PhysicalDataType with 
PhysicalPrimitiveType {
   override private[sql] def ordering =
     implicitly[Ordering[Unit]].asInstanceOf[Ordering[Any]]
   override private[sql] type InternalType = Any
-  @transient private[sql] lazy val tag = typeTag[InternalType]
+  @transient private[sql] lazy val tag = classTag[InternalType]
 }
 case object PhysicalNullType extends PhysicalNullType
 
 class PhysicalShortType() extends PhysicalIntegralType with 
PhysicalPrimitiveType {
   private[sql] type InternalType = Short
   private[sql] val ordering = implicitly[Ordering[InternalType]]
-  @transient private[sql] lazy val tag = typeTag[InternalType]
+  @transient private[sql] lazy val tag = classTag[InternalType]
   private[sql] val numeric = implicitly[Numeric[Short]]
   override private[sql] val exactNumeric = ShortExactNumeric
   private[sql] val integral = implicitly[Integral[Short]]
@@ -368,7 +368,7 @@ case class PhysicalStringType(collationId: Int) extends 
PhysicalDataType {
   // Defined with a private constructor so the companion object is the only 
possible instantiation.
   private[sql] type InternalType = UTF8String
   private[sql] val ordering = 
CollationFactory.fetchCollation(collationId).comparator.compare(_, _)
-  @transient private[sql] lazy val tag = typeTag[InternalType]
+  @transient private[sql] lazy val tag = classTag[InternalType]
 }
 object PhysicalStringType {
   def apply(collationId: Int): PhysicalStringType = new 
PhysicalStringType(collationId)
@@ -378,7 +378,7 @@ case class PhysicalArrayType(
     elementType: DataType, containsNull: Boolean) extends PhysicalDataType {
   override private[sql] type InternalType = ArrayData
   override private[sql] def ordering = interpretedOrdering
-  @transient private[sql] lazy val tag = typeTag[InternalType]
+  @transient private[sql] lazy val tag = classTag[InternalType]
 
   @transient
   private[sql] lazy val interpretedOrdering: Ordering[ArrayData] = new 
Ordering[ArrayData] {
@@ -425,7 +425,7 @@ case class PhysicalStructType(fields: Array[StructField]) 
extends PhysicalDataTy
   override private[sql] type InternalType = Any
   override private[sql] def ordering =
     
forSchema(this.fields.map(_.dataType).toImmutableArraySeq).asInstanceOf[Ordering[InternalType]]
-  @transient private[sql] lazy val tag = typeTag[InternalType]
+  @transient private[sql] lazy val tag = classTag[InternalType]
 
   private[sql] def forSchema(dataTypes: Seq[DataType]): InterpretedOrdering = {
     new InterpretedOrdering(dataTypes.zipWithIndex.map {
@@ -436,7 +436,7 @@ case class PhysicalStructType(fields: Array[StructField]) 
extends PhysicalDataTy
 
 class PhysicalVariantType extends PhysicalDataType {
   private[sql] type InternalType = VariantVal
-  @transient private[sql] lazy val tag = typeTag[InternalType]
+  @transient private[sql] lazy val tag = classTag[InternalType]
 
   // TODO(SPARK-45891): Support comparison for the Variant type.
   override private[sql] def ordering =
@@ -451,7 +451,7 @@ object UninitializedPhysicalType extends PhysicalDataType {
     throw QueryExecutionErrors.orderedOperationUnsupportedByDataTypeError(
       "UninitializedPhysicalType")
   override private[sql] type InternalType = Any
-  @transient private[sql] lazy val tag = typeTag[InternalType]
+  @transient private[sql] lazy val tag = classTag[InternalType]
 }
 
 // Physical type for opaque, variable-length byte payloads that are addressed 
as a zero-copy
@@ -466,7 +466,7 @@ object UninitializedPhysicalType extends PhysicalDataType {
 class PhysicalBinaryViewType extends PhysicalDataType {
   private[sql] val ordering = (x: BinaryView, y: BinaryView) => x.compareTo(y)
   private[sql] type InternalType = BinaryView
-  @transient private[sql] lazy val tag = typeTag[InternalType]
+  @transient private[sql] lazy val tag = classTag[InternalType]
 }
 
 case object PhysicalBinaryViewType extends PhysicalBinaryViewType


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

Reply via email to