Creo que la pregunta se formularía mejor como:
¿Cuándo necesitamos llamar al caché o persistir en un RDD?
Los procesos de chispa son flojos, es decir, no pasará nada hasta que se requiera. Para responder rápidamente a la pregunta, después de val textFile = sc.textFile("/user/emp.txt")emitir, no sucede nada con los datos, solo HadoopRDDse construye un, utilizando el archivo como fuente.
Digamos que transformamos esos datos un poco:
val wordsRDD = textFile.flatMap(line => line.split("\\W"))
Nuevamente, nada le sucede a los datos. Ahora hay un nuevo RDD wordsRDDque contiene una referencia testFiley una función que se aplicará cuando sea necesario.
Solo cuando se ejecuta una acción sobre un RDD, como wordsRDD.count, se ejecutará la cadena RDD, llamada linaje . Es decir, los datos, desglosados en particiones, serán cargados por los ejecutores del clúster Spark, flatMapse aplicará la función y se calculará el resultado.
En un linaje lineal, como el de este ejemplo, cache()no es necesario. Los datos se cargarán a los ejecutores, se aplicarán todas las transformaciones y finalmente countse computarán, todo en la memoria, si los datos se ajustan en la memoria.
cachees útil cuando el linaje del RDD se ramifica. Digamos que desea filtrar las palabras del ejemplo anterior en un recuento de palabras positivas y negativas. Podrías hacer esto así:
val positiveWordsCount = wordsRDD.filter(word => isPositive(word)).count()
val negativeWordsCount = wordsRDD.filter(word => isNegative(word)).count()
Aquí, cada rama emite una recarga de los datos. Agregar una cachedeclaración explícita asegurará que el procesamiento realizado previamente se conserve y reutilice. El trabajo se verá así:
val textFile = sc.textFile("/user/emp.txt")
val wordsRDD = textFile.flatMap(line => line.split("\\W"))
wordsRDD.cache()
val positiveWordsCount = wordsRDD.filter(word => isPositive(word)).count()
val negativeWordsCount = wordsRDD.filter(word => isNegative(word)).count()
Por esa razón, cachese dice que 'rompe el linaje' ya que crea un punto de control que puede reutilizarse para su posterior procesamiento.
Regla de oro: se usa cachecuando el linaje de su RDD se ramifica o cuando un RDD se usa varias veces como en un bucle.