Rap*_*oth 4 scala apache-spark udf
我正在努力处理在由浮点数结构组成的数据帧(源自配置单元表)上运行的UDF中的空值:
数据框(points)具有以下架构:
root
|-- point: struct (nullable = true)
| |-- x: float (nullable = true)
| |-- y: float (nullable = true)
Run Code Online (Sandbox Code Playgroud)
例如,我要计算x和y的总和。请注意,我不“处理”空值在下面的例子,但我希望能够在我的UDF检查是否point,x或者y是null。
第一种方法:
val sum = udf((x:Float,y:Float) => x+y)
points.withColumn("sum",sum($"point.x",$"point.y"))
Run Code Online (Sandbox Code Playgroud)
如果该struct点为null,则此方法不起作用,在这种情况下,永远不会评估udf(永远不会执行udf中的代码!),结果为null。另外,我无法检查x或y为null,因为Floats在scala中不能为null。
第二种方法:
val sum = udf((pt:Row) => pt.getFloat(0)+pt.getFloat(1))
points.withColumn("sum",sum($"point"))
Run Code Online (Sandbox Code Playgroud)
使用这种方法,我可以pt在udf中检查是否为空,但是我可以检查x并且y因为Floats不能为空。NullPointerException在这种情况下,我得到一个。
如何编写udf win,可以检查struct以及x和y是否为null?
我正在使用spark 1.6.1
更新:与这个问题相反,我在处理浮点数而不是字符串(scala中的字符串可以为null,而浮点数则不是)
您可以Row.isNullAt(i)用来检查i字段是否为空。就您而言,您应将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)
})
Run Code Online (Sandbox Code Playgroud)
| 归档时间: |
|
| 查看次数: |
1556 次 |
| 最近记录: |