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相关的学习心得~



你可能感兴趣的:(Spark)