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