Spark中该缓存临时视图的方式是否有误?我的理解正确吗?
关于Spark缓存临时视图代码的问题
你的理解完全正确。
临时视图本质只是Spark SQL里的逻辑查询别名,本身不存储任何数据。原代码中:
- 先通过SQL查询创建临时视图
temp_view,这一步只是把查询逻辑注册到Spark的元数据中; - 调用
spark.table("temp_view")会基于视图的查询逻辑生成一个新的DataFrame,再对这个DataFrame调用cache(),缓存的是这个DataFrame对应的数据集,但临时视图本身并没有和缓存绑定。
这意味着后续如果直接用spark.sql("select * from temp_view")查询,Spark还是会重新执行原来的SQL逻辑,不会用到之前缓存的DataFrame——除非你在代码里持续引用那个被缓存的DataFrame对象。
正确的缓存方式有两种:
- 先缓存DataFrame,再注册为视图:
val df = spark.sql( s""" |... """.stripMargin).cache() df.createOrReplaceTempView("temp_view")
这种方式下,后续通过视图查询时,会直接复用缓存的DataFrame数据。
- 缓存后将DataFrame重新覆盖原视图:
spark.sql( s""" |... """.stripMargin).createOrReplaceTempView("temp_view") val cachedDf = spark.table("temp_view").cache() cachedDf.createOrReplaceTempView("temp_view")
通过覆盖视图,让原视图指向已缓存的DataFrame,后续查询视图就会使用缓存数据。
内容的提问来源于stack exchange,提问作者Alexander Lopatin
相关产品推荐
相关产品推荐

