Plutôt que de reproduire manuellement la logique de création de l'implicite Encoder
qui est transmis à toDF
on peut l'utiliser directement (ou, plus précisément, implicitement de la même façon que toDF
) :
// spark: SparkSession
import spark.implicits._
implicitly[Encoder[MyCaseClass]].schema
Malheureusement, cette méthode présente le même problème que l'utilisation de l'option org.apache.spark.sql.catalyst
o Encoders
comme dans les autres réponses : le site Encoder
trait est expérimental.
Comment cela fonctionne-t-il ? Le site toDF
méthode sur Seq
provient d'un DatasetHolder
qui est créé par l'intermédiaire de la méthode implicite localSeqToDatasetHolder
qui est importé via spark.implicits._
. Cette fonction est définie comme suit :
implicit def localSeqToDatasetHolder[T](s: Seq[T])(implicit arg0: Encoder[T]): DatasetHolder[T]
Comme vous pouvez le voir, il faut un implicit
Encoder[T]
qui, pour un case class
peut être calculée par newProductEncoder
(également importé via spark.implicits._
). Nous pouvons reproduire cette logique implicite pour obtenir une Encoder
pour notre classe de cas, via la commodité scala.Predef.implicitly
(dans le champ d'application par défaut, parce qu'il provient de Predef
) qui retournera simplement l'argument implicite demandé :
def implicitly[T](implicit e: T): T