如何检查数据是缓存在dataframe中还是由于Pyspark中的延迟执行而尚未缓存?

如何检查数据是缓存在dataframe中还是由于Pyspark中的延迟执行而尚未缓存?,pyspark,apache-spark-sql,Pyspark,Apache Spark Sql,我的问题和我在堆栈溢出中发现的其他问题没有什么不同。我需要知道数据是否已经被检索并存储在数据帧中,或者这是否还没有发生 我正在做这样的事情 df1=spark.table("sourceDB.Table1") df1.cache() 现在,正如您可能知道的,由于延迟执行,尚未从源表读取数据。所以我需要在这里有一个表达式,在这里表示结果为“False” 过了一段时间,我正在做一些需要从源代码中检索数据的操作。比如说 df1.groupBy("col3").

我的问题和我在堆栈溢出中发现的其他问题没有什么不同。我需要知道数据是否已经被检索并存储在数据帧中,或者这是否还没有发生

我正在做这样的事情

df1=spark.table("sourceDB.Table1")
df1.cache()
现在,正如您可能知道的,由于延迟执行,尚未从源表读取数据。所以我需要在这里有一个表达式,在这里表示结果为“False”

过了一段时间,我正在做一些需要从源代码中检索数据的操作。比如说

df1.groupBy("col3").agg(sum("col1").alias("sum_of_col1")).select("sum_of_col1","col3").filter("sum_of_col1 >= 100").show()
此时,数据必须已被读取并存储在df1的缓存中。所以我需要在这里有一个表达式,在这里表示结果为“真”

我们有没有办法做到这一点?我相信df1.is_cached在这种情况下不会有帮助

也许这是有用的

1。如果要检查数据帧上是否已经触发了缓存/持久化,则可以使用缓存管理器来确认,如下-

spark.sharedState.cacheManager.lookupCachedData(df.queryExecution.logical).非空
2。如果您想检查内存中是否有数据,下面的方法可能会有所帮助-

def checkIfDataIsInMemory(df:DataFrame):布尔={
val manager=df.sparkSession.sharedState.cacheManager
//步骤1-检查dataframe.cache是否提前发出
if(manager.lookupCachedData(df.queryExecution.logical).nonEmpty){//cache语句已发出
println(“缓存语句已在此数据帧上发出”)
//步骤2检查数据是否在内存中
val cacheData=manager.lookupCachedData(df.queryExecution.logical).get
cacheData.CachedPresentation.cacheBuilder.isCachedColumnBuffersLoaded
}否则错误
}
3。测试上述方法-

val df=spark.read
.拼花地板(getClass.getResource(“/parquet/plain/part-00000-4ece3595-e410-4301-aefd-431cd1debf91-c000.snappy”+
“.parquet”).getPath)
println(checkIfDataIsInMemory(df))
/**
*假的
*/
df.cache()
//检查数据是否已缓存
println(checkIfDataIsInMemory(df))
/**
*已在此数据帧上发出Cache语句
*假的
*/
println(df.count())
println(checkIfDataIsInMemory(df))
/**
* 1
*已在此数据帧上发出Cache语句
*真的
*/

我认为没有任何这样的函数可以标记为真或假。但是,从您在问题中解释的方式来看,似乎您已经知道何时加载它,或者由于延迟计算的概念,何时将跳过它。根据经验,您可以说,在数据帧上没有调用任何操作之前,它不会被加载。简单地说,执行计划将在那之前生成。谢谢Ajay。我的用例有点不同。我的工作中有一些检查点需要缓存。如果作业在中间失败,我需要将最后一个缓存的数据文件存储在表中。所以我需要一个程序化的方法来查找数据帧是否已经缓存在内存中或者还没有被缓存。。学习了新版本-
sharedState.cacheManager
感谢您的回复和宝贵时间。我们是否可以用PySpark而不是Scala来实现这一点?看起来pyspark SparkSession中的sharedState方法不可用。您不能使用
spark.\u jsparkSession.sharedState