Spark缓存DataSet后再缓存其临时表,会生成两份缓存数据吗?
Spark缓存DataSet与临时表的重复缓存问题
这个问题问得很到位,我来给你掰扯清楚——Spark只会缓存一份数据,不会生成分别对应DataSet和临时表的两份独立缓存。原因主要有这几点:
临时表只是DataSet的"别名",没有复制数据
当你调用dataSet.registerTempTable("temp_table")时,并没有把DataSet的数据复制一份生成新的表,只是给这个DataSet的逻辑执行计划绑定了一个表名。说白了,temp_table就是原DataSet的"别名",两者共享完全相同的计算 lineage 和底层执行逻辑。两种缓存操作指向的是同一个底层数据
不管是调用dataSet.cache()还是sqlContext.cacheTable("temp_table"),本质都是告诉Spark:"把这个计算逻辑对应的结果缓存起来"。因为临时表和原DataSet是同一个逻辑计划,Spark会识别出这两个缓存请求指向的是同一个数据,只会执行一次缓存操作。可以通过Spark UI验证
你可以在运行代码后打开Spark UI的Storage页面查看,只会看到一条缓存条目,对应的就是这个DataSet/临时表的存储信息,不会出现两个独立的缓存项。
另外提一句,你代码里有个小笔误:dataset.cache()应该是dataSet.cache()(Scala大小写敏感,注意变量名一致),不过这不影响缓存逻辑的判断。
内容的提问来源于stack exchange,提问作者thebytewalker
相关产品推荐
相关产品推荐

