当前位置: 首页 > 知识库问答 >
问题:

用sql缓存临时表

须新
2023-03-14

是一个使用spark 2注册的表。RegisterEmptablecreateOrReplaceTempView)缓存?

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

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

共有2个答案

督坚白
2023-03-14

事实并非如此。您应该显式缓存:

sqlContext.cacheTable("someTable")
左丘边浩
2023-03-14

注册表不缓存在内存中。

这个

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

您需要显式缓存数据帧。例如:

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.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)
 类似资料:
  • 主要内容:示例,删除临时表关系型数据库支持临时表,这是一项很棒的功能。临时表的概念由 SQL Server 引入,用来存储和处理中间结果。 临时表在会话期间创建,会话结束后自动被删除。临时表可以和普通表一样执行各种操作,比如 SELECT、UPDATE、INSERT、JOIN 等。 MySQL 3.23 及其更高版本才支持临时表,如果您使用的 MySQL 版本低于 3.23,则不能使用临时表,但可以使用堆表(Heap Ta

  • 本文向大家介绍SQL 创建临时表或内存表,包括了SQL 创建临时表或内存表的使用技巧和注意事项,需要的朋友参考一下 示例 PostgreSQL和SQLite 要创建会话本地的临时表: SQL服务器 要创建会话本地的临时表: 创建对所有人可见的临时表: 要创建一个内存表:            

  • 问题内容: 在Oracle中,您可以使用以下方式创建临时表: …这可能很漂亮,因为这会创建一个所有人都可以看到的表,但是一个INSERT插入表中的数据仅对他或她可见。此外,该数据将在事务或会话结束时自动删除(取决于其声明),从而使其他所有人的临时数据不受损害。 但是,在SQL Server中,可以使用以下方式创建临时表: …据我所知,它在功能和功能上与Oracle的实现有本质的不同。该临时表仅对您

  • 本文向大家介绍sql的临时表使用小结,包括了sql的临时表使用小结的使用技巧和注意事项,需要的朋友参考一下 1、创建方法: 方法一: create table TempTableName 或 select [字段1,字段2,...,] into TempTableName from table 方法二: create table tempdb.MyTempTable(Tid int) 说明: (1

  • 问题内容: 这是一个悬而未决的问题,但我真的很想听听人们的意见。 我很少使用显式声明的临时表(表变量或常规#tmp表),因为我认为不这样做会导致更简洁,可读性和可调试性的T- SQL。我还认为,与需要临时存储(例如,在查询中使用派生表)时使用SQL相比,SQL可以做得更好。 唯一的例外是当数据库不是典型的关系数据库而是星型或雪花模式时。我了解最好是首先将过滤器应用于事实表,然后使用生成的临时表从维

  • 问题内容: 临时表在哪里存储在数据库中?我想删除一个临时表(如果已经存在)。我可以通过查询信息模式来对安全表执行此操作,但是我不知道临时表的存储位置。 问题答案: 临时表存储在tempdb数据库中。这里概述了检查临时表是否存在的多种方法:检查是否存在临时表。