Pular para conteúdo

Cache e Persist

cache() e persist() são métodos do Apache Spark que permitem armazenar um DataFrame ou RDD na memória, melhorando a performance de consultas e operações subsequentes realizadas nesse DataFrame ou RDD. Vamos entender cada um:

cache():
  • Quando você invoca o método cache() em um DataFrame ou RDD, ele utiliza o nível de armazenamento padrão, que é MEMORY_ONLY.
  • Isso significa que o DataFrame ou RDD será armazenado na memória do executor e, se o espaço da memória for insuficiente para armazenar todos os dados, as partições que não se encaixam na memória não serão armazenadas em cache e terão que ser recalculadas quando necessário.
  • Em termos simples, cache() é um atalho para usar persist() com o nível de armazenamento padrão.
persist():
  • O método persist() permite que você especifique um nível de armazenamento para o DataFrame ou RDD.
  • Os níveis de armazenamento incluem:
  • MEMORY_ONLY: Armazena o RDD ou DataFrame na memória do executor. Se não houver memória suficiente, algumas partições não serão armazenadas em cache.
  • MEMORY_ONLY_SER: Armazena o RDD ou DataFrame na memória do executor como objetos serializados.
  • MEMORY_AND_DISK: Armazena o RDD ou DataFrame na memória e escreve as partições que não se encaixam na memória em disco.
  • MEMORY_AND_DISK_SER: Semelhante ao MEMORY_AND_DISK, mas armazena os objetos como objetos serializados.
  • E outros.
Isso dá uma flexibilidade maior em termos de onde e como os dados são armazenados em cache, dependendo dos recursos disponíveis e das necessidades da aplicação.

Uso Prático: Se você quer apenas armazenar um DataFrame ou RDD na memória, usar cache() é suficiente. No entanto, se quiser um controle mais detalhado sobre onde e como os dados são armazenados, ou se quiser armazenar em disco, usar persist() é a melhor opção.
Nota: É importante lembrar que tanto cache() quanto persist() são operações lazy no Spark, o que significa que o DataFrame ou RDD não será realmente armazenado em cache até que uma ação seja executada nele (como count(), collect(), etc.).

Referências

Spark by Examples - Diferença entre cache() e persist()
Documentação do Spark - cache()
LinkedIn - Spark cache() vs persist()
Databricks - Melhores práticas para cache e take