ser*_*eda 0 scala apache-spark
我正在使用以下代码创建数据框:
val data = List(
List(444.1235D),
List(67.5335D),
List(69.5335D),
List(677.5335D),
List(47.5335D),
List(null)
)
val rdd = sparkContext.parallelize(data).map(Row.fromSeq(_))
val schema = StructType(Array(
StructField("value", DataTypes.DoubleType, true)
))
val df = sqlContext.createDataFrame(rdd, schema)
Run Code Online (Sandbox Code Playgroud)
然后我将我的udf应用于它:
val multip: Dataset[Double] = df.select(doubleUdf(df("value"))).as[Double]
Run Code Online (Sandbox Code Playgroud)
然后我尝试在此数据集上使用reduce:
val multipl = multip.reduce(_ * _)
Run Code Online (Sandbox Code Playgroud)
在这里我得到0.0的结果.我也尝试过滤掉空值
val multipl = multip.filter(_ != null).reduce(_ * _)
Run Code Online (Sandbox Code Playgroud)
结果相同.如果我从数据中删除null值,一切正常.如何使用空值减少工作量?
我的udf定义如下:
val doubleUdf: UserDefinedFunction = udf((v: Any) => Try(v.toString.toDouble).toOption)
Run Code Online (Sandbox Code Playgroud)
我将强烈假设您的doubleUdf函数将值转换为双精度,而不是使用Option包装器为空值,您将空值转换为0.0.所以,如果你想保持逻辑删除空值,那么过滤之前的任何东西:
df.na.drop.select(doubleUdf(df("value"))).as[Double]
Run Code Online (Sandbox Code Playgroud)
| 归档时间: |
|
| 查看次数: |
1238 次 |
| 最近记录: |