искра - процесс RDD дважды после сохранения - PullRequest
0 голосов
/ 22 ноября 2018

Я сделал RDD и создал другой RDD из источника, как показано ниже.

val RDD2 = RDD1.map({
  println("RDD1")
  ....
}).persist(StorageLevel.MEMORY_AND_DISK)

RDD2.foreach({
  println("RDD2")
  ...
})
...so on..

Я ожидал, что процесс RDD1 выполняется ТОЛЬКО один раз, поскольку RDD1 сохраняется в памяти или на диске с помощью метода persist.

НО каким-то образом «RDD1» печатается после «RDD2», напечатанного, как показано ниже.

RDD1
RDD1
RDD1
RDD1
RDD2
RDD2
RDD2
RDD2
RDD2
RDD1 -- repeat RDD1 process. WHY? 
RDD1
RDD1
RDD1
RDD2
RDD2
RDD2
RDD2
RDD2

1 Ответ

0 голосов
/ 22 ноября 2018

Это ожидаемое поведение искры.Как большинство операций сохраняются в искре, также ленивая операция.Таким образом, даже если вы добавите персистентность для 1-го СДР, спарк не кеширует данные, пока вы не добавите какое-либо действие после операции персистентности.Операция map не является искрой в искре, и она также ленива.

Способ принудительного кэширования состоит в добавлении действия count после сохранения RDD2

val RDD2 = RDD1.map({
   println("RDD1")
   ....
}).persist(StorageLevel.MEMORY_AND_DISK)

RDD2.count // Forces the caching 

Теперь, если вы выполните любую другую операцию, RDD2 не будет пересчитан

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...