使用 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 你是什么意思? 那么cacheTable
与cache.createOrReplaceTempView
有多大不同,它们在功能和性能方面都相同
@toofrellik cacheTable
和 cache
具有相同的行为,但与您在上面看到的计划不同。 OP 不知道他/她如何缓存临时表,因为 createOrReplaceTempView
单独不会这样做。【参考方案2】:
事实并非如此。您应该明确缓存:
sqlContext.cacheTable("someTable")
【讨论】:
以上是关于使用 spark-sql 缓存临时表的主要内容,如果未能解决你的问题,请参考以下文章