我的数据框如下所示
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(row-1)&& f1 == f1(row-1)&& abs(value-value(row-1))的列字段<2时,条件匹配,我想删除上一行。
所以我的桌子应该在下面
type f1 f2 value
1 a xy 11
2 b ab 13
3 c dir 18
3 c ls 30
我认为我们可以利用滞后或超前特征,但不能获得确切的逻辑
答案 0 :(得分:3)
是的,可以使用.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
进行了分区,因此我们不需要检查它们的相等性条件