当我在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()
返回错误。
知道可能导致什么原因吗?
答案 0 :(得分:1)
如果inputRdd
最初为空,该怎么办?
在这种情况下,sampleRdd
也是空的。因此,samplerdd.isEmpty
评估为true
,而inputRdd.first()
会引发异常。