使用spark-sql临时表缓存

时间:2016-08-31 11:38:15

标签: apache-spark apache-spark-sql

是否注册了registerTempTablecreateOrReplaceTempView spark 2。+ )缓存的表格?

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

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

2 个答案:

答案 0 :(得分:19)

已注册的表未缓存在内存中。

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.cacheTable("my_table")

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.registerTempTable("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)

答案 1 :(得分:4)

不是。您应该明确缓存:

sqlContext.cacheTable("someTable")