如果为null或为空,则根据另一列更新列值

lc8prwob  于 2021-05-29  发布在  Spark
关注(0)|答案(1)|浏览(540)

我是spark的新手,但对spark性能调优非常好奇。我有一个需要更新列(比如列)的大Dataframe A )使用另一列的值(例如列 B )如果当前列值为null或空,则从同一Dataframe。我的做法是:

val cleanDF = originDF.withColumn("A", when(col("A").isNull || col("A") == "", col("B")))

以下是我的问题:
有没有更好的方法 null 检查?在java世界中,有apache公共库提供api来检查字符串 isBlank . spark有类似的产品吗?
手术室的性能影响如何( || )在大Dataframe上验证的条件
是否有更好的选项可以以更好的性能运行此列更新任务?我知道 UPDATE 在spark中可能会很贵,所以只是想知道好的做法。

46scxncf

46scxncf1#

1) 您可以使用commons lib。将--jars“公共jar文件的路径”添加到sparkshell或submit
2) 您正在对数据集执行一次传递(加上检查colb并将其复制到cola的固定时间),它应该是o(n)
3) 你的可乐(可能,如果空白)替换为colb从同一行,这是不贵的。我无法确认,但我假设一行的所有数据都驻留在同一个节点中。

scala> val df = Seq(
     |   (null, "A"),
     |   ("", "B"),
     |   (" ", "C"),
     |   ("D", "DB"),
     |   ("E", null)
     | ).toDF("colA","colB")
df: org.apache.spark.sql.DataFrame = [colA: string, colB: string]

scala> df.show
+----+----+
|colA|colB|
+----+----+
|null|   A|
|    |   B|
|    |   C|
|   D|  DB|
|   E|null|
+----+----+

scala> val myudf = udf{(x:String) => org.apache.commons.lang3.StringUtils.isBlank(x)}
myudf: org.apache.spark.sql.expressions.UserDefinedFunction = UserDefinedFunction(<function1>,BooleanType,Some(List(StringType)))

scala> df.select(when (myudf($"colA"), $"colB").otherwise($"colA") as "colA", $"colB").show(false)
+----+----+
|colA|colB|
+----+----+
|A   |A   |
|B   |B   |
|C   |C   |
|D   |DB  |
|E   |null|
+----+----+

相关问题