Как @AssafMendelson уже объяснил, настоящая причина того, почему вы не можете создать Dataset
из Any
, заключается в том, что Spark требуется Encoder
для преобразования объектов из них JVM представление для его внутреннего представление - и Spark не может гарантировать генерацию такого Encoder
для Any
type.
Ответы Assaf верны и будут работать.
Однако, ИМХО, это слишком ограничительно, так как будет работать только для Products
(кортежей и классов case) - и даже если это включает в себя большинство вариантов использования, есть еще несколько исключенных.
Поскольку вам действительно нужен Encoder
, вы можете оставить эту ответственность за клиентом.Который в большинстве случаев будет нуждаться только в вызове import spark.implicits._
, чтобы получить их в области видимости.
Таким образом, это то, что я считаю, будет самым общим решением.
import org.apache.spark.sql.{DataFrame, Dataset, Encoder, SparkSession}
// Implicit SparkSession to make the call to further methods more transparent.
implicit val spark = SparkSession.builder.master("local[*]").getOrCreate()
import spark.implicits._
def makeDf[T: Encoder](seq: Seq[T], colNames: String*)
(implicit spark: SparkSession): DataFrame =
spark.createDataset(seq).toDF(colNames: _*)
def makeDS[T: Encoder](seq: Seq[T])
(implicit spark: SparkSession): Dataset[T] =
spark.createDataset(seq)
Примечание: Это в основном переизобретает уже определенные функции из Spark.