如何在用户定义的函数中使用自定义类型?

时间:2017-05-05 14:44:27

标签: apache-spark apache-spark-sql udf

我需要编写一个特定类型作为输入的用户定义函数

spark.udf.register("udf", (p:Point) => distance(p.x, p.y))

我创建了一个案例类Point

case class Point(val x: Double, val y: Double)

当我在Sql查询中使用udf时,它无效。有帮助吗?

1 个答案:

答案 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|
+-----+