Definieren Sie Ihre Fallklasse und verwenden Sie sie als "Quelle" des Schemas für Ihre Datasets.
case class Point(val x: Double, val y: Double)
val points = Seq(Point(0,0), Point(0,1)).toDF
scala> points.show
+---+---+
| x| y|
+---+---+
|0.0|0.0|
|0.0|1.0|
+---+---+
Wie Sie vielleicht bemerkt haben, wird die Fallklasse zu einem bloßen Schema (d. H. Struktur) Ihres Datasets. Mit anderen Worten, Sie können keine benutzerdefinierte Funktion schreiben, die während der Verarbeitung solcher Datensätze Point
Objekte akzeptiert.
Eine mögliche Lösung besteht nicht darin, eine benutzerdefinierte Funktion zu verwenden, sondern Dataset
einzugeben und die Funktion nicht als benutzerdefinierte Funktion, sondern als reguläre Scala-Funktion (oder Methode) zu registrieren.
scala> val points = Seq(Point(0,0), Point(0,1)).toDS
points: org.apache.spark.sql.Dataset[Point] = [x: double, y: double]
def distance(x: Double, y: Double) = y - x
val myFn = (p:Point) => distance(p.x, p.y)
scala> points.map(myFn).show
+-----+
|value|
+-----+
| 0.0|
| 1.0|
+-----+
In SQL-Abfrage, ist "Point" -Typ verfügbar? Aufruf UDF müssen Sie Spalte übergeben, die Datentyp hat als "Point" –
No Point Typ existiert nicht, wie man es definiert? – syl