最初にすべてを再発明しないでください。多くの一般的なタスクのためには、組み込み関数を見つけることができます:あり、booleanValueSubstitution
を除いて、あなたが定義した
val df = Seq(None, Some(""), Some("true"), Some(" TRUE "), Some("foo")).toDF("x")
df.select(upper(trim($"x")))
機能:
import org.apache.spark.sql.functions.{trim, upper}
、他の利点の中ではnull
安全ですない。あなたのコードがNULL
に遭遇するたびに、それはNPEのために失敗するでしょう。あなたがホイールを再発明することに決めたら、それを常にカバーするべきです。あなたは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
。
次に、あなたがudf
とパターンマッチングの代わりに使用することができる慣用SQLソリューションが存在します。あなたは、例えばCASE WHEN
を使用することができます。
import org.apache.spark.sql.functions.{when, coalesce, lit}
df.select(
when($"x".isNull, "N").when($"x" === "", "N").when($"x" === "TRUE", "Y")
)
か:一般的に
when($"x".isNull, false).when($"x" === "", false).otherwise(true)
:
df.select(coalesce(when($"x" === "TRUE", "Y").otherwise("N"), lit("N")))
あなたはブール値を使用することをお勧めしブール値を考える場合
組み込み関数は、典型的にはいくつかの理由でUDFよりも優先。チェーンが常に可能ではないので
UDFは、すべての位置では許可されません。
df.withColumn("foo", someUDF("x")).withColumn("bar", someFunc("foo"))
:あなたは別途
udf
結果を追加しなければならないときの状況があります。