在Scala中从映射中删除空字符串

15
val lines: RDD[String] = sc.textFile("/tmp/inputs/*")
val tokenizedLines = lines.map(Tokenizer.tokenize)
在上面的代码片段中,tokenize函数可能会返回空字符串。如果这种情况发生,我该如何跳过将其添加到映射表中呢?还是在添加到映射表后删除空条目?
4个回答

29

tokenizedLines.filter(_.nonEmpty)


这个操作会筛选出结果还是移除它们?我想彻底移除它们。 - Siva
该过滤器返回一个新的集合,其中不包含空字符串。 - axmrnv
当我打印过滤后的分词行时,数组缓冲区仍然有空字符串。我是否还漏掉了其他东西? - Siva
1
就像scaladoc所述,RDDs是不可变的,因此您无法直接修改它们。在Scala中尽可能避免使用可变数据结构。所以您可以编写val tokenizedLines = lines.map(Tokenizer.tokenize).filter(_.nonEmpty) - axmrnv
你不能从RDD中删除任何内容,因为它是不可变的。解决方案是正确的,因为你可以收集过滤后的数据以便在需要使用map而没有空字符串的地方使用。 - Kuldeep Singh

11

目前被接受的答案使用了filternonEmpty,但由于nonEmpty不是String上的方法,而是通过隐式转换添加的,所以会有一些性能损失。使用值对象时,我期望差异几乎不可感知,但在Scala的某些版本中情况并非如此,这将导致显著的性能问题。

相反,可以使用以下代码,它保证更快:

tokenizedLines.filterNot(_.isEmpty)

1
您可以使用 flatMapOption 相结合。类似这样的代码:
lines.flatMap{
     case "" => None 
     case s => Some(s)
}

这行代码是什么意思?lines.flatMap{case "" => Nil case s => Seq(s)} - crak

0
val tokenizedLines = (lines.map(Tokenizer.tokenize)).filter(_.nonEmpty)

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接