Apache Spark isEmpty false但收集为空

时间:2016-02-09 14:43:57

标签: java apache-spark

当我在JavaRDD集合上调用isEmpty时,我遇到了Apache Spark的问题,即使集合为空,它也会返回false。

此处的示例代码(在我的最后一年项目中进行了修改,我不允许发布任何代码):

sampleRdd = inputRdd.filter(someFilterFunction)
if(sampleRdd.isEmpty()) {
       return inputRdd.first();
} else {
        return sampleRdd.first(); // JVM points error on this line
}

问题有时候条件是假的,所以sampleRdd.isEmpty()返回false意味着它不是空的,因此执行会继续返回语句,它会尝试检索该集合的first()元素但是抛出异常:

Exception in thread "main" java.lang.UnsupportedOperationException: empty collection
at org.apache.spark.rdd.RDD$$anonfun$first$1.apply(RDD.scala:1314)
at org.apache.spark.rdd.RDDOperationScope$.withScope(RDDOperationScope.scala:147)
at org.apache.spark.rdd.RDDOperationScope$.withScope(RDDOperationScope.scala:108)
at org.apache.spark.rdd.RDD.withScope(RDD.scala:306)
at org.apache.spark.rdd.RDD.first(RDD.scala:1311)
at org.apache.spark.api.java.JavaRDDLike$class.first(JavaRDDLike.scala:510)
at org.apache.spark.api.java.AbstractJavaRDDLike.first(JavaRDDLike.scala:47)
.
.
.

我有点失踪吗?我目前在本地计算机上运行它,因为它还没有完全开发。

谢谢

编辑:当我收到此错误时,将更多信息JVM点添加到行sampleRdd.first(),以便初始inputRdd不为空

EDIT2:我写了一些额外的行,在过滤之前打印inputRDD,在过滤之后打印sampleRDD

System.out.println(inputRdd.count());  // Returns nonzero possitive int eg.100
sampleRdd = inputRdd.filter(someFilterFunction)
System.out.println(sampleRdd.count()); // Returns int eg. 1 
System.out.println(sampleRdd.count()); // Sometimes returns different int than first call eg.3
if(sampleRdd.isEmpty()) {
       return inputRdd.first();
} else {
        return sampleRdd.first(); // JVM points error on this line
}

我观察到非常有趣的行为,有时inputRdd.count()会返回100,但首先sampleRdd.count()会返回1而第二sampleRdd.count()会返回3与第一次通话的号码基本不同。所以基本看起来两个调用之间sampleRdd的大小变化,因此我假设有时它可能会在传递条件后尝试调用first()返回错误。

知道可能导致什么原因吗?

1 个答案:

答案 0 :(得分:1)

如果inputRdd最初为空,该怎么办?

在这种情况下,sampleRdd也是空的。因此,samplerdd.isEmpty评估为true,而inputRdd.first()会引发异常。