apache-spark - 根据 Spark 中其他列的组值在新列上生成随机值
问题描述
我们有以下数据框:
------
G1|G2|
1 | 1|
1 | 1|
1 | 2|
2 | 1|
2 | 2|
2 | 3|
所以基于列G1
,G2
我们有 5 个组:1-1、1-2、2-1、2-2、2-3。
我想创建isSelected
具有以下规则的新列:每个组都属于 N 行,我想随机化至少 50% 的行将具有价值1
,0
否则。每个组必须至少有 1 行,isSelected = 1
并且 [1
行数] - [0
行数] 应小于 1
以下是一个有效的世代:
----------------
G1|G2|isSelected
1 | 1|1
1 | 1|0
1 | 2|1
2 | 1|1
2 | 2|1
2 | 3|1
以下无效:
----------------
G1|G2|isSelected
1 | 1|1
1 | 1|1 --> Not OK, this group has 2 1-row and 0 0-row.
1 | 2|1
2 | 1|1
2 | 2|1
2 | 3|0 --> Not OK, this group has 0 1-row.
如何直接在 Spark 中完成?
解决方案
可以使用窗口函数“row_number”为组中的每一行分配序列,并且“sequence/2”余数可用于“isSelected”列:
val allColumnsWindow = Window.partitionBy("G1","G2").orderBy("G2")
df
.withColumn("rn",row_number().over(allColumnsWindow))
.withColumn("isSelected", $"rn" % 2)
.drop("rn")
推荐阅读
- javascript - 允许登录其字段“IsApproved 为 true”的安全规则
- python - 从列表中返回最大序列
- javascript - 如何将 patchValues() 与
在 (keyup.enter) 事件绑定上 - firebase - Firebase Node API v9 访问 functions.config() 和 functions.logger()?
- python-3.x - 如何键入多索引熊猫数据框 Python3.8+ 的提示?
- jenkins - Jenkins 中某些通道的 Slack 插件连接失败
- javascript - Three.js - 如何按调用/加载的顺序加载和存储模型?
- opengl - 如何测试 OpenGL 应用程序是否适用于某些特定的 OpenGL 版本?
- algorithm - 具有 3 个约束的变量消除
- powershell - 错误:不允许使用别名,因为别名已存在