是否注册了registerTempTable
(createOrReplaceTempView
spark 2。+ )缓存的表格?
使用Zeppelin,我在我的scala代码中注册DataFrame
,经过繁重的计算,然后在%pyspark
内我想访问它,并进一步过滤它。
它会使用表的内存缓存版本吗?或者每次都会重建?
答案 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")