Size: a a a

2021 October 26

GP

Grigory Pomadchin in Data Engineers
экспрешоны
источник

ИК

Иван Калининский... in Data Engineers
rdd и df связаны, так что не просто кусок плана
источник

ИК

Иван Калининский... in Data Engineers
шафл структуры, например, вполне материальны, так что от памяти полностью абстрагироваться не выйдет
источник

A

Alex in Data Engineers
кстати раз зашла речь про персист

df2 = df.persis()

df2.isEmpty() - считает один раз и не вызывает реально кеширование датафрейма

df2.count() - вот тут уже посчитает весь датафрейм и заперсистит его

я понимаю что isEmpty имеет упрощённый план до первой непустой партиции
но на persist датафрейме я бы ожидал что оно тригернёт вычисление и кеширование указанного дф чтобы потом след операцией я уже работал с кешированным

а так получается первый раз isEmpty молотит
потом второй раз молотит когда я дествительно с фреймом работаю

может кто-то объяснить логику или я хочу слишком много?
источник

ИК

Иван Калининский... in Data Engineers
с ходу ставлю на полноценный персист при вызове .isEmpty
источник

ИК

Иван Калининский... in Data Engineers
но надо глянуть))
источник

A

Alex in Data Engineers
вот посмотри, там как раз и нету его
источник

A

Alex in Data Engineers
я первый раз когда столкнулся полез смотреть планы
источник

A

Alex in Data Engineers
в самом спарке там где нужно заперсистить гарантированно а не lazy везде стоит .count()
источник

ИК

Иван Калининский... in Data Engineers
у меня только Option.isEmpty)) щас раскопаю
источник

A

Alex in Data Engineers
/**
  * @note Due to complications in the internal implementation, this method will raise an
  * exception if called on an RDD of Nothing or Null. This may be come up in practice
  * because, for example, the type of parallelize(Seq()) is RDD[Nothing].
  * (`parallelize(Seq())` should be avoided anyway in favor of parallelize(Seq[T]()).)
  * @return true if and only if the RDD contains no elements at all. Note that an RDD
  *         may be empty even when it has at least 1 partition.
  */
 def isEmpty(): Boolean = withScope {
   partitions.length == 0 || take(1).length == 0
 }


https://github.com/apache/spark/blob/master/core/src/main/scala/org/apache/spark/rdd/RDD.scala#L1432-L1443
источник

A

Alex in Data Engineers
@KaiNie_R то есть если повезёт то все партиции посчитаются, если не повезет то только некоторые (до первой ненулевой, ну и после неё ещё немного, в зависимости от батча)
источник

ИК

Иван Калининский... in Data Engineers
это RDD так проверяется, в датасете чуть запутаннее
источник

A

Alex in Data Engineers
примерно то на то
датасет проваливается в эту функцию
источник

ИК

Иван Калининский... in Data Engineers
у меня была одна проверка df.rdd.isEmpty, и я её выполнял на rdd после join и groupBy, по итогу убрал вообще, надоело ждать
источник

A

Alex in Data Engineers
там такая же логика на numPartsToTry и потом по этим партициям скан идёт батчем
не нашли давайте следующие партиции сравнивать
источник

A

Alex in Data Engineers
можешь по ссылкам код сравнить =)
источник

A

Alex in Data Engineers
источник

A

Alex in Data Engineers
я просто тоже много где встречал что люди тригерят кеш через isEmpty
источник

ИК

Иван Калининский... in Data Engineers
надо рассказать, что код дублировать не бест практис))
источник