Действия RDD, такие как first (), head (), isEmpty () .., они оценивают весь RDD? или только его части? - PullRequest
0 голосов
/ 11 ноября 2019

У меня есть СДР, groupResultMap, и напишите код ниже.

if (groupResultMap.isEmpty) Map[String, Any]()
else  groupResultMap.mapPartitions ( //do somthing// ).collectAsMap

В коде СДР будет оцениваться дважды, если он не пустой. Как вы думаете, производительность будет лучше, если я поставлю groupResultMap.cache(), чтобы избежать лишних оценок, когда СДР не пуст?

Означает ли оценка СДР по isEmpty() то же, что и оценка collectAsMap()? Или isEmpty() оцените только ту часть, которая требуется для действия? Знаете, оценки только одной строки СДР будет достаточно, чтобы вычислить результат isEmpty()

спасибо.

1 Ответ

1 голос
/ 11 ноября 2019

Если вы посмотрите на реализацию isEmpty, она действительно берет одну строку RDD и проверяет, присутствует ли она.

def isEmpty(): Boolean = partitions.length == 0 || take(1).length == 0

См. Здесь: https://github.com/apache/spark/pull/4074/files#diff-1d55e54678eff2076263f2fe36150c17

Таким образом, нет - оценка isEmpty - это не то же самое, что делать collectAsMap. isEmpty гораздо более эффективен, чем выполнение collectAsMap и проверка длины карты, так как он только частично оценивает RDD, как требуется.

...