[英]How to get value of previous row in scala apache rdd[row]?
我需要遍歷RDD [Row]時從上一行或下一行獲取價值
(10,1,string1)
(11,1,string2)
(21,1,string3)
(22,1,string4)
我需要對第一個值之間的差不大於3的行的字符串求和。第二個值是ID。 因此結果應為:
(1, string1string2)
(1, string3string4)
我嘗試使用groupBy,reduce,進行分區,但仍然無法實現所需的功能。
我正在嘗試做這樣的事情(我知道這是不正確的方式):
rows.groupBy(row => {
row(1)
}).map(rowList => {
rowList.reduce((acc, next) => {
diff = next(0) - acc(0)
if(diff <= 3){
val strings = acc(2) + next(2)
(acc(1), strings)
}else{
//create new group to aggregatre strings
(acc(1), acc(2))
}
})
})
我想知道我的想法是否適合解決這個問題。 尋求幫助!
我認為您可以使用sqlContext通過使用lag函數解決問題
創建RDD:
val rdd = sc.parallelize(List(
(10, 1, "string1"),
(11, 1, "string2"),
(21, 1, "string3"),
(22, 1, "string4"))
)
創建數據框:
val df = rdd.map(rec => (rec._1.toInt, rec._2.toInt, rec._3.toInt)).toDF("a", "b", "c")
注冊您的數據框:
df.registerTempTable("df")
查詢結果:
val res = sqlContext.sql("""
SELECT CASE WHEN l < 3 THEN ROW_NUMBER() OVER (ORDER BY b) - 1
ELSE ROW_NUMBER() OVER (ORDER BY b)
END m, b, c
FROM (
SELECT b,
(a - CASE WHEN lag(a, 1) OVER (ORDER BY a) is not null
THEN lag(a, 1) OVER (ORDER BY a)
ELSE 0
END) l, c
FROM df) A
""")
顯示結果:
res.show
我希望這將有所幫助。
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.