diff --git a/sql/core/src/main/scala/org/apache/spark/sql/execution/aggregate/HashMapGenerator.scala b/sql/core/src/main/scala/org/apache/spark/sql/execution/aggregate/HashMapGenerator.scala index 19a36483abe6d..af9dcb44cf1f6 100644 --- a/sql/core/src/main/scala/org/apache/spark/sql/execution/aggregate/HashMapGenerator.scala +++ b/sql/core/src/main/scala/org/apache/spark/sql/execution/aggregate/HashMapGenerator.scala @@ -160,7 +160,8 @@ abstract class HashMapGenerator( case BooleanType => hashInt(s"$input ? 1 : 0") case ByteType | ShortType | IntegerType | DateType | _: YearMonthIntervalType => hashInt(input) - case LongType | TimestampType | TimestampNTZType | _: DayTimeIntervalType => hashLong(input) + case LongType | TimestampType | TimestampNTZType | _: DayTimeIntervalType | _: TimeType => + hashLong(input) case FloatType => hashInt(s"Float.floatToIntBits($input)") case DoubleType => hashLong(s"Double.doubleToLongBits($input)") case d: DecimalType => diff --git a/sql/core/src/test/scala/org/apache/spark/sql/DataFrameAggregateSuite.scala b/sql/core/src/test/scala/org/apache/spark/sql/DataFrameAggregateSuite.scala index 5820370b25fd8..d5e3cdc528916 100644 --- a/sql/core/src/test/scala/org/apache/spark/sql/DataFrameAggregateSuite.scala +++ b/sql/core/src/test/scala/org/apache/spark/sql/DataFrameAggregateSuite.scala @@ -18,7 +18,7 @@ package org.apache.spark.sql import java.sql.{Date, Timestamp} -import java.time.{Duration, LocalDateTime, Period} +import java.time.{Duration, LocalDateTime, LocalTime, Period} import scala.util.Random @@ -2902,6 +2902,17 @@ class DataFrameAggregateSuite extends QueryTest ) assert(badAgg2.checkInputDataTypes().isFailure) } + + test("SPARK-52626: Support group by Time column") { + val ts1 = "15:00:00" + val ts2 = "22:00:00" + val localTime = Seq(ts1, ts1, ts2).map(LocalTime.parse) + val df = localTime.toDF("t").groupBy("t").count().orderBy("t") + val expectedSchema = + new StructType().add(StructField("t", TimeType())).add("count", LongType, false) + assert (df.schema == expectedSchema) + checkAnswer(df, Seq(Row(LocalTime.parse(ts1), 2), Row(LocalTime.parse(ts2), 1))) + } } case class B(c: Option[Double])