spark报出An error occurred while calling o209.showString.和GC overhead limit exceeded的解决方法

本文探讨了在处理大量数据时遇到的JVM内存溢出问题,提出了两种解决方案。一是通过使用isin函数替代多次迭代,减少内存消耗;二是利用Spark的缓存机制df.persist(),在关键步骤保存数据到硬盘,缓解内存压力。实践证明,这两种方法能有效避免内存溢出,并且df.persist()还能提高运行效率。在程序完成后,记得释放缓存以释放硬盘空间。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

如下图的错误解决方法

出现该错误的原因是因为迭代处理的数据量太大,jvm的自动回收垃圾机制不完善导致的,比如我在这里对2千万的数据迭代处理24次,数据就报错了。

解决方法一:可以利用isin函数代替24次迭代过程

改为

在这里提一句

df1 = df.withColumn('zt', when(col("zt") == '开业', 1).otherwise(col('zt')))

这一句的作用是把zt列,值为开业的改为1

 

解决方法二:利用spark的缓存机制df.persist()函数

分别在df4,df9,df14,df20利用缓存机制把数据先存储到硬盘上释放 内存空间,方便我们执行下面迭代程序,解决jvm内存不足问题。(在这里提一句话可以根据需求多设几处perrsist,用时间换取空间

最后程序跑完可以释放缓存

df4.unpersist()

df9.unpersist()

df14.unpersist()

df20.unpersist()

解决问题完成。

 

df.persist()函数还可以大大节省运行时间,如在多次需要运行一个数据集情况下,这里属于空间换时间

评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值