Spark java.lang.UnsupportedOperationException:空集合

时间:2018-04-26 12:49:36

标签: scala apache-spark spark-dataframe

当我运行此代码时,在某些情况下会出现空集合错误。

    val result = df
                  .filter(col("channel_pk") === "abc")
                  .groupBy("member_PK")
                  .agg(sum(col("price") * col("quantityOrdered")) as "totalSum")
                  .select("totalSum")
                  .rdd.map(_ (0).asInstanceOf[Double]).reduce(_ + _)

错误发生在这一行:

.rdd.map(_ (0).asInstanceOf[Double]).reduce(_ + _)

当集合为空时,我希望result等于0.我该怎么办?

2 个答案:

答案 0 :(得分:1)

错误仅出现在该行,因为这是您第一次进行某些操作。在那之前火花没有执行任何事情(懒惰)。你的df只是空的。 您可以通过以下方式添加来验证它: assert(!df.take(1).isEmpty)

答案 1 :(得分:1)

  
    

当集合为空时,我希望结果等于0.我该怎么做?

  

在进行聚合之前,只需检查数据框是否有某些行

val result = if(df.take(1).isEmpty) 0 else df
  .filter(col("channel_pk") === "abc")
  .groupBy("member_PK")
  .agg(sum(col("price") * col("quantityOrdered")) as "totalSum")
  .select("totalSum")
  .rdd.map(_(0).asInstanceOf[Double]).reduce(_ + _)

或者您也可以使用count

val result = if(df.count() == 0) 0 else df
  .filter(col("channel_pk") === "abc")
  .groupBy("member_PK")
  .agg(sum(col("price") * col("quantityOrdered")) as "totalSum")
  .select("totalSum")
  .rdd.map(_(0).asInstanceOf[Double]).reduce(_ + _)