Есть ли какие-то проблемы с производительностью, которые вынуждают усердно оценивать счетчик в искре?
Обычно я вижу Dataset.count
во всех кодовых базах в 3 сценариях:
- протоколирование
log.info("this ds has ${dataset.count} rows")
- разветвление
if (dataset.count > 0) do x else do y
- форсировать кеш
dataset.persist.count
Помешает ли это оптимизатору запросов создать наиболее эффективный даг, заставив его стремиться преждевременно в любом из этих сценариев?
1 ответ
TL; DR 1) и 2) обычно можно избежать, но это не должно причинить вам вреда (игнорируя стоимость оценки), 3) обычно является вредной практикой программирования культа Cargo.
Безcache
призвание count
одиночество в основном расточительно. Хотя регистрация не всегда проста, ее можно заменить информацией, полученной от слушателей ( здесь и приведен пример для RDD), а требования к потоку управления обычно (не всегда) опосредуются лучшей схемой конвейера.
В одиночку это не окажет никакого влияния на план выполнения (план выполнения для count обычно в любом случае отличается от плана выполнения родительского элемента. В общем, Spark выполняет как можно меньше работы, поэтому он удаляет части плана выполнения, что не требуются для вычисления количества).
Сcache
:
count
с cache
Это плохая практика, наивно копируемая из шаблонов, используемых с RDD API. Это уже спорно с RDDs
, но с DataFrame
может сломать множество внутренних оптимизаций (выбор и предикатное нажатие) и, технически говоря, даже не гарантированно сработает.