Метод Spark RDD isEmpty создает исключение NullPointerException, если значение RDD не равно нулю
Это застало меня врасплох (объясняя кому-то, к сожалению).
Мне интересно, что происходит внутри искры в следующем фрагменте.
val rdd = sc.parallelize(null)
rdd == null //false
rdd.isEmpty //NullPointerException
Прежде чем спросить, я согласен распараллеливание нуль спорно, но это просто условие мы сталкиваемся в нашем потоковом приложении.
Я где-то читал, что isEmpty входит и внутренне звонит rdd.take(1)
, что в конечном итоге выдает исключение, но это кажется несовместимым с языковым поведением. Кроме того, я обнаружил, что в некоторых случаях требуется больше времени (иногда несколько секунд), чтобы вернуться с NPE, хотя это может быть связано с тем, что он переходит по сети в поисках данных.
Итак, вопрос в том, почему это происходит? Это ожидаемое поведение? Есть ли лучший способ справиться с этим, чем кэширование NPE?
Спасибо заранее!
1 ответ
parallelize
метод ожидает Seq[T]
, В то время как null
является действительной заменой NullPointerException
следует ожидать всякий раз, когда к нему обращаются как Seq
и это не эквивалентно пустому Seq
,
Либо использовать SparkContext.emptyRDD
:
sc.emptyRDD[T]
или emtpy seq
sc.parallelize(Seq.emtpy[T])