2017-05-05 101 views
0

我需要编写一个用户定义的功能与特定类型作为输入如何在用户自定义函数中使用自定义类型?

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

我创建的情况下,类Point

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

当我使用UDF在SQL查询,它不工作。任何帮助?

+0

在SQL查询中,“Point”类型是否可用?调用UDF需要传递数据类型为“Point”的列 –

+0

否点类型不存在,如何定义它? – syl

回答

0

我不知道你确切的要求,但看着你的代码,我提出了一些逻辑。

希望你的查询/表有两个单独的值作为X和Y 您可以重新塑造你的UDF如下

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

现在你可以使用新的UDF使用withCoumn(),并通过两个独立的参数X和Y

让我知道知道任何其他的东西。

+0

@syl如果它适合你,请回答正确 –

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| 
+-----+ 
相关问题