如何在Spark DataFrame中进行链功能



如何在Spark DataFrame中进行链功能?在我的代码中,我想先执行大写,然后进行布尔转换。但是我的代码不起作用。谢谢

import org.apache.spark.sql.functions.udf
val trimStr: String => String = _.trim
val trimUDF = udf(trimStr)
import org.apache.spark.sql.functions.udf
val upperCaseStr: String => String = _.toUpperCase
val upperCaseUDF = udf(upperCaseStr)
import org.apache.spark.sql.functions.udf
     def booleanValueSubstitution = udf[String, String] {
       case "" => "N"
       case null => "N"           
       case "TRUE" => "Y"        
     }
var df= df1.withColumn("xx", booleanValueSubstitution(upperCaseUDF(df1("yy"))) )

首先不要重塑车轮。对于许多常见的任务,您会发现内置功能:

import org.apache.spark.sql.functions.{trim, upper}

哪个好处是null安全:

val df = Seq(None, Some(""), Some("true"), Some(" TRUE "), Some("foo")).toDF("x")
df.select(upper(trim($"x")))
+--------------+
|upper(trim(x))|
+--------------+
|          null|
|              |
|          TRUE|
|          TRUE|
|           foo|
+--------------+

您定义的功能,除了booleanValueSubstitution,但不是。每当您的代码遇到NULL

您可以像使用booleanValueSubstitution一样进行模式匹配,也可以使用Try

import scala.util.Try
val upperCaseUDF = udf((s: String) => Try(s.toUpperCase).toOption)
val trimUDF = udf((s: String) => Try(s.trim).toOption)

如果您决定使用模式匹配,请确保条件详尽:

val booleanValueSubstitution = udf[String, String] {
  case "" => "N"
  case null => "N"           
  case "TRUE" => "Y"   
  case _ => "N"
}

或更简单:

val booleanValueSubstitution = udf[String, String] {      
  case "TRUE" => "Y"
  case _ => "N"
}

否则您将获得scala.MatchError

接下来,存在惯用的SQL解决方案,您可以代替与udf匹配的图案。您可以使用CASE WHEN

import org.apache.spark.sql.functions.{when, coalesce, lit}
df.select(
  when($"x".isNull, "N").when($"x" === "", "N").when($"x" === "TRUE", "Y")
)

或:

df.select(coalesce(when($"x" === "TRUE", "Y").otherwise("N"), lit("N")))

最后,如果您认为布尔人最好使用布尔值:

when($"x".isNull, false).when($"x" === "", false).otherwise(true)

通常:

  • 由于多种原因,内置功能通常优于UDF。
  • 在每个位置都不允许使用UDF,因此链接并非总是可能的。在某些情况下,您必须单独添加udf结果:

    df.withColumn("foo", someUDF("x")).withColumn("bar", someFunc("foo"))
    

相关内容

  • 没有找到相关文章

最新更新