>我有一个文件,其中包含包含用"," 分隔的项目的行例如:
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"
}
我们按 " " 或 "," 拆分并提取头部和尾部,然后我们应用字符串插值以产生所需的结果。