spark运行中的java.lang.OutOfMemoryError: Java heap space错误

问题描述:

          我在执行我的spark代码过程中,出现了如标题所示的问题  

          以下为我执行的主要代码:

ss=e_Task_test.engine()         
diag_hos=l_patient.map(lambda x:(ss.get_hospital(x),ss.get_patient_diag(x))) 
dh_all=diag_hos.groupByKey().map(lambda x:(x[0],list(x[1]))).collect()

           我代码的目的:是要统计在同一个医院里所有的诊断信息的数目,因此我先形成 医院-诊断信息 的key-value数据,然后再通过key值聚合,然后求出value值的长度,最后得到同一个医院对应的诊断信息的数量

          那么出现内存溢出的原因,主要是在第三条语句,因为第二句中,因为value值为诊断信息,本来信息内容就比较哒,我通过 groupByKey进行聚合之后,value值中的内容为一个list,而当相同的key值很多时候,势必会使聚合之后的value值变得特别大最后导致内存溢出,所以在做数据统计时一定要注意这个问题

          最后我的改进办法为:通过mapvalues和reduceby两个方法,直接进行计数,最后得到最后的结果:

          

diag_hos=l_patient.map(lambda x:(ss.get_hospital(x),ss.is_patient_diag(x)))

dh_all=diag_hos.mapValues(lambda x:(x,1)).reduceByKey(lambda x,y:(x[0]+y[0],x[1]+y[1]))
       对value值又增加了一个1,最后得到的x[1]中内容即为最后同一医院诊断信息的数量

     当然还有另外一种统计的方法:那就是map时候,形成的key-value为 医院-1 这样的值,最后根据医院,做一个reducebykey(lambda x,y:x+y)  最后聚合之后得到的内容即为 同一医院诊断信息的数量

        

      欢迎和大家一起交流spark相关的学习心得~



评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

小千爱编程呀

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值