如何获取scala Apache rdd [row]中前一行的值?

时间:2019-09-09 21:25:21

标签: scala apache-spark rdd

在遍历RDD [Row]时,我需要从上一行或下一行获取价值

(1, string1string2)
(1, string3string4)

我需要对第一个值之间的差不大于3的行的字符串求和。第二个值是ID。所以结果应该是:

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))
        }
      })
    })

我尝试使用groupBy,reduce,进行分区,但仍然无法实现所需的功能。

我正在尝试制作类似的东西(我知道这是不正确的方式):

v-data-table

我想知道我的想法是否适合解决这个问题。 寻找帮助!

1 个答案:

答案 0 :(得分:0)

我认为您可以使用sqlContext通过使用lag函数来解决问题

创建RDD:

val rdd = sc.parallelize(List(
(10, 1, "string1"),
(11, 1, "string2"),
(21, 1, "string3"),
(22, 1, "string4"))
)

创建DataFrame:

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

我希望这会有所帮助。