Proposta de site feita pela Genesis Innovation · conteúdo do LinkedIn de Daniel Santos

Pular para o conteúdo
Daniel Santos

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.

PySparkPrecisa de um cluster Spark: não roda aqui.
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()        # libera

cache 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.