Scala Spark用NULL替换空String
Posted
tags:
篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了Scala Spark用NULL替换空String相关的知识,希望对你有一定的参考价值。
我想要的是将特定列中的值替换为null,如果它是空String。
原因是我使用org.apache.spark.sql.functions.coalesce
根据另一列填充Dataframe的一列,但我注意到在某些行中值为empty String
而不是null
,因此coalesce
函数无法按预期工作。
val myCoalesceColumnorder: Seq[String] = Seq("xx", "yy", "zz"),
val resolvedDf = df.select(
df("a"),
df("b"),
lower(org.apache.spark.sql.functions.coalesce(myCoalesceColumnorder.map(x => adjust(x)): _*)).as("resolved_id")
)
在上面的例子中,我预计首先用resolved_id
列填充xx
,如果它不为null,如果它与列yy
为空,依此类推。但是,因为有时列xx
填充""
而不是null,我在'resolved_id'中得到""
。
我试图修复它
resolvedDf.na.replace("resolved_id", Map("" -> null))
但基于na.replace
文档,它只有在密钥和值都是Bolean
或String
或Double
时才有效,所以我不能在这里使用null
。
我不想因为性能问题而使用UDF
,我只是想知道有没有其他技巧来解决这个问题?
我可以解决这个问题的另一种方法是使用when
但不确定性能
resolvedDf
.withColumn("resolved_id", when(col("resolved_id").equalTo(""), null).otherwise(col("resolved_id")))
答案
这是具有更好性能的正确方法
resolvedDf.withColumn("resolved_id", when($"resolved_id" !== "", $"resolved_id"))
基本上不需要使用otherwise
方法。
/**
* Evaluates a list of conditions and returns one of multiple possible result expressions.
* If otherwise is not defined at the end, null is returned for unmatched conditions.
*
* {{{
* // Example: encoding gender string column into integer.
*
* // Scala:
* people.select(when(people("gender") === "male", 0)
* .when(people("gender") === "female", 1)
* .otherwise(2))
*
* // Java:
* people.select(when(col("gender").equalTo("male"), 0)
* .when(col("gender").equalTo("female"), 1)
* .otherwise(2))
* }}}
*
* @group expr_ops
* @since 1.4.0
*/
def when(condition: Column, value: Any): Column = this.expr match {
case CaseWhen(branches, None) =>
withExpr { CaseWhen(branches :+ ((condition.expr, lit(value).expr))) }
case CaseWhen(branches, Some(_)) =>
throw new IllegalArgumentException(
"when() cannot be applied once otherwise() is applied")
case _ =>
throw new IllegalArgumentException(
"when() can only be applied on a Column previously generated by when() function")
}
以上是关于Scala Spark用NULL替换空String的主要内容,如果未能解决你的问题,请参考以下文章
在 Spark 2.4 中使用正则表达式替换向数据帧输出添加空值