使用spark-sql临时表缓存

Ced*_* H. 14 apache-spark apache-spark-sql

注册表registerTempTable(createOrReplaceTempView带有spark 2. +)的表是否已缓存?

使用Zeppelin,我DataFrame在我的scala代码中注册了一个重度计算后,然后在%pyspark我想要访问它,并进一步过滤它.

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

eli*_*sah 21

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

该方法将使用给定的查询计划创建或替换给定的视图.registerTempTable createOrReplaceTempViewDataFrame

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

您需要显式缓存DataFrame.例如:

df.createOrReplaceTempView("my_table") # df.registerTempTable("my_table") for spark <2.+
spark.cacheTable("my_table") 
Run Code Online (Sandbox Code Playgroud)

编辑:

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

使用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)
Run Code Online (Sandbox Code Playgroud)

现在,同样的例子使用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)
Run Code Online (Sandbox Code Playgroud)


小智 7

它不是。您应该明确缓存:

sqlContext.cacheTable("someTable")
Run Code Online (Sandbox Code Playgroud)