Spark Datasets bewegen sich von Row zu Encoder
für Pojos/Primitive. Die Catalyst
-Engine verwendet ExpressionEncoder
, um Spalten in einem SQL-Ausdruck zu konvertieren. Es scheint jedoch keine anderen Unterklassen von Encoder
zu geben, die als Vorlage für unsere eigenen Implementierungen verwendet werden können. HierWie erstelle ich einen benutzerdefinierten Encoder in Spark 2.X Datasets?
ist ein Beispiel-Code, der in Spark-1.X glücklich ist/Datenrahmen, die nicht in dem neuen Regime nicht kompiliert:
//mapping each row to RDD tuple
df.map(row => {
var id: String = if (!has_id) "" else row.getAs[String]("id")
var label: String = row.getAs[String]("label")
val channels : Int = if (!has_channels) 0 else row.getAs[Int]("channels")
val height : Int = if (!has_height) 0 else row.getAs[Int]("height")
val width : Int = if (!has_width) 0 else row.getAs[Int]("width")
val data : Array[Byte] = row.getAs[Any]("data") match {
case str: String => str.getBytes
case arr: Array[[email protected]] => arr
case _ => {
log.error("Unsupport value type")
null
}
}
(id, label, channels, height, width, data)
}).persist(StorageLevel.DISK_ONLY)
}
Wir bekommen einen Compiler-Fehler von
Error:(56, 11) 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.
df.map(row => {
^
Also irgendwie/irgendwo sollte es ein Mittel, um
-
sein
- definieren/implementieren unsere eigene Encoder
- es Nehmen, wenn eine Abbildung auf der
DataFrame
Durchführung (das jetzt ein Datensatz vom Typ) - für den Encoder-Register von anderen benutzerdefinierten Code
Ich bin Suchen nach Code, der diese Schritte erfolgreich ausführt.
Mögliche Duplikat von [Wie benutzerdefinierte speichern Objekte in einem Datensatz] (http: // Stackoverflow .com/questions/36648128/how-to-store-benutzerdefinierte-Objekte-in-einem-Dataset) – Alec