Scala Spark-UDF空处理

Scala Spark-UDF空处理,scala,apache-spark,udf,Scala,Apache Spark,Udf,我正在处理UDF中的空值,该UDF在数据帧(源自配置单元表)上运行,该数据帧由一个浮点结构组成: 数据帧(点)具有以下架构: root |-- point: struct (nullable = true) | |-- x: float (nullable = true) | |-- y: float (nullable = true) 例如,我想计算x和y的和。请注意,在以下示例中,我不“处理”空值,但我希望能够在udf中检查点、x或y是否为null 第一种方法: val

我正在处理UDF中的空值,该UDF在数据帧(源自配置单元表)上运行,该数据帧由一个浮点结构组成:

数据帧(
)具有以下架构:

root
 |-- point: struct (nullable = true)
 |    |-- x: float (nullable = true)
 |    |-- y: float (nullable = true)
例如,我想计算x和y的和。请注意,在以下示例中,我不“处理”空值,但我希望能够在udf中检查
x
y
是否为
null

第一种方法:

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

points.withColumn("sum",sum($"point.x",$"point.y"))
val sum = udf((pt:Row) => pt.getFloat(0)+pt.getFloat(1))
points.withColumn("sum",sum($"point"))
如果
struct
点为
null
,则这不起作用,在这种情况下,从未对udf求值(udf中的代码从未执行!),结果为null。此外,我无法检查
x
y
是否为null,因为
浮动在scala中不能为null

第二种方法:

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

points.withColumn("sum",sum($"point.x",$"point.y"))
val sum = udf((pt:Row) => pt.getFloat(0)+pt.getFloat(1))
points.withColumn("sum",sum($"point"))
在这种方法中,我可以在我的udf中检查
pt
是否为null,但我不能检查
x
y
,因为
浮动
不能为null。在这种情况下,我得到一个
NullPointerException

我如何编写一个udf win,我可以检查struct、x和y是否为null

我用的是spark 1.6.1

更新:
与之相反,我处理的是浮点数而不是字符串(字符串在scala中可以为null,浮点数不是)

您可以使用
Row.isNullAt(I)
检查
I
th字段是否为null。在您的情况下,您应该将您的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)
})