我需要编写一个特定类型作为输入的用户定义函数
spark.udf.register("udf", (p:Point) => distance(p.x, p.y))
我创建了一个案例类Point
case class Point(val x: Double, val y: Double)
当我在Sql查询中使用udf时,它无效。有帮助吗?
答案 0 :(得分:1)
定义您的案例类并将其用作"来源"您的数据集的架构。
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|
+---+---+
您可能已经注意到,案例类只是数据集的架构(即结构)。换句话说,在处理此类数据集时,您无法编写可接受Point
对象的用户定义函数。
一种可能的解决方案是不使用用户定义的函数,而是键入Dataset
并将函数注册为UDF而不是常规Scala函数(或方法)。
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|
+-----+