gpt4 book ai didi

scala - Spark UDF 空处理

转载 作者:行者123 更新时间:2023-12-01 19:04:04 25 4
gpt4 key购买 nike

我正在努力处理 UDF 中的空值,该 UDF 对由浮点结构组成的数据帧(源自配置单元表)进行操作:

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

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

例如,我想计算x和y的和。请注意,在以下示例中我不会“处理”空值,但我希望能够检查我的 udf 是 pointx 还是 ynull

第一种方法:

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

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

如果struct点为null,则此方法不起作用,在这种情况下,永远不会评估udf(永远不会执行udf中的代码!),结果一片空白。另外,我无法检查 xy 是否为 null,因为 Floats 在 scala 中不能为 null。

第二种方法:

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

通过这种方法,我可以检查 udf 中的 pt 是否为 null,但我无法检查 xy 因为Floats 不能为空。在这种情况下,我得到一个 NullPointerException

如何编写一个 udf win 来检查结构以及 x 和 y 是否为空?

我使用的是 Spark 1.6.1

更新:与 this question 相比,我正在处理 float 而不是字符串(在 scala 中字符串可以为 null, float 则不能)

最佳答案

您可以使用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)
})

关于scala - Spark UDF 空处理,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/39527641/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com