gpt4 book ai didi

apache-spark - 在 Spark DataFrame 中将空值转换为空数组

转载 作者:行者123 更新时间:2023-12-03 21:20:50 24 4
gpt4 key购买 nike

我有一个 Spark 数据框,其中一列是整数数组。该列可以为空,因为它来自左外连接。我想将所有空值转换为空数组,以便以后不必处理空值。

我以为我可以这样做:

val myCol = df("myCol")
df.withColumn( "myCol", when(myCol.isNull, Array[Int]()).otherwise(myCol) )

但是,这会导致以下异常:
java.lang.RuntimeException: Unsupported literal type class [I [I@5ed25612
at org.apache.spark.sql.catalyst.expressions.Literal$.apply(literals.scala:49)
at org.apache.spark.sql.functions$.lit(functions.scala:89)
at org.apache.spark.sql.functions$.when(functions.scala:778)

显然 when 不支持数组类型功能。还有其他一些简单的方法来转换空值吗?

如果相关,这里是此列的架构:
|-- myCol: array (nullable = true)
| |-- element: integer (containsNull = false)

最佳答案

您可以使用 UDF:

import org.apache.spark.sql.functions.udf

val array_ = udf(() => Array.empty[Int])

结合 WHENCOALESCE :

df.withColumn("myCol", when(myCol.isNull, array_()).otherwise(myCol))
df.withColumn("myCol", coalesce(myCol, array_())).show

在最近的版本中,您可以使用 array功能:

import org.apache.spark.sql.functions.{array, lit}

df.withColumn("myCol", when(myCol.isNull, array().cast("array<integer>")).otherwise(myCol))
df.withColumn("myCol", coalesce(myCol, array().cast("array<integer>"))).show

请注意,它仅在从 string 转换时才有效。允许到所需的类型。

同样的事情当然也可以在 PySpark 中完成。对于遗留解决方案,您可以定义 udf
from pyspark.sql.functions import udf
from pyspark.sql.types import ArrayType, IntegerType

def empty_array(t):
return udf(lambda: [], ArrayType(t()))()

coalesce(myCol, empty_array(IntegerType()))

在最近的版本中只需使用 array :

from pyspark.sql.functions import array

coalesce(myCol, array().cast("array<integer>"))

关于apache-spark - 在 Spark DataFrame 中将空值转换为空数组,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/34660867/

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