Apache spark 使用sparksql的临时表缓存

Apache spark 使用sparksql的临时表缓存,apache-spark,apache-spark-sql,Apache Spark,Apache Spark Sql,使用registerTempable(createOrReplaceTempViewwithspark 2.+)注册的表是否缓存 使用齐柏林飞艇,经过大量计算后,我在scala代码中注册了一个数据帧,然后在%pyspark中我想访问它,并进一步过滤它 它会使用内存缓存版本的表吗?还是每次都要重建?不是。您应该显式缓存: sqlContext.cacheTable("someTable") 注册的表不会缓存在内存中 registerEmptablecreateOrReplaceTempView方

使用
registerTempable
createOrReplaceTempView
withspark 2.+)注册的表是否缓存

使用齐柏林飞艇,经过大量计算后,我在scala代码中注册了一个
数据帧
,然后在
%pyspark
中我想访问它,并进一步过滤它


它会使用内存缓存版本的表吗?还是每次都要重建?

不是。您应该显式缓存:

sqlContext.cacheTable("someTable")

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

registerEmptable
createOrReplaceTempView
方法将只创建给定的
DataFrame
的视图,或用给定的查询计划替换该视图

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

您需要显式缓存数据帧。e、 g:

df.createOrReplaceTempView("my_table") # df.registerTempTable("my_table") for spark <2.+
spark.cacheTable("my_table") 
现在,使用
cache.registerEmptable
cache.createOrReplaceTempView
执行相同的示例:

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)
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)
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=[\u 1:string,\u 2:int]
scala>df.createOrReplaceTempView(“我的表格”)
scala>sc.getPersistentRDDs
//res4:scala.collection.Map[Int,org.apache.spark.rdd.rdd[]]=Map()
scala>df.cache.createOrReplaceTempView(“我的表”)
scala>sc.getPersistentRDDs
//res6:scala.collection.Map[Int,org.apache.spark.rdd.rdd[]]
//地图(2->ConvertToUnsafe
//+-LocalTableScan[_1#0,_2#1],[1,2],[b,3]]
//缓存中的MapPartitionsRDD[2]位于:28)

那么df.cache.registerTempTable实际上是无用的?@toofrellik你是什么意思?那么
cacheTable
cache.createOrReplaceTempView
在功能和功能上是否相同performance@toofrellik
cacheTable
cache
与您的行为相同,但计划不同你可以看到上面。OP不想知道如何缓存临时表,因为
createOrReplaceTempView
本身无法做到这一点。