Warum kann bei der Erstellung eines Datensatzes der benutzerdefinierten Fallklasse "Encoder für den in einem Datensatz gespeicherten Typ nicht gefunden werden"?
Spark 2.0 (final) mit Scala 2.11.8. Die folgende super simple code ergibt die Zusammenstellung Fehler Error:(17, 45) 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.
import org.apache.spark.sql.SparkSession
case class SimpleTuple(id: Int, desc: String)
object DatasetTest {
val dataList = List(
SimpleTuple(5, "abc"),
SimpleTuple(6, "bcd")
)
def main(args: Array[String]): Unit = {
val sparkSession = SparkSession.builder.
master("local")
.appName("example")
.getOrCreate()
val dataset = sparkSession.createDataset(dataList)
}
}
InformationsquelleAutor der Frage clay | 2016-07-29
Du musst angemeldet sein, um einen Kommentar abzugeben.
Funke
Datasets
erfordernEncoders
für Daten geben, die über gespeichert werden. Für die gängigsten Typen (atomics, Produkt-Typen) es gibt eine Reihe von vordefinierten Encoder zur Verfügung, aber Sie haben, importieren Sie diese zuerst ausSparkSession.implicits
damit es funktioniert:Weiter Lesen:
Row
Objekte, die Sie haben, umEncoder
explizit, wie gezeigt, in Encoder-Fehler beim anzeigen dataframe Zeile zu Zeile aktualisiertInformationsquelleAutor der Antwort zero323
Für andere Benutzer (Ihre ist richtig), beachten Sie, dass Sie es auch wichtig, dass die
case class
definiert ist außerhalb derobject
Umfang. Also:Ausfällt:
Fügen Sie die implicits, immer noch nicht mit dem gleichen Fehler:
Funktioniert:
Hier ist der relevante Fehler: https://issues.apache.org/jira/browse/SPARK-13540also wird es hoffentlich behoben sein in der nächsten Version von Spark 2.
(Edit: wie das Aussieht, der bugfix ist tatsächlich in der Funke 2.0.0... Also ich bin mir nicht sicher, warum dies immer noch nicht).
InformationsquelleAutor der Antwort MrProper
Ich würde klären, mit einer Antwort auf meine eigene Frage ist, dass, wenn das Ziel ist die Definition einer einfachen wörtlichen SparkData Rahmen, anstatt mit Scala-Tupeln und eine implizite Umwandlung der einfachere Weg ist, um die Spark-API direkt so:
InformationsquelleAutor der Antwort clay