Scala中的flatMap,编译器说这是错误的



>我有一个文件,其中包含包含用"," 分隔的项目的行例如:

2 1,3
3 2,5,7
5 4

现在我想将这个文件平面映射到这样的rdd:

2 1
2 3
3 2
3 5
5 7
5 4

我想知道如何在 scala 中实现这个功能:

  val pairs = lines.flatMap { line =>
        val a = line.split(" ")(0)
        val partb = line.split(" ")(1)
        for (b <- partb.split(",")) {
          yield a + " " + b
        }
      }

这是对的吗?

感谢您澄清您的代码示例。在您的情况下,唯一的问题是您的yield关键字的位置。将其移动到大括号之前,如下所示:

for (b <- partb.split(",")) yield {
  a + " " + b
}
你需要

yield然后返回逻辑

yield {a}

你现在的做法是for loop,而不是for comprehension,它会对yield关键字大喊大叫,即使不是,它也会返回一个Unit

val pairs = lines.flatMap { line =>
    for (a <- line.split(",")) yield {
      a
    }
  }
除了重新

定位用于交付集合的 yield 之外,如已经公开的那样,请考虑这种可能的重构,我们从 split 中提取前两个条目,

 val pairs = lines.flatMap { line =>
        val Array(a, partb, _*) = line.split(" ")
        for (b <- partb.split(",")) 
          yield a + " " + b
      }

更简洁的是

val pairs = lines.flatMap { line => 
  val Array(a,tail) = line.split(" |,", 2)
  for (t <- tail) yield s"$a $t"
}

我们按 " " 或 "," 拆分并提取头部和尾部,然后我们应用字符串插值以产生所需的结果。