当前位置: 首页 > 知识库问答 >
问题:

UDF 中的异常处理:火花 1.6

全冥夜
2023-03-14
   def parse_values(value: String) = {
      val values = value.split(",").map(_.trim)
      values.foldLeft(Array[(Int, Double)]()) {
        case (acc, present) =>
          val Array(k, v) = {
            present.split(",")(0).split(":") match {
              case Array(_) => Array("0", "0.0")
              case arr => arr
            }
          }
          acc :+ (k.trim.toInt, v.trim.toDouble)
      }
    }

这个函数的作用是将字符串列解析为键和值的数组。"50:63.25,100:58.38"to[[50,63.2],[100,58.38]]。这是我的UDF,它创建了一个包装的int和Double结构元素数组。

 |    |-- element: struct (containsNull = true)
 |    |    |-- _1: integer (nullable = false)
 |    |    |-- _2: double (nullable = false)

有些情况下,输入字符串的格式不正确,我会得到一个错误:输入字符串的< code > Java . lang . numberformatexception :因为“< code>k.trim.toInt”无法转换像“< code>.01-4.1293”这样的脏数据,这是一个大型数据集中的异常字符串之一。有人能帮我解决这个问题吗?

当发生异常时,我想返回一个空数组或一个带有[0,0.0]的数组。有什么建议吗?

共有1个答案

白丁雨
2023-03-14

您可以使用尝试

而不是

(k.trim.toInt, v.trim.toDouble)

get 或Else 将其封装在尝试中,例如:

(Try(k.trim.toInt).getOrElse(0), Try(v.trim.toDouble).getOrElse(0.0))

如果成功,它将返回正确的值,如果失败,它将返回您希望的默认值

在这里快速测试:

val invalid: String = .01-4.1293
val valid: String = 56


Try(invalid.trim.toInt).getOrElse(0)
res19: Int = 0

Try(valid.trim.toInt).getOrElse(0)
res20: Int = 56

作为一个整体与您的功能:

import scala.util.Try

   def parse_values(value: String) = {
      val values = value.split(",").map(_.trim)
      values.foldLeft(Array[(Int, Double)]()) {
        case (acc, present) =>
          val Array(k, v) = {
            present.split(",")(0).split(":") match {
              case Array(_) => Array("0", "0.0")
              case arr => arr
            }
          }
          acc :+ (Try(k.trim.toInt).getOrElse(0), Try(v.trim.toDouble).getOrElse(0.0))
      }
    }

还可以在此处找到有关函数错误处理和 Try 类的详细信息

 类似资料:
  • 我目前正在使用上面的UDF将一列字符串解析成一个键和值的数组。“50:63.25,100:58.38”到[[50,63.2],[100,58.38]]。在某些情况下,字符串是“\N”,我无法解析列值。如果字符串是“\N”,那么我应该返回一个空数组。有人能帮我处理这个异常或帮我添加一个新的案例吗?我是spark-scala的新手。 错误:scala.MatchError:[Ljava.lang.St

  • 我正在处理UDF中的空值,该UDF在数据帧(源自配置单元表)上运行,该数据帧由浮点数结构组成: 数据帧()具有以下架构: 例如,我想计算x和y的总和。请注意,我不会在以下示例中“处理”空值,但我希望能够在我的udf中检查、或是否。 第一种方法: 如果<code>struct是否为空,因为在scala中<code>浮点不能为空。 第二种方法: 这种方法,我可以在我的udf中检查是否为空,但我可以检查

  • 我有一个要求,火花UDF必须超载,我知道UDF超载是不支持火花。因此,为了克服spark的这一限制,我尝试创建一个接受任何类型的UDF,它在UDF中找到实际的数据类型,并调用相应的方法进行计算并相应地返回值。这样做时,我得到一个错误 以下是示例代码: 有可能使上述要求成为可能吗?如果没有,请建议我一个更好的方法。 注:Spark版本-2.4.0

  • 我正在尝试按键对JavaPairRDD进行排序。 块引号

  • 我在火花数据帧中有一个“结构类型”列,它有一个数组和一个字符串作为子字段。我想修改数组并返回相同类型的新列。我可以用UDF处理它吗?或者有什么替代方案? 似乎我需要行类型的UDF,类似 这是有意义的,因为Spark不知道返回类型的模式。不幸的是,udf.register也失败了:

  • 我有一个用例,我必须以FIFO方式处理事件。这些是从机器生成的事件。每台机器每30秒生成一个事件。对于特定的机器,我们需要根据FIFO FASION对事件进行处理。 我们每天需要处理大约2.4亿个事件。对于如此大的规模,我们需要使用Kafka+火花流 从Kafka文档中,我了解到我们可以使用消息的关键字段将消息路由到特定的主题分区。这确保我可以使用机器id作为密钥,并确保来自特定机器的所有消息都进