整数标准上的Spark Scala序列拆分

时间:2015-11-06 22:35:54

标签: scala apache-spark

我在Spark上使用Scala,需要帮助根据集合中的特定值拆分一系列集合。

以下是一个例子:

val sets = Array(Seq(Set("A", 15,20 ),Set("B", 17, 21), Set("C", 22,34)),
  Seq(Set("D", 15, 20),Set("E", 17, 21), Set("F", 21, 23), Set("G", 25,34)))

我试图根据以下条件拆分数组中的每个序列:每个集合中的第一个整数位于同一序列中其他集合中的两个整数之间,并返回组合在一起的集合的字符值。

因此,对于第一个序列,您可以看到我们在第一个集合和第二个集合17和21中有整数15和20.所以这些集合将组合在一起,因为17在15到20之间,第三个集合不会孤单。

在第二个序列中,我有15和20重叠17和21.而17和21将与21和23重叠,然后最后一组将保持不变。

基本上我想让它返回Set(A, B)Set(C)Set(D, E)Set(D, F)Set(G)

我意识到这不是很好的措辞,但如果有人能给我一只非常感激的话。

1 个答案:

答案 0 :(得分:1)

正如zero323所指出的那样,Set("A", 15,20 )可能不应该是一个集合。我建议将其转换为案例类:

case class Item(name: String, start: Int, end: Int) {
  val range = Range.inclusive(start, end)    
}

通过这门课程,如果你正确地描述了你的问题,可以这样解决:

sets.map { seq =>                           
  seq.foldLeft(Vector[Vector[Item]]()) { (list, item) =>
    list.lastOption match {                         
      case Some(lastGroup) if lastGroup.last.range.contains(item.start) => 
        list.init :+ (lastGroup :+ item) 
      case _ =>      
        list :+ Vector(item) 
    }                     
  }.map(l => l.map(i => i.name).toSet)
}.flatten