scala - spark根据新行删除前一行,条件匹配
问题描述
我有如下数据框
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 的列字段时,当这个条件匹配 I想删除上一行。
所以我的桌子应该像下面
type f1 f2 value
1 a xy 11
2 b ab 13
3 c dir 18
3 c ls 30
我在想我们可以利用滞后或领先特征,但没有得到准确的逻辑
解决方案
是的,它可以使用.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
我们不需要检查它们的相等条件
推荐阅读
- configuration - Blazor WASM 托管:客户端中的 index.html --> 服务器中的 Index.cshtml,但不再找到静态文件
- html - 分别将类添加到多个相同的元素
- c# - 在 ef core 中搭建表时是否有一个选项可以跳过生成外键约束?
- google-sheets - 查询特定日期时间的股票价格
- sql-server - 可以在 SQL 视图上应用 Offset Fetch 下一个子句吗?
- python - Py4JError:调用 .saveAsTable 时发生错误
- javascript - 无法在 nodejs 中将 base64 图像上传到 S3 AWS
- r - 在 r 中选择小的 vif 变量
- python - 如何使用 Discord API 和 Python 请求发送图片
- reactjs - how can you store a component inside an object? React