2017-05-05 136 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| 
+-----+ 
相關問題