gpt4 book ai didi

scala - Spark DataFrame - 从列中删除空值

转载 作者:行者123 更新时间:2023-12-01 11:21:40 28 4
gpt4 key购买 nike

给定一个数据框:

    val df = sc.parallelize(Seq(("foo", ArrayBuffer(null,"bar",null)), ("bar", ArrayBuffer("one","two",null)))).toDF("key", "value")
df.show

+---+--------------------------+
|key| value|
+---+--------------------------+
|foo|ArrayBuffer(null,bar,null)|
|bar|ArrayBuffer(one, two,null)|
+---+--------------------------+

我想从 value 列中删除 null。删除数据框后应如下所示:

    +---+--------------------------+
|key| value|
+---+--------------------------+
|foo|ArrayBuffer(bar) |
|bar|ArrayBuffer(one, two) |
+---+--------------------------+

欢迎任何建议。 10倍

最佳答案

这里你需要一个 UDF。以 flatMap 为例:

val filterOutNull = udf((xs: Seq[String]) => 
Option(xs).map(_.flatMap(Option(_))))

df.withColumn("value", filterOutNull($"value"))

其中带有 map 的外部 Option 处理 NULL 列:

Option(null: Seq[String]).map(identity)
Option[Seq[String]] = None
Option(Seq("foo", null, "bar")).map(identity)
Option[Seq[String]] = Some(List(foo, null, bar))

并通过映射确保当输入为 NULL/null 时我们不会因 NPE 而失败

NULL -> null -> None -> None -> NULL

其中 null 是 Scala nullNULL 是 SQL NULL

内部 flatMap 将一系列 Options 展平,有效过滤 nulls:

Seq("foo", null, "bar").flatMap(Option(_))
Seq[String] = List(foo, bar)

一个更命令式的等价物可能是这样的:

val imperativeFilterOutNull = udf((xs: Seq[String]) => 
if (xs == null) xs
else for {
x <- xs
if x != null
} yield x)

关于scala - Spark DataFrame - 从列中删除空值,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/41829629/

28 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com