Warning: file_get_contents(/data/phpspider/zhask/data//catemap/3/apache-spark/6.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Scala Spark数据集是否使用空值减少?_Scala_Apache Spark - Fatal编程技术网

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

Scala Spark数据集是否使用空值减少?,scala,apache-spark,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(Arra

我正在使用以下代码创建数据帧:

  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]
然后我尝试在这个数据集上使用reduce:

val multipl = multip.reduce(_ * _)
结果我得到了0.0。 我还试图过滤掉空值

val multipl = multip.filter(_ != null).reduce(_ * _)
同样的结果。 如果我从数据中删除空值,一切都会正常工作。如何使reduce使用空值

我的自定义项定义如下:

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

我将用一个强有力的假设来回答这个问题,即doubleUdf函数将值转换为double,而不是使用null的选项包装器,而是将null转换为0.0。因此,如果要保留删除null的逻辑,请先进行筛选:

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

首先,我想问你为什么要处理
null
。我会评估我读取数据的方式,以确保不会发生这种情况

然后我会注意到,在进入RDD级别之前,您可以从内存中的
列表中删除
null
,例如:

data.flatMap(选项()).flatte

但是,如果您必须在RDD级别处理
null
,您可以选择(没有双关语):

sparkContext.parallelize(数据).filter(!\ux.contains(null))

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

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


我会远离基于UDF的解决方案,因为Spark无法优化UDF,而失去Spark的优化功能却比
null

doubleUdf的定义更糟糕,这是一件很遗憾的事情。@JustinPihony我已经将它添加到了问题中,实际上我的UDF返回选项是这里推荐的[链接]将其添加到问题中,但是
select(doubleUdf(df(“value”))
在这里是完全多余的。数据已经是一个
双类型
,如果不是的话,建议使用
演员阵容
,你不这么认为吗?这只是一个例子。假设此函数适用于其他数据类型