【发布时间】:2017-07-24 16:04:56
【问题描述】:
我正在尝试编写一个 spark UDF,它将 Double 字段的空值替换为 0.0。我正在使用数据集 API。这是 UDF:
val coalesceToZero=udf((rate: Double) => if(Option(rate).isDefined) rate else 0.0)
这是基于我测试可以正常工作的以下功能:
def cz(value: Double): Double = if(Option(value).isDefined) value else 0.0
cz(null.asInstanceOf[Double])
cz: (value: Double)Double
res15: Double = 0.0
但是当我以下列方式在 Spark 中使用它时,UDF 不起作用。
myDS.filter($"rate".isNull)
.select($"rate", coalesceToZero($"rate")).show
+----+---------+
|rate|UDF(rate)|
+----+---------+
|null| null|
|null| null|
|null| null|
|null| null|
|null| null|
|null| null|
+----+---------+
但是以下工作:
val coalesceToZero=udf((rate: Any) => if(rate == null) 0.0 else rate.asInstanceOf[Double])
所以我想知道 Spark 是否有一些特殊的方法来处理 null Double 值。
【问题讨论】:
-
这看起来像 DataFrame API,而不是 Dataset API -
myDS的类型是什么? -
这是一个大案例类,其中“rate”字段的类型为 Double。我通过 sourceDF.as[MyCaseClass] 初始化了数据集
-
查看相关问题 issues.apache.org/jira/browse/SPARK-12648 - 建议允许带有
Option[Double]的 UDF 作为可空双列(和其他原语)的输入
标签: scala apache-spark apache-spark-dataset