Есть ли какие-то проблемы с производительностью, которые вынуждают усердно оценивать счетчик в искре?

Обычно я вижу Dataset.count во всех кодовых базах в 3 сценариях:

  1. протоколирование log.info("this ds has ${dataset.count} rows")
  2. разветвление if (dataset.count > 0) do x else do y
  3. форсировать кеш dataset.persist.count

Помешает ли это оптимизатору запросов создать наиболее эффективный даг, заставив его стремиться преждевременно в любом из этих сценариев?

1 ответ

Решение

TL; DR 1) и 2) обычно можно избежать, но это не должно причинить вам вреда (игнорируя стоимость оценки), 3) обычно является вредной практикой программирования культа Cargo.

Безcache

призвание count одиночество в основном расточительно. Хотя регистрация не всегда проста, ее можно заменить информацией, полученной от слушателей ( здесь и приведен пример для RDD), а требования к потоку управления обычно (не всегда) опосредуются лучшей схемой конвейера.

В одиночку это не окажет никакого влияния на план выполнения (план выполнения для count обычно в любом случае отличается от плана выполнения родительского элемента. В общем, Spark выполняет как можно меньше работы, поэтому он удаляет части плана выполнения, что не требуются для вычисления количества).

Сcache:

count с cache Это плохая практика, наивно копируемая из шаблонов, используемых с RDD API. Это уже спорно с RDDs, но с DataFrame может сломать множество внутренних оптимизаций (выбор и предикатное нажатие) и, технически говоря, даже не гарантированно сработает.

Другие вопросы по тегам