Spark createTempView数据存哪了?

前言

实习生很苦恼,为什么我使用了createTempView创建临时视图,每次查询的这个视图特别的耗时呢?这个数据难道没有存在内存而是本地?
我问:你的视图缓存了吗?
实习生:视图缓存?一般我只缓存DataFrame,比如如果要复用DataFrame我就会调用df.cache()方法,视图也要缓存?怎么缓存?

createTempView运作原理

先说一个众人皆知的知识:
Spark中的算子包含transformation算子和action算子,transformation是根据原有RDD创建一个新的RDD,而action则把RDD操作后的结果返回给driver。Spark对transformation的抽象可以大大提高性能,这是因为在Spark中,所有transformation操作都是lazy模式,即Spark不会立即计算结果,而只是简单地记住所有对数据集的转换操作逻辑。这些转换只有遇到action操作的时候才会开始计算。这样的设计使得Spark更加高效。

有了以上的知识,就不难理解为什么实习生使用createTempView后,查询这个视图每次都很耗时了,正是因为createTempView操作是lazy模式,在没有action算子触发之前,它并没有什么实质性的运作,仅仅记录了一个创建视图的逻辑。
煮个例子:

sql("select a,b from table where xxx").createTempView("view1")
sql("select a from view1 where xxx").show()
sql("select b from view1 where xxx").show()

Spark每次遇到action算子show()方法的时候,才开始真正计算,上面代码中两次用到视图view1,那么意味着创建视图的方法会执行两次,因此非常的耗时,所以需要对此进行缓存处理。

如何给createTempView加缓存

直接上代码:

spark.table("view1").cache()

加上缓存之后,再去查,发现效率非常快,几乎是秒读。

后记

一定要深刻理解Spark的运作原理,没有进行缓存操作,数据就没有真正的保存,只有执行了action算子,spark才真正的开始运算,否则全部都是记录执行的逻辑而已。

发布了237 篇原创文章 · 获赞 140 · 访问量 17万+

猜你喜欢

转载自blog.csdn.net/Android_xue/article/details/104047830