2014-11-05 35 views
8
val lines: RDD[String] = sc.textFile("/tmp/inputs/*") 
val tokenizedLines = lines.map(Tokenizer.tokenize) 

在上面的代碼片段中,tokenize函數可能會返回空字符串。在那種情況下,我如何跳過將它添加到地圖?或添加到地圖後刪除空的條目?從scala中的地圖中刪除空字符串

回答

23

tokenizedLines.filter(_.nonEmpty)

+0

沒有此過濾器的結果或刪除它們?我熱衷於消除它們。 – Siva 2014-11-05 09:43:52

+0

過濾器返回一個沒有空字符串的新集合。 – akagroundhog 2014-11-05 09:45:51

+0

當我在過濾後打印標記行時,它仍然在數組緩衝區中有空字符串。我是否還有其他東西丟失? – Siva 2014-11-05 09:53:28

1

您可能可以使用flatMap和Option?

森達東西那樣 lines.flatMap { 情況下 「」=>無 如果s =>一些(一個或多個) }

+0

由於某些原因我無法使用flatmap .. – Siva 2014-11-05 10:03:04

+0

ow lines.flatMap {case「」=>無情況s => Seq(s)}所以? – crak 2014-11-13 09:40:03

0

VAL tokenizedLines =(lines.map(Tokenizer.tokenize))。過濾器(_.nonEmpty)

10

目前公認的答案,用filternonEmpty,招致的性能損失,因爲nonEmpty不上String的方法,但是,相反,它是通過隱式轉換增加。在使用價值對象的情況下,我預計這種差異幾乎察覺不到,但在Scala版本中,如果情況並非如此,那麼這種差異會非常大。

相反,人們可以利用這一點,這是有保證的要快:

tokenizedLines.filterNot(_.isEmpty)