我想生成数字序列列(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。
答案 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