当 RDD 不为空时,Spark RDD isEmpty 方法抛出 NullPointerException

Spark RDD isEmpty method throws NullPointerException, when RDD is not null

这让我感到惊讶(不幸的是,在向某人解释时)。

我很好奇以下代码段中 spark 内部发生的情况。

val rdd = sc.parallelize(null)
rdd == null //false
rdd.isEmpty //NullPointerException

在你问之前,我同意并行化 null 是有争议的,但这只是我们 运行 在我们的流应用程序中加入的条件。

我在某处读到 'isEmpty' 进入并在内部调用 rdd.take(1),这最终会引发异常,但这似乎与语言行为不一致。此外,我发现在某些情况下,使用 NPE return 需要更长的时间(有时几秒钟),尽管这可能是因为它通过网络寻找数据。

那么问题来了,为什么会这样呢?这是预期的行为吗?有没有比缓存 NPE 更好的方法来处理这个问题?

非常感谢!

parallelize 方法需要 Seq[T]。虽然 null 是一个有效的替换 NullPointerException 是预期的,只要它作为 Seq 访问并且它不等同于空 Seq.

或者使用 SparkContext.emptyRDD:

sc.emptyRDD[T]

或清空序列

sc.parallelize(Seq.emtpy[T])