加入收藏 | 设为首页 | 会员中心 | 我要投稿 李大同 (https://www.lidatong.com.cn/)- 科技、建站、经验、云计算、5G、大数据,站长网!
当前位置: 首页 > 综合聚焦 > 服务器 > 安全 > 正文

scala – Spark UDF Null处理

发布时间:2020-12-16 18:08:57 所属栏目:安全 来源:网络整理
导读:我正在努力处理UDF中的null值,该UDF对数据帧(源自hive表)进行操作,其中包含一个浮点结构: 数据框(点)具有以下模式: root |-- point: struct (nullable = true) | |-- x: float (nullable = true) | |-- y: float (nullable = true) 例如,我想计算x和y的总
我正在努力处理UDF中的null值,该UDF对数据帧(源自hive表)进行操作,其中包含一个浮点结构:

数据框(点)具有以下模式:

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

例如,我想计算x和y的总和.请注意,我在以下示例中没有“处理”空值,但我希望能够在我的udf中检查point,x或y是否为null.

第一种方法:

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

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

如果struct point为null,则这不起作用,在这种情况下永远不会计算udf(udf中的代码永远不会被执行!),结果为null.另外,我无法检查x或y是否为null,因为在scala中Floats不能为null.

第二种方法:

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

哪种方法,我可以在我的udf中检查pt为null,但我能够检查x和y,因为Floats不能为null.在这种情况下,我得到一个NullPointerException.

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

我正在使用spark 1.6.1

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

解决方法

您可以使用Row.isNullAt(i)来检查ith字段是否为空.在你的情况下,你应该写你的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)
})

(编辑:李大同)

【声明】本站内容均来自网络,其相关言论仅代表作者个人观点,不代表本站立场。若无意侵犯到您的权利,请及时与联系站长删除相关内容!

    推荐文章
      热点阅读