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

火花2.0.2和2.1.1之间的缓存差异

淳于凯
2023-03-14
val spark = SparkSession.builder().appName("test").master("local[4]").getOrCreate()
import spark.implicits._
val a = spark.createDataset(Seq(("a", 1), ("b", 2), ("c", 3)))
a.createTempView("a")
a.cache
println(s"Is a cached: ${spark.catalog.isCached("a")}")
val b = a.filter(x => x._2 < 3)
b.createTempView("b")
// calling action
b.cache.first
println(s"Is b cached: ${spark.catalog.isCached("b")}")

spark.catalog.uncacheTable("a")
println(s"Is b cached after a was unpersisted: ${spark.catalog.isCached("b")}")
Is a cached: true
Is b cached: true
Is b cached after a was unpersisted: true
Is a cached: true
Is b cached: true
Is b cached after a was unpersisted: false

如何在2.1.1中存档相同的行为?

谢谢你。

共有1个答案

经嘉
2023-03-14

我不知道该怎么做。根据测试,在Spark2.1.1中,它可以按照预期工作,但是有一些评论反映了一些疑问。也许您可以在Spark项目中打开一个JIRA来澄清这种情况。

CachedTableSuite.scala

test("uncaching temp table") {
  testData.select('key).createOrReplaceTempView("tempTable1")
  testData.select('key).createOrReplaceTempView("tempTable2")
  spark.catalog.cacheTable("tempTable1")

  assertCached(sql("SELECT COUNT(*) FROM tempTable1"))
  assertCached(sql("SELECT COUNT(*) FROM tempTable2"))

  // Is this valid?
  spark.catalog.uncacheTable("tempTable2")

  // Should this be cached?
  assertCached(sql("SELECT COUNT(*) FROM tempTable1"), 0)
}

assertCached方法检查numCachedTables等于第二个参数。

/**
 * Asserts that a given [[Dataset]] will be executed using the given number of cached results.
 */
def assertCached(query: Dataset[_], numCachedTables: Int = 1): Unit = {
  val planWithCaching = query.queryExecution.withCachedData
  val cachedData = planWithCaching collect {
    case cached: InMemoryRelation => cached
  }

  assert(
    cachedData.size == numCachedTables,
    s"Expected query to contain $numCachedTables, but it actually had ${cachedData.size}\n" +
    planWithCaching)
}
 类似资料:
  • 我在一个Spark项目上工作,这里我有一个文件是在parquet格式,当我试图用java加载这个文件时,它给了我下面的错误。但是,当我用相同的路径在hive中加载相同的文件并编写查询select*from table_name时,它工作得很好,数据也很正常。关于这个问题,请帮助我。 java.io.ioException:无法读取页脚:java.lang.runtimeException:损坏的文

  • 问题内容: 很快就有两个相等运算符:double equals( )和Triple equals( ),两者之间有什么区别? 问题答案: 简而言之: 操作员检查其实例值是否相等, 操作员检查引用是否指向同一实例, 长答案: 类是引用类型,可能有多个常量和变量在幕后引用类的同一单个实例。类引用保留在运行时堆栈(RTS)中,其实例保留在内存的堆区域中。当您控制平等时, 这意味着它们的实例是否彼此相等。

  • 当我使用DF的列名作为参数时,与使用和有什么根本区别? 哪一个是省时的,每一个的确切含义是什么?当我通过一些例子时,请有人详细解释一下,但这是令人困惑的。

  • 我创建并持久化一个df1,然后在其上执行以下操作: 我有一个有16个节点的集群(每个节点有1个worker和1个executor,4个内核和24GB Ram)和一个master(有15GB Ram)。Spark.shuffle.Partitions也是192个。它挂了2个小时,什么也没发生。Spark UI中没有任何活动。为什么挂这么久?是dagscheduler吗?我怎么查?如果你需要更多的信息

  • 尝试从/向redshift读/写(s3中的数据)。但在访问数据帧时会出现奇怪的错误。我可以看到正在创建数据帧,并且它能够访问数据,因为它输出表的列名

  • 我编写了一个简单的脚本,它接受任意数量的参数来演示< code>$@和< code>$*之间的区别: 在我做的 CLI 上 这就是打印出来的 因为它们是相同的,这是否意味着等于?还是我遗漏了一点?