【问题标题】:Handling bad records in spark select statement处理 spark select 语句中的不良记录
【发布时间】:2019-11-22 11:15:37
【问题描述】:

我有一个 Seq[Column] 可以从数据框中进行选择。某些列可以是 udfs,因此可能有一列选择字符串列并尝试将其转换为双精度列。有时此列可能为空。

是否可以捕获抛出异常的记录,返回可以正确处理的记录数据帧,而不是终止整个数据帧的处理。 目前我有以下代码,如果单行的价格为空,则整个操作将失败。我希望它处理所有其他行

 def stringToLong(s: String): BigDecimal = s.toLong
 def stringToBigLongUdf: UserDefinedFunction = udf(stringToLong _)
 df.select(stringToLongUdf(new Column("price")))

【问题讨论】:

  • 您的代码无法编译。另外,我不完全理解您所说的“没有列的记录”是什么意思。数据框是表,所有记录对所有列都有值(即使它是 None 或 null)。您能否提供更多详细信息。也许是一些示例数据和预期输出?
  • 这样更好吗?
  • 您能否提供这样一个 UDF 列的示例以及它引发的错误?类型转换通常会传递空值,也可以编写 UDF 来优雅地处理它们。
  • 不是更好。如果您可以提供问题的最小实例以及代码和数据,这将非常有帮助,以便我们可以重现它并更好地了解您正在尝试做什么。它甚至可以帮助您自己找到解决方案。顺便说一句,您的代码仍然无法编译。
  • 试试select(columns :_*) ;-)

标签: apache-spark


【解决方案1】:

这是您的 UDF 应如何处理异常并返回 None 以表示错误

import scala.util.{Try, Success, Failure}
import org.apache.spark.sql.expressions.UserDefinedFunction
import org.apache.spark.sql.functions._

def stringToLong(s: String): Option[BigDecimal] = {
  Try(s.toLong) match {
    case Success(v) => Some(v)
    case Failure(_) => None 
  }
}

def stringToBigLongUdf: UserDefinedFunction = udf(stringToLong _)
val df = Seq("111", "23d", "456").toDF("price")
df.select(stringToBigLongUdf(col("price"))).show

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2011-02-08
    • 1970-01-01
    • 2017-02-20
    • 2019-03-09
    • 1970-01-01
    • 2019-03-18
    • 2023-03-08
    • 2018-11-08
    相关资源
    最近更新 更多