文章目录
- RDD/Dataset缓存复用
- 纯SQL结果缓存复用
RDD/Dataset缓存复用
我们知道在使用RDD和Dataset API开发Spark应用程序的时候,如果要缓存某个RDD或Dataset来进行复用,减少重复计算提升计算效率的时候,我们可以在RDD或Dataset上调用persist()方法并传入缓存级别参数进行缓存。
val df: Dataset[Row] = ...
df.persist(StorageLevel.MEMORY_AND_DISK)
纯SQL结果缓存复用
但是当我们以纯SQL来开发Spark应用程序的时候,该如何缓存某段SQL产生的结果呢?
- 第一步,对要复用的SQL创建临时视图。这里需要注意两点
- 临时视图生命周期:所创建的临时视图的生命周期是绑定在当前Spark应用程序上的,也就是说,当前Spark应用程序的任何地方都可以访问这个临时视图,应用程序停止之后,临时视图会自动被删除。
- 临时视图所在的数据库:创建临时视图时,系统会默认分配一个数据库名称“global_temp”,在使用临时视图时,必须加上这个库名,否则找不到
- 第二步,对临时视图进行缓存,同样可以指定缓存级别
- 第三步,使用缓存的临时视图
val spark: SparkSession = ...
//1. 创建临时视图
spark.sql("select name, age from ").createOrReplaceGlobalTempView("temp_view")
//2. 缓存临时视图
spark.catalog.cacheTable("global_temp.temp_view", StorageLevel.MEMORY_AND_DISK)
//3. 使用缓存的临时视图
spark.sql("select name from global_temp.temp_view")
spark.sql("select age from global_temp.temp_view")