Scala映射并缩减为数组

时间:2014-11-02 12:43:15

标签: arrays string scala map reduce

我的数据有以下格式

{sentenceA1}{tab}{sentenceB1}  
{sentenceA2}{tab}{sentenceB1}  
{sentenceA3}{tab}{sentenceB2}  
{sentenceA4}{tab}{sentenceB2}  

我希望使用Scala获得与B匹配的句子数组

[sentenceA1, sentenceA2]  
[sentenceA3, sentenceA4]

我尝试了以下

val file1 = file.map(line => line.split("\t"))
val file2 = file1.map(line => (line(1), line(0)))
file2.reduceLeft(_+_).collect

但不成功

3 个答案:

答案 0 :(得分:4)

你可以这样做:

list.map(line => line.split("\t")).
    map(a => a(1) -> a(0)).
    groupBy(_._1).
    mapValues(_.map(_._2))

或者

list.map(line => line.split("\t")).
    groupBy(_(1)).
    mapValues(_.map(_(0)))

你会得到一张地图

{SentenceB1} -> {sentenceA1, sentenceA2}
{SentenceB2} -> {sentenceA3, sentenceA4}

答案 1 :(得分:1)

从数据源中读取您的行(我使用预定义列表来简化示例):

val lines = List(
  "sentenceA1\tsentenceB1",
  "sentenceA2\tsentenceB1",
  "sentenceA3\tsentenceB2",
  "sentenceA4\tsentenceB2"
)

处理每一行:

  • 按标签符号分割。
  • 按第二个令牌分组
  • 通过跳过第二行令牌来简化分组值。

代码如下所示:

val result = lines
  .map(_.split("\t"))
  .groupBy(_(1))
  .mapValues( _.map(_(0)))

答案 2 :(得分:0)

还要考虑一个容器类

case class Text(s:String) {
  val Array(a,b,_*) = s.split("\t") 
}

分割List[String]中的每个元素;从而

for ( (k,xs) <- lines.map(Text(_)).groupBy(_.b) ) yield k -> xs.map(_.a) 

提供所需的关联。