Что произойдет, если я изменю переменную, указывающую на кэшированный rdd? - PullRequest
0 голосов
/ 30 октября 2019

У меня есть кэшированный RDD, который я использую пару раз внутри цикла. В какой-то момент я изменяю переменную, указывающую на указанную СДР, и затем вызываю эту переменную.

var rdd1 = someRDD.chache

do{
  val rdd2 = rdd1.someLogic
  val rdd3 = rdd1.someOtherLogic
  rdd1 = rdd1.someJoin(rdd4)
  val rdd5 = rdd1.someAggregateFunction
  rdd5.first //to start the transformations
  rdd1.unpersist
} while(someCondition)

У меня вопрос, в этой точке val rdd5 = rdd1.someAggregateFunction что будет удерживать rdd1? someRDD или rdd1.someJoin(rdd4)? Нужно ли расставаться с ним в какой-то момент раньше? Или мне нужно снова кешировать его, если я буду использовать его снова после rdd5?

РЕДАКТИРОВАТЬ Как-то так

var rdd1 = sc.parallelize(Seq(1, 2, 3, 4)).cache()
rdd1.collect().foreach(println)
rdd1 = sc.parallelize(Seq(4,5,6))
rdd1.collect().foreach(println)

печатает

1
2
3
4
4
5
6

Такзначения меняются. Это все еще оставляет вопрос кеширования. Нужно ли кэшировать rdd1 каждый раз, когда я его меняю? Если да, то нужно ли мне отказаться от этого?

1 Ответ

0 голосов
/ 30 октября 2019

Кэш должен быть похож на чтение только для чтения, не изменяйте кэшированную RDD. Скорее создайте новый rdd.

Насколько я понимаю, прежде всего вы не должны делать unpersist в цикле do while. Это должно быть сделано после кода do do. Также не изменяйте уже кэшированный RDD. Я считаю, что это то, что вы хотите.

var rdd1 = someRDD.chache
var changingRDD = null;
do{
  val rdd2 = rdd1.someLogic
  val rdd3 = rdd1.someOtherLogic
  changingRDD = rdd1.someJoin(rdd4)
  val rdd5 = changingRDD.someAggregateFunction
  rdd5.first //to start the transformations
} while(someCondition)
rdd1.unpersist
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...