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)
我会与你doubleUdf功能转换值双打很强的假设回答,而不是使用一个选项包装你正在转向空到0.0零点。所以,如果你想保持下降零点的逻辑,然后过滤器之前别的:
df.na.drop.select(doubleUdf(df("value"))).as[Double]
其实我的udf返回选项,因为这里推荐[链接] http://*.com/questions/32357164/sparksql-how-to-deal-with-null-values-in -user-defined-function [/ link]将它加到问题 – user2975535
已增加,但是在这里,select(doubleUdf(df(“value”)))是完全多余的。数据已经是'DoubleType'了,如果不是,建议'cast'会更好,你不觉得吗? – zero323
这仅仅是一个例子。这个函数假设适用于其他数据类型 – 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
那样失败。
什么是doubleUdf定义为。 –
@JustinPihony我已将它添加到问题 – user2975535