在scala中的flatMap,编译器说它错了

时间:2015-04-20 04:01:05

标签: scala apache-spark

我有一个文件,其中包含的行包含以“,”分隔的项目 例如:

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
        }
      }

这是对的吗?

3 个答案:

答案 0 :(得分:2)

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

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

答案 1 :(得分:1)

你需要做yield然后返回逻辑

yield {a}

您现在的方式是for loop,而不是for comprehension,它会对yield关键字大喊大叫,即使不是,也会返回Unit }

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

答案 2 :(得分:1)

除了已经公开的交付集合的产量重新定位之外,请考虑这种可能的重构,我们从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"
}

我们用“”或“,”分割并提取头部和尾部,然后我们应用字符串插值来产生所需的结果。