2017-10-16 3 views
3

J'utilise Spark 2.2 et je rencontre des problèmes lorsque j'essaie d'appeler spark.createDataset sur un Seq de Map.Codage d'une séquence de mappage vers un jeu de données Spark

code et la sortie de mon Spark suivi de la session Shell:

// createDataSet on Seq[T] where T = Int works 
scala> spark.createDataset(Seq(1, 2, 3)).collect 
res0: Array[Int] = Array(1, 2, 3) 

scala> spark.createDataset(Seq(Map(1 -> 2))).collect 
<console>:24: error: Unable to find encoder for type stored in a Dataset. 
Primitive types (Int, String, etc) and Product types (case classes) are 
supported by importing spark.implicits._ 
Support for serializing other types will be added in future releases. 
     spark.createDataset(Seq(Map(1 -> 2))).collect 
         ^

// createDataSet on a custom case class containing Map works 
scala> case class MapHolder(m: Map[Int, Int]) 
defined class MapHolder 

scala> spark.createDataset(Seq(MapHolder(Map(1 -> 2)))).collect 
res2: Array[MapHolder] = Array(MapHolder(Map(1 -> 2))) 

J'ai essayé import spark.implicits._, même si je suis assez certain que ça implicitement par la session importée shell Spark.

Est-ce un cas non couvert par les codeurs actuels?

Répondre

5

Il n'est pas couvert en 2.2, mais peut être facilement résolu. Vous pouvez ajouter à l'aide nécessaire EncoderExpressionEncoder, que ce soit explicitement:

import org.apache.spark.sql.catalyst.encoders.ExpressionEncoder 
import org.apache.spark.sql.Encoder 

spark 
    .createDataset(Seq(Map(1 -> 2)))(ExpressionEncoder(): Encoder[Map[Int, Int]]) 

ou implicitly:

implicit def mapIntIntEncoder: Encoder[Map[Int, Int]] = ExpressionEncoder() 
spark.createDataset(Seq(Map(1 -> 2)))