scala - 如何根据 spark scala 中的条件获取结果
问题描述
我有以下数据框
+---+-----+---+
| ID|Month|val|
+---+-----+---+
| M1| Jan| 10|
| M1| Feb| 20|
| M1| Mar| 30|
| M2| Jan| 22|
| M2| Feb| 33|
| M3| Jan| 30|
| M3| Feb| 30|
| M4| Jan| 40|
| M4| Feb| 39|
+---+-----+---+
由...制作 -
val df1=Seq(
("M1","Jan","10"),
("M1","Feb","20"),
("M1","Mar","30"),
("M2","Jan","22"),
("M2","Feb","33"),
("M3","Jan","30"),
("M3","Feb","30"),
("M4","Jan","40"),
("M4","Feb","39")
).toDF("ID","Month","val")
我必须找出那些 val 小于或等于前几个月的行。
预期结果 -
+---+-----+---+-------+
| ID|Month|val| Res|
+---+-----+---+-------+
| M1| Jan| 10| true |
| M1| Feb| 20| true |
| M1| Mar| 30| true |
| M2| Jan| 22| true |
| M2| Feb| 33| true |
| M3| Jan| 30| true |
| M3| Feb| 30| false |
| M4| Jan| 40| true |
| M4| Feb| 39| false |
+---+-----+---+-------+
解决方案
您可以使用lag
按转换为日期的月份排序的窗口:
import org.apache.spark.sql.expressions.Window
val df2 = df1.withColumn(
"Res",
coalesce(
$"val" > lag($"val", 1).over(Window.partitionBy("ID").orderBy(to_date($"Month", "MMM"))),
lit(true)
)
).orderBy($"ID", to_date($"Month", "MMM"))
df2.show
+---+-----+---+-----+
| ID|Month|val| Res|
+---+-----+---+-----+
| M1| Jan| 10| true|
| M1| Feb| 20| true|
| M1| Mar| 30| true|
| M2| Jan| 22| true|
| M2| Feb| 33| true|
| M3| Jan| 30| true|
| M3| Feb| 30|false|
| M4| Jan| 40| true|
| M4| Feb| 39|false|
+---+-----+---+-----+
推荐阅读
- python - 如何从 PdfPages 将 pandas 数据框保存到现有的 pdf 中
- python - 将 numpy 数组列表转换为单个 numpy 数组的最直接方法是什么?
- opalvoip - 如何在 Ubuntu 18 上构建 libOpal
- appium - 动作类抛出错误无法代理
- android - 在 MVP 模型和 dagger2 中访问存储库到 Fragment Presenter
- javascript - 在 JavaScript 中构建数组数组的函数式方法
- javascript - 如何使用 ajax 将 SQL 位变量显示为字符串
- c - 为什么 C getopt_long_only() 不为未知选项设置 optopt?
- shell - 从 AWS cli 调用 lambda 函数
- sql - SQL:如何返回一个列,该列是另一列返回的行的聚合?