需要在Spark Scala中不使用groupby生成序列ID

时间:2016-03-30 02:35:48

标签: scala apache-spark

我想生成数字序列列(Seq_No),因为Product_IDs在表中发生了变化。在我的输入表中,我只有Product_ID,并希望输出Seq_No。我们不能在SQL中使用GropuBy或Row Number,因为Scala不支持。

    Logic : Seq_No = 1 
            for(i = 2:No_of_Rows)
             when Product_IDs(i) != Product_IDs(i-1) then Seq_No(i) = Seq_No(i-1)+1
             Else Seq_No(i) = Seq_No(i-1)
             end as Seq_No

Product_IDs Seq_No
ID1           1
ID1           1
ID1           1
ID2           2
ID3           3
ID3           3
ID3           3
ID3           3
ID1           4
ID1           4
ID4           5
ID5           6
ID3           7
ID6           8
ID6           8
ID5           9
ID5           9
ID4          10

所以我想生成Seq_No,因为当前的Product_Id不等于之前的Product_Ids。输入表只有一列Product_IDs,我们希望Product_IDs与Seq_No一起使用Spark Scala。

1 个答案:

答案 0 :(得分:0)

我可能只想编写一个函数来生成序列号:

scala> val getSeqNum: String => Int = {
  var prevId = ""
  var n = 0
  (id: String) => {
    if (id != prevId) {
      n += 1
      prevId = id
    }
    n
  }
}
getSeqNum: String => Int = <function1>

scala> for { id <- Seq("foo", "foo", "bar") } yield getSeqNum(id)
res8: Seq[Int] = List(1, 1, 2)

更新:

我不太清楚你想要什么,Nikhil,我不是Spark专家,但我想你想要像

这样的东西
val rrd = ???  // Hopefully you know how to get the RRD
for {
  (id, col2, col3) <- rrd  // assuming the entries are tuples
  seqNum = getSeqNum(id)
} yield ???  // Hopefully you know how to transform the entries