使用 spark-sql 缓存临时表

Posted

技术标签:

【中文标题】使用 spark-sql 缓存临时表【英文标题】:Temp table caching with spark-sql 【发布时间】:2016-08-31 11:38:15 【问题描述】:

使用registerTempTable 注册的表(createOrReplaceTempView with spark 2.+)是否已缓存?

使用 Zeppelin,我在我的 scala 代码中注册了一个 DataFrame,经过大量计算,然后在 %pyspark 内我想访问它,并进一步过滤它。

它会使用内存缓存版本的表吗?还是每次都会重建?

【问题讨论】:

【参考方案1】:

已注册的表不会缓存在内存中。

registerTempTable createOrReplaceTempView 方法只会使用给定的查询计划创建或替换给定DataFrame 的视图。

如果我们需要创建一个永久视图,它会将查询计划转换为规范化的 SQL 字符串,并将其作为视图文本存储在 Metastore 中。

您需要明确缓存 DataFrame。例如:

df.createOrReplaceTempView("my_table") # df.registerTempTable("my_table") for spark <2.+
spark.cacheTable("my_table") 

编辑:

让我们用一个例子来说明这一点:

使用cacheTable

scala> val df = Seq(("1",2),("b",3)).toDF
// df: org.apache.spark.sql.DataFrame = [_1: string, _2: int]

scala> sc.getPersistentRDDs
// res0: scala.collection.Map[Int,org.apache.spark.rdd.RDD[_]] = Map()

scala> df.createOrReplaceTempView("my_table")

scala> sc.getPersistentRDDs
// res2: scala.collection.Map[Int,org.apache.spark.rdd.RDD[_]] = Map()

scala> spark.catalog.cacheTable("my_table") // spark.cacheTable("...") before spark 2.0

scala> sc.getPersistentRDDs
// res4: scala.collection.Map[Int,org.apache.spark.rdd.RDD[_]] = Map(2 -> In-memory table my_table MapPartitionsRDD[2] at cacheTable at <console>:26)

现在同样的例子使用 cache.registerTempTable cache.createOrReplaceTempView

scala> sc.getPersistentRDDs
// res2: scala.collection.Map[Int,org.apache.spark.rdd.RDD[_]] = Map()

scala> val df = Seq(("1",2),("b",3)).toDF
// df: org.apache.spark.sql.DataFrame = [_1: string, _2: int]

scala> df.createOrReplaceTempView("my_table")

scala> sc.getPersistentRDDs
// res4: scala.collection.Map[Int,org.apache.spark.rdd.RDD[_]] = Map()

scala> df.cache.createOrReplaceTempView("my_table")

scala> sc.getPersistentRDDs
// res6: scala.collection.Map[Int,org.apache.spark.rdd.RDD[_]] = 
// Map(2 -> ConvertToUnsafe
// +- LocalTableScan [_1#0,_2#1], [[1,2],[b,3]]
//  MapPartitionsRDD[2] at cache at <console>:28)

【讨论】:

那么 df.cache.registerTempTable 实际上没用? @toofrellik 你是什么意思? 那么cacheTablecache.createOrReplaceTempView 有多大不同,它们在功能和性能方面都相同 @toofrellik cacheTablecache 具有相同的行为,但与您在上面看到的计划不同。 OP 不知道他/她如何缓存临时表,因为 createOrReplaceTempView 单独不会这样做。【参考方案2】:

事实并非如此。您应该明确缓存:

sqlContext.cacheTable("someTable")

【讨论】:

以上是关于使用 spark-sql 缓存临时表的主要内容,如果未能解决你的问题,请参考以下文章

哪个更好?在 MySQL 中的磁盘文件或临时表中缓存

MySQL Innodb--共享临时表空间和临时文件

registerTempTable 是不是会导致表被缓存?

临时表,临时表什么时候删除

MySQL创建临时表?

SQL Server 表变量和临时表的区别