1. 程式人生 > >spark執行中的java.lang.OutOfMemoryError: Java heap space錯誤

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相關的學習心得~