Я очень доволен Spare 2.0 DataSets из-за его компиляции безопасности типа времени. Но вот пара проблем, которые я не могу решить, я также не нашел для этого хорошей документации.
Проблема № 1 - деление операции на агрегированном столбце - Рассмотрим ниже код - У меня есть DataSet [MyCaseClass], и я хотел бы groupByKey на c1, c2, c3 и sum (c4)/8. Приведенный ниже код работает хорошо, если я просто вычислил сумму, но он дает ошибку времени компиляции для деления (8). Интересно, как я могу добиться следующих результатов.
final case class MyClass (c1: String,
c2: String,
c3: String,
c4: Double)
val myCaseClass: DataSet[MyCaseClass] = ??? // assume it being loaded
import sparkSession.implicits._
import org.apache.spark.sql.expressions.scalalang.typed.{sum => typedSum}
myCaseClass.
groupByKey(myCaseClass =>
(myCaseClass.c1, myCaseClass.c2, myCaseClass.c3)).
agg(typedSum[MyCaseClass](_.c4).name("sum(c4)").
разделяй (8)).//это нарушение с исключением шоу()
Если я удаляю .divide(8) и выполняю команду выше, он дает мне ниже выход.
+-----------+-------------+
| key|sum(c4) |
+-----------+-------------+
|[A1,F2,S1]| 80.0|
|[A1,F1,S1]| 40.0|
+-----------+-------------+
Проблема №2 - преобразование результата groupedByKey в другой типизированный DataFrame - Теперь вторая часть моей проблемы заключается в том, что я хочу снова выводить типизированный DataSet. Для этого у меня есть другой класс case (не уверен, что это необходимо), но я не уверен, как сопоставить сгруппированным результатом -
класс final case AnotherClass (c1: String, c2: Строка, c3: Строка, средний: двойной)
myCaseClass.
groupByKey(myCaseClass =>
(myCaseClass.c1, myCaseClass.c2, myCaseClass.c3)).
agg(typedSum[MyCaseClass](_.c4).name("sum(c4)")).
as[AnotherClass] //this is breaking with exception
но это снова не выполняется с исключением, поскольку сгруппированный по результату ключа не напрямую сопоставляется с AnotherClass.
PS: любое другое решение для достижения выше приветствуется.