val lines: RDD[String] = sc.textFile("/tmp/inputs/*")
val tokenizedLines = lines.map(Tokenizer.tokenize)
在上面的代码片段中,tokenize函数可能会返回空字符串。如果这种情况发生,我该如何跳过将其添加到映射表中呢?还是在添加到映射表后删除空条目?val lines: RDD[String] = sc.textFile("/tmp/inputs/*")
val tokenizedLines = lines.map(Tokenizer.tokenize)
在上面的代码片段中,tokenize函数可能会返回空字符串。如果这种情况发生,我该如何跳过将其添加到映射表中呢?还是在添加到映射表后删除空条目?tokenizedLines.filter(_.nonEmpty)
目前被接受的答案使用了filter
和nonEmpty
,但由于nonEmpty
不是String
上的方法,而是通过隐式转换添加的,所以会有一些性能损失。使用值对象时,我期望差异几乎不可感知,但在Scala的某些版本中情况并非如此,这将导致显著的性能问题。
相反,可以使用以下代码,它保证更快:
tokenizedLines.filterNot(_.isEmpty)
flatMap
与 Option
相结合。类似这样的代码:lines.flatMap{
case "" => None
case s => Some(s)
}
val tokenizedLines = (lines.map(Tokenizer.tokenize)).filter(_.nonEmpty)
val tokenizedLines = lines.map(Tokenizer.tokenize).filter(_.nonEmpty)
。 - axmrnv