Wiki PySpark
Cache e persist
cache() guarda um resultado intermediário para não recalcular. Ajuda quando ele é reaproveitado; atrapalha quando ocupa memória à toa.
Como cada ação recalcula o plano desde a leitura (veja Avaliação preguiçosa), um DataFrame caro usado em várias ações é recalculado várias vezes. cache() marca o DataFrame para ser guardado na primeira vez que uma ação o calcular.
base = (spark.table("silver.pedidos")
.join(spark.table("silver.clientes"), "cliente_id")
.where("status = 'entregue'"))
base.cache() # só marca: nada acontece ainda
base.count() # calcula e guarda
base.groupBy("cidade").count().show() # lê do cache
base.groupBy("segmento").sum("valor").show() # lê do cache
base.unpersist() # liberacache ou persist
No DataFrame, cache() é persist() com o nível padrão, MEMORY_AND_DISK_DESER (o que não cabe na memória vai para o disco local). persist(StorageLevel.DISK_ONLY) e outros níveis trocam memória por velocidade.
Quando não usar
- O DataFrame é usado uma vez só: o cache é custo puro (ocupa memória e tira espaço da execução).
- A leitura já é barata e seletiva (Delta com filtro que pula arquivos): ler de novo pode custar menos que guardar.
- Em job agendado, prefira gravar o intermediário como tabela: sobrevive a falha, tem histórico e pode ser lido por outro job.
- No Databricks existe também o *disk cache* (antes chamado Delta cache), automático em alguns tipos de nó: guarda cópia local dos arquivos Parquet lidos. É outra coisa: não é o
cache()do DataFrame. - Esqueceu do
unpersist()? O Spark despeja o mais antigo quando falta memória, mas até lá ele compete com o trabalho de verdade.
Fontes
Conhecimento compartilhado pela Genesis Innovation.