Spark数据集使用空值减少?

问题描述:

我使用此代码创建数据帧: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) 

然后我申请我的UDF它:

val multip: Dataset[Double] = df.select(doubleUdf(df("value"))).as[Double] 

,然后我想用这个数据集减轻:

val multipl = multip.reduce(_ * _) 

在这里,我得到了0.0作为结果。 此外,我试着用同样的结果筛选出空

val multipl = multip.filter(_ != null).reduce(_ * _) 

。 如果我从数据中删除空值,那么所有工作都应该如此。如何使用空值减少工作量?

我的UDF的定义是这样的:

val doubleUdf: UserDefinedFunction = udf((v: Any) => Try(v.toString.toDouble).toOption) 
+1

什么是doubleUdf定义为。 –

+0

@JustinPihony我已将它添加到问题 – user2975535

我会与你doubleUdf功能转换值双打很强的假设回答,而不是使用一个选项包装你正在转向空到0.0零点。所以,如果你想保持下降零点的逻辑,然后过滤器之前别的:

df.na.drop.select(doubleUdf(df("value"))).as[Double] 
+0

其实我的udf返回选项,因为这里推荐[链接] http://*.com/questions/32357164/sparksql-how-to-deal-with-null-values-in -user-defined-function [/ link]将它加到问题 – user2975535

+0

已增加,但是在这里,select(doubleUdf(df(“value”)))是完全多余的。数据已经是'DoubleType'了,如果不是,建议'cast'会更好,你不觉得吗? – zero323

+0

这仅仅是一个例子。这个函数假设适用于其他数据类型 – user2975535

首先,我会问你为什么即使null处理的。我会评估我读取数据的方式,以确保不会发生。

然后我会注意,您可以消除从null你的内存List之前,你甚至可以在RDD水平这样的例子:

data.flatMap(Option(_)).flatten

但如果你必须在处理null RDD水平,你有选择的(没有双关语意):

sparkContext.parallelize(data).filter(!_.contains(null))

sparkContext.parallelize(data).map(_.flatMap(Option(_))).filter(_.nonEmpty)

我更喜欢后者。我不喜欢在Scala代码中查看null

由于Spark无法优化UDF,所以我会远离基于UDF的解决方案,并且遗憾地丢失了Spark的优化功能,而不是像null那样失败。