当 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])
这让我感到惊讶(不幸的是,在向某人解释时)。
我很好奇以下代码段中 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])