2017-03-18 65 views
0

我正在學習Spark和Scala。我在一個場景中工作,以確定用H或I開頭的行下面是我的代碼使用Scala查找以H或I開頭的行時出錯

def startWithHorI(s:String):String= 
{ 
if(s.startsWith("I") 
return s 
if(s.startsWith("H") 
return s 
} 

val fileRDD=sc.textFile("wordcountsample.txt") 
val checkRDD=fileRDD.map(startWithHorI) 
checkRDD.collect 

同時創造發現的功能,它拋出一個錯誤:單位要求:布爾。

從研究我瞭解,它不能夠承認返回單位意味着無效。有人能幫助我嗎?

回答

1

有幾件事情錯了你的閃避,我們將開始有: 因爲根據發佈的代碼,你的語法是不完整的,DEF是否定義不當它是引發錯誤:

def startWithHorI(s:String): String= 
{ 
if(s.startsWith("I")) // missing extra paren char in original post 
s // do not need return statement 
if(s.startsWith("H")) // missing extra paren char in original post 
s // do not need return statement 
} 

這仍然會返回一個錯誤,因爲編譯器發現它返回Any時,我們期待String。如果我們沒有其他的情況(當s不以H或I開頭時會返回什麼?),我們不能這樣做 - 編譯器會將此視爲Any返回類型。對此的修正將會有其他條件,最終返回String

def startWithHorI(s: String): String = { 
if(s.startsWith("I")) s else "no I" 
if(s.startsWith("H")) s else "no H" 
} 

如果你不想返回任何東西,那麼Option是值得看的返回類型。

最後,我們可以實現您通過過濾器做什麼 - 無需映射與DEF:

val fileRDD = sc.textFile("wordcountsample.txt") 
val checkRDD = fileRDD.filter(s => s.startsWith("H") || s.startsWith("I")) 
checkRDD.collect 
+0

謝謝!這當然有幫助.. –

0

將任何函數傳遞給rdd.map(fn)時,請確保fn涵蓋所有可能的方案。

如果您想要完全避免不以HI開頭的字符串,請使用flatMap並從您的函數返回Option [String]。 例子:

def startWithHorI(s:String): Option[String]= 
{ 
    if(s.startsWith("I") || s.startsWith("H")) Some(s) 
    else None 
} 

然後,

sc.textFile("wordcountsample.txt").flatMap(startWithHorI) 

這將刪除所有行不與H或I.

總體出發,儘量減少運行時錯誤嘗試創建total functions它處理所有可能的參數值。

0

下面的東西會適合你嗎?

val fileRDD=sc.textFile("wordcountsample.txt") 
fileRDD.collect 
Array[String] = Array("Hello ", Hello World, Instragram, Good Morning) 


val filterRDD=fileRDD.filter(x=> (x(0) == 'H'||x(0) == 'I')) 
filterRDD.collect() 
Array[String] = Array("Hello ", Hello World, Instragram)