Да, это из-за ленивых вычислений.
Spark ничего не вычисляет, пока вы не выполните действие , такое как collect
, и аккумуляторы не будут обновлены только как сторона-эффект этого вычисления.
Преобразования , такие как map
, определяют, какую работу необходимо выполнить, но она выполняется только после запуска действия, которое "вытягивает" данные через преобразования.
Это описано в документации :
Аккумуляторы не изменяют ленивую оценочную модель Spark.Если они обновляются в операции над RDD, их значение обновляется только после того, как RDD вычисляется как часть действия.Следовательно, не гарантируется, что обновления аккумулятора будут выполняться при выполнении ленивого преобразования, например map ().
Также важно отметить, что:
В преобразованиях пользователиследует помнить, что каждое обновление задачи может применяться более одного раза, если задачи или этапы работы повторяются.
, поэтому ваши аккумуляторы не обязательно будут давать правильные ответы;они могут завышать итоги.