Kommentar
Åtkomst till den här sidan kräver auktorisering. Du kan prova att logga in eller ändra kataloger.
Åtkomst till den här sidan kräver auktorisering. Du kan prova att ändra kataloger.
Important
Den här funktionen finns som allmänt tillgänglig förhandsversion. Workspace-administratörer kan kontrollera åtkomsten till DataFrame-cachning på serverless compute från sidan Förhandsgranskning. Se Hantera förhandsversioner av Azure Databricks.
På serverless compute kan du cacha en DataFrame med df.cache() eller df.persist() för att återanvända ett dyrt resultat i din session. Azure Databricks beräknar DataFrame när du anropar cache() och materialiserar resultatet som en ögonblicksbild. DataFrame och de DataFrames du bygger från den läser sedan snapshoten under resten av sessionen i stället för att beräkna om den.
Kravspecifikation
- Förhandsversionen av DataFrame-cachelagring i serverlös beräkning är aktiverad för din arbetsyta (aktiverad som standard). Workspace-administratörer kan inaktivera det från Förhandsgranskningssidan . Förhandsvisningen finns inte tillgänglig i arbetsytor med compliance-säkerhetsprofilen aktiverad. Se Hantera förhandsversioner på arbetsytenivå.
- Anteckningsböcker och jobb på serverless compute måste använda miljöversion 5 eller högre.
- Databricks Connect för Python måste vara 18.1.8 eller högre, och Databricks Connect för Scala måste vara 18.1.5 eller högre.
Äldre klientversioner får CACHE_REQUIRES_NEWER_CLIENT_ON_SERVERLESS_GC-felet.
När ska man använda DataFrame-cache på serverless compute
Cache en DataFrame på serverless compute när du behöver:
- Återanvänd resultatet av en dyr join, aggregering eller filter flera gånger under samma session.
- Beräkna en strömmande mikrobatch en gång i en
foreachBatchfunktion, och skriv den sedan till flera sinkar. - Träna eller finjustera flera maskininlärningsmodeller på samma förberedda funktionsdata.
- Behåll en stabil snapshot medan du kör flera steg i en analys, även om källtabellerna ändras.
Se Metodtips.
Cache DataFrame-API:er på serverlös beräkning
Följande exempel cachar ordrar för en dag kopplade till kunddata, beräknar dagens totala intäkter, lägger till intäkterna per region i en rapporttabell och släpper sedan cachen. Båda resultaten läser den cachade snapshoten istället för att köra joinen igen.
Python
from pyspark.sql import functions as F
# The DataFrame to cache: one day of orders joined with customer data.
oct_15_orders = (
spark.table("main.sales.orders")
.filter(F.col("order_date") == "2026-10-15")
.join(spark.table("main.sales.customers"), "customer_id")
)
oct_15_orders.cache()
# Both results are built from oct_15_orders, so they read the cached snapshot.
total_revenue = oct_15_orders.agg(F.sum("amount")).first()[0]
print(f"Total revenue on 2026-10-15: {total_revenue}")
revenue_by_region = oct_15_orders.groupBy("order_date", "region").agg(F.sum("amount").alias("revenue"))
revenue_by_region.write.mode("append").saveAsTable("main.reports.revenue_by_region")
# Release the cache and the DataFrame when you no longer need it.
# oct_15_orders and DataFrames built from it can no longer be used.
oct_15_orders.unpersist()
Scala
import org.apache.spark.sql.functions._
// The DataFrame to cache: one day of orders joined with customer data.
val oct15Orders = spark.table("main.sales.orders")
.filter(col("order_date") === "2026-10-15")
.join(spark.table("main.sales.customers"), "customer_id")
oct15Orders.cache()
// Both results are built from oct15Orders, so they read the cached snapshot.
val totalRevenue = oct15Orders.agg(sum("amount")).first().get(0)
println(s"Total revenue on 2026-10-15: $totalRevenue")
val revenueByRegion = oct15Orders.groupBy("order_date", "region").agg(sum("amount").alias("revenue"))
revenueByRegion.write.mode("append").saveAsTable("main.reports.revenue_by_region")
// Release the cache and the DataFrame when you no longer need it.
// oct15Orders and DataFrames built from it can no longer be used.
oct15Orders.unpersist()
I följande API-beskrivningar står df för vilken DataFrame som helst i din session, som oct_15_orders i föregående exempel.
df.cache()
Beräknar df direkt och cachar resultatet som en snapshot för resten av din session.
-
Returvärde: Samma cachade DataFrame,
df, nu baserad på snapshoten istället för beräkningen utifrån källtabellerna. Se följande beteende. -
Beteende:
- Kör DataFrames fråga direkt och materialiserar resultatet som en ögonblicksbild innan anropet returnerar.
- Efter anropet är
dfoch den returnerade DataFramen (dfsjälvt) baserade på snapshoten. De är inte längre kopplade till beräkningen på källtabellerna, så de läser snapshoten istället för att beräkna om queryn. - DataFrames härledda från
df, direkt eller via andra härledda DataFrames, läser snapshoten automatiskt istället för att köra den ursprungliga frågan igen. Se Läs ögonblicksbilden. - Snapshoten gäller bara för din session. Endast sessionen som cachade
dfkan läsa den. Se Isolering och privilegier. - Ögonblicksbilden varar tills sessionen är slut, i högst sju dagar. Azure Databricks frigör då automatiskt sitt lagringsutrymme i bakgrunden. Att anropa
df.unpersist()gör att den kan återta lagringen tidigare. Se Livscykel och tidsgränser samt Lagring och rensning. - Om beräkningen
dfmisslyckas, utlöses felet avdf.cache()ochdfcachelagras inte. - Att anropa
df.cache()på en DataFrame som redan är cachad gör ingenting.dfberäknas inte igen.
Snapshoten åtgärdas efter att du har kallat df.cache(). Data som skrivs efteråt till tabellerna som df läser från, och schemaändringar i dessa tabeller såsom tillagda eller omdöpta kolumner, påverkar den inte. För att beräkna om från den senaste datan, bygg DataFrame igen från källtabellerna och cacha den nya DataFrame om du behöver.
Läs snapshoten
I serverlösa beräkningar baseras cache-matchning på DataFrame-härledning. Efter df.cache(), läser endast följande DataFrames snapshoten automatiskt istället för att beräkna om frågan i källtabellerna:
- DataFrame som du cachelagrade,
df. - DataFrames härledda från
df, till exempel medselect(),filter(), ,groupBy(), ellerjoin(). - DataFrames som kedjats vidare från dessa härledda DataFrames.
En ny DataFrame som upprepar samma frågekörning läser källtabellerna, även om dess logik är identisk, eftersom den inte härstammar från df.
Detta gör cache-matchning explicit och under din kontroll: en DataFrame läser cachad data endast när du härleder den från en cachad DataFrame. Varje annan DataFrame läser källtabellerna.
Python
oct_15_orders = (
spark.table("main.sales.orders")
.filter(F.col("order_date") == "2026-10-15")
.join(spark.table("main.sales.customers"), "customer_id")
)
# The join runs one time, when you call cache().
oct_15_orders.cache()
# Derived from oct_15_orders: read the snapshot, so the join doesn't run again.
large_orders = oct_15_orders.filter(F.col("amount") > 1000)
revenue_by_region = oct_15_orders.groupBy("order_date", "region").agg(F.sum("amount").alias("revenue"))
# Derived from large_orders, which is derived from oct_15_orders: also reads the snapshot.
large_orders_by_region = large_orders.groupBy("region").count()
# Not derived from oct_15_orders: reads the source tables and runs the join again.
same_query = (
spark.table("main.sales.orders")
.filter(F.col("order_date") == "2026-10-15")
.join(spark.table("main.sales.customers"), "customer_id")
)
Scala
val oct15Orders = spark.table("main.sales.orders")
.filter(col("order_date") === "2026-10-15")
.join(spark.table("main.sales.customers"), "customer_id")
// The join runs one time, when you call cache().
oct15Orders.cache()
// Derived from oct15Orders: read the snapshot, so the join doesn't run again.
val largeOrders = oct15Orders.filter(col("amount") > 1000)
val revenueByRegion = oct15Orders.groupBy("order_date", "region").agg(sum("amount").alias("revenue"))
// Derived from largeOrders, which is derived from oct15Orders: also reads the snapshot.
val largeOrdersByRegion = largeOrders.groupBy("region").count()
// Not derived from oct15Orders: reads the source tables and runs the join again.
val sameQuery = spark.table("main.sales.orders")
.filter(col("order_date") === "2026-10-15")
.join(spark.table("main.sales.customers"), "customer_id")
Eftersom df läser snapshoten i stället för de DataFrames som den byggdes från kan du inte referera till kolumnerna i df via dessa DataFrames. Se Begränsningar.
df.persist(storageLevel)
Ett alias för df.cache() som accepterar en lagringsnivå.
-
Parametrar:
-
storageLevel(valfritt): EnStorageLevel, såsomStorageLevel.DISK_ONLY. Serverless Compute accepterar alla lagringsnivåer och ignorerar den. Snapshoten lagras på samma sätt för varje lagringsnivå ochdf.storageLevelreturnerarStorageLevel.DISK_ONLY.
-
Returvärdet och beteendet är desamma som df.cache().
df.unpersist(blocking)
Släpper den cachade snapshoten av df och förstör DataFrame.
-
Parametrar:
-
blocking(valfritt): Ignorerad.df.unpersist()returnerar omedelbart för båda värdena.
-
-
Returvärde: Samma DataFrame,
df, nu förstörd. -
Beteende:
- Markerar ögonblicksbilden som redo att återvinnas. Azure Databricks raderar sedan den cachade datan och frigör lagringsutrymmet igen i bakgrunden.
- Förstör
df:dfoch alla DataFrames som tidigare härletts från den är inte längre användbara, och varje efterföljande förfrågan på dem väckerCACHE_DATAFRAME_ACCESS_AFTER_UNCACHE. Om du cacher en DataFrame som härstammar fråndfinnan du kallardf.unpersist(), förblir den DataFrame användbar eftersom den har sin egen snapshot. - För att fortsätta arbeta med samma datakälla, bygg en ny DataFrame från den ursprungliga datakällan istället för att återanvända den ocachade DataFrame.
- Att anropa
df.unpersist()på en DataFrame som aldrig har cachats, eller som redan har avcachats, är en no-op.
Anropa df.unpersist() när du inte längre behöver de cachelagrade data, till exempel när inget senare steg i din notebook eller ditt jobb läser dem. Detta gör att Azure Databricks kan frigöra lagringsutrymmet tidigare. Använd inte df.unpersist() för att uppdatera data. För att arbeta med den senaste datan, bygg en ny DataFrame från källtabellerna.
Python
oct_15_orders = spark.table("main.sales.orders").filter(F.col("order_date") == "2026-10-15")
oct_15_orders.cache()
large_orders = oct_15_orders.filter(F.col("amount") > 1000)
orders_per_customer = oct_15_orders.groupBy("customer_id").count()
orders_per_customer.cache() # Has its own snapshot.
# Acknowledge that the cached data is no longer needed.
# This releases the storage and destroys oct_15_orders.
oct_15_orders.unpersist()
oct_15_orders.count() # Raises CACHE_DATAFRAME_ACCESS_AFTER_UNCACHE.
large_orders.count() # Raises CACHE_DATAFRAME_ACCESS_AFTER_UNCACHE.
orders_per_customer.count() # Reads its own snapshot.
# If you need the data again later, build a new DataFrame from the source tables.
oct_15_orders = spark.table("main.sales.orders").filter(F.col("order_date") == "2026-10-15")
Scala
var oct15Orders = spark.table("main.sales.orders").filter(col("order_date") === "2026-10-15")
oct15Orders.cache()
val largeOrders = oct15Orders.filter(col("amount") > 1000)
val ordersPerCustomer = oct15Orders.groupBy("customer_id").count()
ordersPerCustomer.cache() // Has its own snapshot.
// Acknowledge that the cached data is no longer needed.
// This releases the storage and destroys oct15Orders.
oct15Orders.unpersist()
oct15Orders.count() // Throws CACHE_DATAFRAME_ACCESS_AFTER_UNCACHE.
largeOrders.count() // Throws CACHE_DATAFRAME_ACCESS_AFTER_UNCACHE.
ordersPerCustomer.count() // Reads its own snapshot.
// If you need the data again later, build a new DataFrame from the source tables.
oct15Orders = spark.table("main.sales.orders").filter(col("order_date") === "2026-10-15")
df.storageLevel
Hämtar lagringsnivån för df.
-
Returvärde:
StorageLevel.DISK_ONLYmedandfär cachad.StorageLevel.NONEinnan du cachar den och efter att du anropardf.unpersist().
Python
from pyspark import StorageLevel
oct_15_orders.cache()
oct_15_orders.storageLevel == StorageLevel.DISK_ONLY # True
Scala
import org.apache.spark.storage.StorageLevel
oct15Orders.cache()
oct15Orders.storageLevel == StorageLevel.DISK_ONLY // true
För metodsignaturerna, se PySpark-referensen för cache, persist, unpersist och storageLevel.
Livscykel och tidsgränser
Cachad data finns endast inom Azure Databricks-sessionen där du cachar den. Den blir otillgänglig när sessionen är slut och varar högst sju dagar. Efter sjudagarsgränsen genererar användning av en cachad DataFrame ett fel i stället för att läsa källtabellerna igen. För att cacha igen, starta en ny session.
Lagring och rensning
Azure Databricks hanterar automatiskt lagringen för cachad data. Cachade data lagras i molnlagring, där den specifika lagringsplatsen beror på din typ av arbetsyta:
- Serverlösa arbetsytor: Cachad data lagras i standardlagring. Om du har konfigurerat en kundhanterad nyckel för hanterade tjänster, använder cachad data den nyckeln. Se Kundhanterade nycklar för kryptering.
- Klassiska arbetsytor: Cachad data lagras i arbetsytans lagringskonto som konfigureras vid arbetsytans skapande. Du kan konfigurera kryptering på lagringskontonivå.
När cachad data blir otillgänglig frigör Azure Databricks automatiskt lagringsutrymmet i bakgrunden. Detta inkluderar fall där sessionen avslutas på grund av en frånkoppling eller en krasch. Att anropa df.unpersist() gör det möjligt för Azure Databricks att återta lagringen tidigare.
Isolering och behörigheter
Alla användare som kan köra kod på serverless compute kan cacha en DataFrame. Du behöver inga extra privilegier.
Cachelagrade data ger sessionsnivåisolering. Endast sessionen som cachade en DataFrame kan läsa dess cachade data. Andra användare kan inte komma åt det, inklusive andra användare av samma anteckningsblock.
Den cachade datan innehåller det du fick läsa när du cachade den. Behörighetsändringar, radfilter och kolumnmasker som appliceras på källtabellerna i efterhand gäller inte för den cachade datan.
Regelverk
- Cache när du behöver en stabil snapshot: Om du kör flera transformationer, aggregeringar eller drilldowns på samma beräknade data ger snapshoten dem en konsekvent baslinje som inte ändras när källtabellerna ändras.
-
Cacha dyra beräkningar, inte vanliga tabellläsningar:
df.cache()materialiserar frågeresultatet och senare läsningar skannar den ögonblicksbilden. Om du cachelagrar en vanlig tabellläsning, såsomspark.table("main.sales.orders").cache(), skannar senare läsningar fortfarande en fullständig kopia av tabellen, så cachelagring ger liten nytta. Caching lönar sig efter dyrt arbete som joiner, aggregeringar och komplexa filter. -
Cacha inte data som du bara läser en gång:
df.cache()beräknar och lagrar resultatet direkt, vilket tar tid och lagringsutrymme. Om du bara läser resultatet en gång är den initiala kostnaden inte värd det. -
Använd cachen genom att härleda från den cachade DataFrame: För att läsa snapshoten, bygg senare operationer från den cachade DataFrame-variabeln, till exempel
df.select(...)ellerdf.filter(...). En oberoende DataFrame byggd från samma beräkning på källtabellerna använder inte cachen. - Använd inte cache för delning av data mellan sessioner eller användare: Cachad data är privat för din session. Andra sessioner, anteckningsböcker, jobbkörningar och användare kan inte läsa det. För att dela beräknade resultat mellan sessioner eller med andra användare, skriv dem till en permanent tabell.
- Håll sessioner med cachad data under sju dagar: Se livscykel och tidsgränser. Om ditt arbetsflöde behöver data under en längre tid, skriv den till en tabell.
-
Anropa
df.unpersist()när du inte längre behöver den cachade datan: Detta gör att Azure Databricks kan återta lagringen tidigare. Efter anropet kan DataFrame och de DataFrames som härstammar från det inte användas. -
Använd inte
df.unpersist()för att uppdatera data:df.unpersist()avslutar ögonblicksbildens livslängd. För att fånga upp ändringar i källtabellerna, bygg en ny DataFrame från källtabellerna.
Limitations
DataFrame-cache på serverlös beräkning har följande begränsningar:
-
Kolumnnamn och typer: Följande DataFrames kan inte cachelagras. Byt namn på eller casta kolumnerna innan du cachar, till exempel med
.alias("total_amount").- DataFrames med dubbla kolumnnamn.
- DataFrames med kolumnnamn som innehåller mellanslag eller någon av tecknen
,;{}()=, till exempelsum(amount)från en aggregering. - DataFrames med intervallkolumner.
- DataFrames med arrayer, kartor eller structs som innehåller NULL-typade värden.
- DataFrames utan kolumner, eller med endast NULL-typade kolumner.
-
Kolumnreferenser: Efter att du har cacchat en DataFrame kan du inte referera till dess kolumner via de DataFrames den byggdes av. Till exempel, efter
oct_15_orders = orders.join(customers, "customer_id")ochoct_15_orders.cache()höjerCANNOT_RESOLVE_DATAFRAME_COLUMNoct_15_orders.select(orders.amount). Användoct_15_orders.amounteller"amount"i stället. -
SQL- och katalogcache-API:er: SQL-cachesatser, såsom
CACHE TABLE, och tabellcachemetoder förspark.catalogstöds inte på serverless compute. Se begränsningar för cachehantering. För att återanvända ett frågeresultat i SQL, använd en sessionslokal tillfällig tabell. -
frågor om informationsschemat: När många sessioner i en metastore cachar DataFrames kan frågor på
information_schema.volumesochinformation_schema.schematavara långsamma eller överskrida tidsgränsen. Att filtreravolumesefter katalog gör inte förfrågan snabbare. Frågor/queries påinformation_schema.tablespåverkas inte.
- Azure Government-regioner: DataFrame-caching stöds inte på serverless compute i Azure Government-regioner.
-
Ignorerade parametrar:
df.persist(storageLevel)ignorerar lagringsnivån ochdf.unpersist(blocking)ignorerarblocking. Sedf.persist(storageLevel)ochdf.unpersist(blocking).
Migrera från klassisk Compute
För de flesta arbetsbelastningar ger caching på serverless beräkning samma resultat som på klassisk beräkning, och befintlig kod körs utan ändringar. Följande tabell listar skillnaderna.
| Behavior | Serverlös beräkning | Klassisk beräkning |
|---|---|---|
| cachematchning | Endast den cachade DataFrame och de DataFrames som härstammar från den använder automatiskt cachen. | Alla databasfrågor med samma planstruktur använder automatiskt cachen. |
| Datas färskhet | En konsekvent ögonblicksbild tagen vid tidpunkten när du anropar df.cache(). |
Varierar: cachelagrad data uppdateras i vissa fall och tillhandahåller en ögonblicksbild i andra. |
| Delningsomfång | Privat för din session. | Delad mellan sessioner inom klustret. |
| Materialisering | Ivrig: beräknas direkt när du anropar df.cache(). |
Lazy: beräknad vid första åtgärden på DataFrame. |
df.unpersist() |
Förstör DataFrame-objektet och frigör dess ögonblicksbild på ett deterministiskt sätt. | Frigör minnescachen. Senare användning av DataFrame kan ge den senaste eller föråldrade datan, beroende på produkt och datakälla. |
Följande beskriver de två första skillnaderna mer i detalj:
-
Cachematchning:
-
Arbetslaster som påverkas av förändringen: De flesta arbetslaster påverkas inte. Om du fortsätter använda den cachade DataFrame-variabeln, till exempel med
df.select(...)ellerdf.filter(...), fungerar cachen som tidigare. Förändringen påverkar endast arbetsbelastningar där en oberoende byggd DataFrame eller SQL-fråga återanvänder cachen eftersom den har samma planform. På serverless compute läser dessa frågor källtabellerna. - Om din arbetslast påverkas: Använd den cachade DataFrame-variabeln där du behöver det cachade resultatet, i stället för att bygga samma fråga igen.
-
Arbetslaster som påverkas av förändringen: De flesta arbetslaster påverkas inte. Om du fortsätter använda den cachade DataFrame-variabeln, till exempel med
-
Dataaktualitet:
- Arbetsbelastningar som påverkas av ändringen: De flesta arbetsbelastningar påverkas inte, eftersom det är ovanligt att läsa cachad data igen efter att ha skrivit till källtabellerna. Ändringen påverkar endast arbetsbelastningar som skriver till källtabellerna och sedan förväntar sig att den cachade DataFrame visar den nya datan.
- Om din arbetsbelastning påverkas: Efter att du skrivit till källtabellerna, bygg en ny DataFrame från dem istället för att återanvända den cachelagrade versionen.