问题描述:
我在执行我的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相关的学习心得~