Spark数据集是否使用空值减少?

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)

Jus*_*ony 5

我将强烈假设您的doubleUdf函数将值转换为双精度,而不是使用Option包装器为空值,您将空值转换为0.0.所以,如果你想保持逻辑删除空值,那么过滤之前的任何东西:

df.na.drop.select(doubleUdf(df("value"))).as[Double]
Run Code Online (Sandbox Code Playgroud)