Метод 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])
Другие вопросы по тегам