2016-09-16 91 views
1

我struggeling其中在數據幀(其中從蜂巢表起源)操作的UDF處理空值由浮體的結構體的:火花UDF空處理

數據幀(points)具有以下模式:

root 
|-- point: struct (nullable = true) 
| |-- x: float (nullable = true) 
| |-- y: float (nullable = true) 

例如,我想計算x和y的總和。請注意,在下面的示例中,我不「處理」空值,但我希望能夠檢查我的udf是否point,xynull

第一種方法:

val sum = udf((x:Float,y:Float) => x+y) 

points.withColumn("sum",sum($"point.x",$"point.y")) 

如果structnull,在這種情況下,UDF不會求(!在UDF代碼永遠不會執行)這不起作用,則結果爲null。此外,我無法檢查xy爲空,因爲Floats在scala中不能爲空。

第二種方法:

val sum = udf((pt:Row) => pt.getFloat(0)+pt.getFloat(1)) 
points.withColumn("sum",sum($"point")) 

下這種方法,我可以在我的UDF檢查pt爲空,但我螺母能夠檢查xy因爲Floats不能爲空。在這種情況下,我得到一個NullPointerException

我該如何寫udf win來檢查struct和x和y是否爲null?

我使用的火花1.6.1

更新: 相反this question,我負責的花車,而不是與字符串(字符串可以在Scala中爲空,浮不)

回答

3

你可以使用Row.isNullAt(i)來檢查i th字段是否爲空。在你的情況下,你應該寫你的udf作爲,

sum = udf((point: Row) => point.match { 
    case p if (p.isNullAt(0) && p.isNullAt(0)) => 0f 
    case p if p.isNullAt(0) => p.getFloat(1) 
    case p if p.isNullAt(1) => p.getFloat(0) 
    case p => p.getFloat(0) + p.getFloat(1) 
})