scala - Apache Spark根据列的不同值计算列值
问题描述
我正在处理下表,我想根据其他 2 个列的不同值计算一个新列(结果)。
| id1 | id2 | outcome
| 1 | 1 | 1
| 1 | 1 | 1
| 1 | 3 | 2
| 2 | 5 | 1
| 3 | 1 | 1
| 3 | 2 | 2
| 3 | 3 | 3
结果应根据 和 的组合值从 1 开始以递增顺序id1
开始id2
。任何提示如何在 Scala 中实现这一点。row_number
在这种情况下,这里似乎没有用。
这里的逻辑是,对于每个唯一的值,id1
我们将开始用 min( id2
) 对结果进行编号,对应id1
的值被分配为 1。
解决方案
使用Window
函数来俱乐部(partition
)他们first id
,然后order
每个人都partition
基于second id
。
现在您只需要dense_rank
在每个Window
分区上分配一个等级 ( )。
import org.apache.spark.sql.functions._
import org.apache.spark.sql.expressions.Window
df
.withColumn("outcome", dense_rank().over(Window.partitionBy("id1").orderBy("id2")))
推荐阅读
- python - 什么是实现图像跟随光标快速移动的好方法?
- amazon-web-services - 为什么我的 aws-cli 构建在构建时可以在中间容器上工作,但不能在最终容器上工作?
- java - 为什么 startActivityForResult 没有显示在回收器视图适配器中?
- swift - SwiftUI AnyTransition.animation 在使用 .offset 时不会覆盖动画参数
- javascript - 如何从 React Element 获取我的 React 组件对象
- jquery - 选择选项不可选择 - Jquery 自动完成
- android - React-native-maps 和 Geolocation 无法正确获取位置
- php - php switch 语句在字符串中带有通配符
- c# - 如果文件在 UWP 应用程序中发生更改,如何跟踪?
- reactjs - 即使设置了令牌和所有内容,如何解决 401 unAuthorized 错误?并且邮递员在测试时根本没有返回任何问题 -MERN Stack