我有一个文件,其中包含包含以",“分隔的项的行,例如:
2 1,3
3 2,5,7
5 4现在,我想将这个文件flatMap到这样的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
}
}这是正确的吗?
发布于 2015-04-20 04:07:33
感谢您澄清您的代码示例。在您的示例中,唯一的问题是yield关键字的位置。将其移至花括号之前,如下所示:
for (b <- partb.split(",")) yield {
a + " " + b
}发布于 2015-04-20 04:12:06
您需要执行yield,然后执行返回逻辑。
yield {a}您现在所做的是一个for loop,而不是一个for comprehension,它会对yield关键字大喊大叫,即使不是,它也会返回一个Unit。
val pairs = lines.flatMap { line =>
for (a <- line.split(",")) yield {
a
}
}发布于 2015-04-20 06:45:49
除了重新定位交付集合的收益率(正如已经公开的那样)之外,还考虑从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"
}当我们用“”或",“分割并提取头部和尾部时,我们使用字符串插值来产生所需的结果。
https://stackoverflow.com/questions/29739129
复制相似问题