当前位置: 首页 > 面试题库 >

取消持久化(py)spark中的所有数据帧

步嘉德
2023-03-14
问题内容

我是一个Spark应用程序,有几个要保留当前状态的地方。通常这是经过很大的一步,或者是缓存我想多次使用的状态。看来,当我第二次在数据帧上调用缓存时,新副本将缓存到内存中。在我的应用程序中,这会在扩展时导致内存问题。即使在我当前的测试中,给定的数据帧最大约为100
MB,中间结果的累积大小却超出了执行器上分配的内存。请参见下面的一个小示例,该示例显示了此行为。

cache_test.py:

from pyspark import SparkContext, HiveContext

spark_context = SparkContext(appName='cache_test')
hive_context = HiveContext(spark_context)

df = (hive_context.read
      .format('com.databricks.spark.csv')
      .load('simple_data.csv')
     )
df.cache()
df.show()

df = df.withColumn('C1+C2', df['C1'] + df['C2'])
df.cache()
df.show()

spark_context.stop()

simple_data.csv:

1,2,3
4,5,6
7,8,9

查看应用程序UI,除了带有新列的原始数据框之外,还有一个原始数据框的副本。我可以通过df.unpersist()在withColumn行之前调用来删除原始副本。这是删除缓存的中间结果的推荐方法(即,在之前调用unpersist
cache())。

另外,可以清除所有缓存的对象。在我的应用程序中,有自然的断点,我可以在其中简单地清除所有内存,然后继续下一个文件。我想这样做而不为每个输入文件创建新的spark应用程序。

先感谢您!


问题答案:

火花2.x

您可以使用Catalog.clearCache

from pyspark.sql import SparkSession

spark = SparkSession.builder.getOrCreate
...
spark.catalog.clearCache()

Spark 1.x

您可以使用以下SQLContext.clearCache方法

从内存缓存中删除所有缓存的表。

from pyspark.sql import SQLContext
from pyspark import SparkContext

sqlContext = SQLContext.getOrCreate(SparkContext.getOrCreate())
...
sqlContext.clearCache()


 类似资料:
  • 我见过(旧?),我一直在考虑使用压缩键,但是对于kafka来说,是否有一个简单的选项可以永远删除消息? 或者最好的选择是给保留期一个可笑的高值?

  • 我正在使用网络逻辑10.3。我正在尝试配置一个持久订阅,其中包含由 jdbc 存储(在 Oracle DB 中)支持的持久消息。我有一个主题,MDB 正在作为持久订阅者侦听该主题。在场景-1下:如果我发送消息,它会命中MDB。 在场景2中:我挂起了MDB,希望发送到主题的消息只要不被MDB(它是唯一注册的持久订阅者)使用,就会一直存在。但是当我向主题发送消息时,它短暂地出现在那里,然后就消失了(我

  • 为了学习数据的持久化,写一个简单的地址薄合约.虽然这个例子因为各种原因作为生产环境的合约不太实用,但它是一个很好的合约用来学习EOSIO的数据持久化并且不会因为与eosio multi_index不相关的相关业务逻辑分心. Step 1:创建一个新的文件夹 进入之前的目录: cd /Users/zhong/coding/CLion/contracts 为我们的合约创建一个新的目录并进去: mkd

  • 数据落盘问题的由来 这本质上是数据持久化问题,对于有些应用依赖持久化数据,比如应用自身产生的日志需要持久化存储的情况,需要保证容器里的数据不丢失,在Pod挂掉后,其他应用依然可以访问到这些数据,因此我们需要将数据持久化存储起来。 数据落盘问题解决方案 下面以一个应用的日志收集为例,该日志需要持久化收集到ElasticSearch集群中,如果不考虑数据丢失的情形,可以直接使用前面提到的应用日志收集一

  • 主要内容:一、数据持久化,二、持久化的形式,三、源码分析,四、总结一、数据持久化 redis做为一种内存型数据库,做持久化,个人感觉略有鸡肋的意思。似乎有一种,别人有,自己不有也不行的感觉。以目前Redis主流的应用方式,如果仔细分析,基本上都是在内存中即可完成,对持久化没要求或者说不大。再举一个反例,如果内存中有几百G甚至更多的数据,真要是整体当机,恢复的时间基本就是灾难。 目前基本应用仍然是以关系型数据库或者其它数据库(如Hadoop,Mysql等)为持久化

  • 我有一个Kafka主题,它有多个消费者群体。我需要主题上的消息在其持续时间到期时不被删除,如果它们尚未被所有消费者组读取 是否可以在持续时间之外设置其他持久性规则?我需要这些信息始终停留在一个主题上,如果它们从未被使用过 如果邮件未被使用且其持续时间已过期,是否可以“刷新”该邮件的超时?

  • 我有连接到我的数据库运行。我可以执行以下没有问题: 然而,在设置了JPA和持久类之后,我总是得到一个“未选择数据库”错误。看起来我不需要调整我的数据库配置(MySQL连接到Glassfish 3.1),否则上面的代码将无法工作。 正在拨打的电话: 我尝试过这个调用直接在MySQL工作台和它不工作。 这一个确实有效: 我一直在玩游戏,似乎无法在任何地方添加数据库名称(“人”)。以下是我目前掌握的情况

  • 我知道Redis从内存中提供所有数据,但它是否也可以在服务器重新引导时持久存在,这样当服务器重新引导时,它将从磁盘中读取所有数据到内存中。或者它总是一个空白存储,只存储数据,而应用程序运行没有持久性?