2016-09-16 103 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) 
})