искра удалить предыдущую строку на основе новой строки с некоторыми условиями соответствия - PullRequest
0 голосов
/ 13 октября 2018

У меня есть датафрейм, как показано ниже

type   f1   f2  value 

1      a    xy    11

2      b    ab    13

3      c    na    16

3      c    dir    18

3      c    ls    23

Мне нужно удалить предыдущую строку, некоторые из условий совпадают со следующей строкой,

, например, из таблицы выше, когда поля столбцаtype == type (row-1) && f1 == f1 (row-1) && abs (value - value (row-1)) <2, когда это условие соответствует, я хочу удалить предыдущую строку. </p>

так что моя таблица должна выглядеть так:

type   f1   f2  value 

1      a    xy    11

2      b    ab    13

3      c    dir   18

3      c    ls    30 

Я думаю, что мы можем использовать функции задержки или опережения, но не можем получить точную логику

1 Ответ

0 голосов
/ 13 октября 2018

Да, это можно сделать с помощью .lead()

import org.apache.spark.sql.expressions._
//define window specification
val windowSpec = Window.partitionBy($"type",$"f1").orderBy($"type")

val inputDF = sc.parallelize(List((1,"a","xy",11),(2,"b","ab",13),(3,"c","na",16),(3,"c","dir",18),(3,"c","ls",23))).toDF("type","f1","f2","value")

inputDF.withColumn("leadValue",lead($"value",1).over(windowSpec))
  .withColumn("result", when(abs($"leadValue" - $"value") <= 2, 1).otherwise(0)) //check for condition
  .filter($"result" === 0)      //filter the rows
  .drop("leadValue","result") //remove additional columns
  .orderBy($"type")
  .show

Вывод:

+----+---+---+-----+
|type| f1| f2|value|
+----+---+---+-----+
|   1|  a| xy|   11|
|   2|  b| ab|   13|
|   3|  c|dir|   18|
|   3|  c| ls|   23|
+----+---+---+-----+

Здесь, как мы уже делим на type & f1, нам не нужнопроверить их условие равенства

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...