Ced*_* H. 14 apache-spark apache-spark-sql
注册表registerTempTable(createOrReplaceTempView带有spark 2. +)的表是否已缓存?
使用Zeppelin,我DataFrame在我的scala代码中注册了一个重度计算后,然后在%pyspark我想要访问它,并进一步过滤它.
它会使用表的内存缓存版本吗?或者每次都会重建?
eli*_*sah 21
已注册的表不会缓存在内存中.
该方法将使用给定的查询计划创建或替换给定的视图.registerTempTablecreateOrReplaceTempViewDataFrame
如果我们需要创建一个永久视图,它会将查询计划转换为规范化的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.registerTempTablecache.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)
| 归档时间: |
|
| 查看次数: |
16759 次 |
| 最近记录: |