2017-07-03 38 views
0

我與星火2.1.1和Scala 2.11.8「java.lang.UnsupportedOperationException:空集」

工作,我在執行星火殼我的代碼。這是我執行的代碼

val read_file1 = sc.textFile("Path to file 1"); 

val uid = read_file1.map(line => line.split(",")).map(array => array.map(arr => { 
| if(arr.contains(":")) (array(2).split(":")(0), arr.split(":")(0)) 
| else (array(2).split(":")(0), arr)})) 

val rdd1 = uid.map(array => array.drop(4)).flatMap(array => array.toSeq).map(y=>(y,1)).reduceByKey(_+_) 

我這段代碼的輸出是:

((v67430612_serv78i, fb_201906266952256),1) 
((v74005958_serv35i, fb_128431994336303),1) 

但是兩個RDDS'的輸出,當我執行:

uid2.map(x => ((x._1, x._2), x._3)).join(rdd1).map(y => ((y._1._1, y._1._2, y._2._1), y._2._2)) 

我得到錯誤:

"java.lang.UnsupportedOperationException: empty collection" 

爲什麼我得到這個錯誤?

以下是輸入文件的樣本: -

文件1:

2017-05-09 21:52:42 , 1494391962 , p69465323_serv80i:10:450 , 7 , fb_406423006398063:396560, guest_861067032060185_android:671051, fb_100000829486587:186589, fb_100007900293502:407374, fb_172395756592775:649795 
2017-05-09 21:52:42 , 1494391962 , z67265107_serv77i:4:45 , 2:Re , fb_106996523208498:110066, fb_274049626104849:86632, fb_111857069377742:69348, fb_127277511127344:46246 

文件2:

fb_100008724660685,302502,-450,v300430479_serv73i:10:450,switchtable,2017-04-30 00:00:00  
fb_190306964768414,147785,-6580,r308423810_serv31i::20,invite,2017-04-30 00:00:00 

我剛纔所指出的:當我執行

rdd1.take(10).foreach(println) or rdd1.first() 

我收到此消息在輸出之前:

WARN Executor: Managed memory leak detected; size = 39979424 bytes, TID = 11 

我不知道這是否與問題有關?

另注:此錯誤只有當我做

res.first() 

uid2.map(x => ((x._1, x._2), x._3)).join(rdd1).map(y => ((y._1._1, y._1._2, y._2._1), y._2._2)) 

發生在做

res.take(10).foreach(println) 

我沒有得到任何輸出,但不會返回錯誤無論是。

+0

你能分享整個異常堆棧跟蹤嗎? – stefanobaghino

+0

@ stefanobaghino我沒有整個堆棧跟蹤。我得到... 48消息的消息。請讓我知道如何讓整個事情 – PixieDev

+0

所以你只能得到一個單一的線,上面寫着'java.lang.UnsupportedOperationException:空collection'? – stefanobaghino

回答

2

你忘了trim空間從分裂線創建的元組,因此沒有加入,因爲他們不匹配。所以當你從空rdd試圖take時,拋出了異常。

您可以使用以下解決方案。它在我的工作。

val read_file1 = sc.textFile("Path to file 1"); 

val uid = read_file1.map(line => line.split(",")).map(array => array.map(arr => { 
    if(arr.contains(":")) (array(2).split(":")(0).trim, arr.split(":")(0).trim) 
    else (array(2).split(":")(0).trim, arr.trim)})) 

val rdd1 = uid.map(array => array.drop(4)).flatMap(array => array.toSeq).map(y=>(y,1)).reduceByKey(_+_) 


val read_file2 = sc.textFile("Path to File 2"); 
val uid2 = read_file2.map(line => {var arr = line.split(","); (arr(3).split(":")(0).trim,arr(0).trim,arr(2).trim)}); 

val res = uid2.map(x => ((x._1, x._2), x._3)).join(rdd1).map(y => ((y._1._1, y._1._2, y._2._1), y._2._2)) 
res.take(10).foreach(println) 
+0

@拉梅什Maharjan文件的大小可以有一些與此有關?因爲這個問題依然存在:( – PixieDev

+0

這裏的截圖此鏈接https://drive.google.com/open?id=0B_VulQELUNoFNlh6dG5QUFY1VWs – PixieDev

1

你得到join後空集合,它當在RDDS現在相應的鍵發生。任何一個鍵都不會被修剪,切片不正確或根本沒有任何匹配。我建議檢查文件/ rdds中是否有匹配的密鑰,檢查數據是否被正確提取,並檢查是否需要inner join而不是leftright outer join

相關問題