apache-spark - Apache Spark - 根据列值添加增量 ID
问题描述
我想根据列值创建一个增量 id。
例如,如果我有下表
-----------------------
| id | value |
-----------------------
| 3 | a |
| 2 | a |
| 1 | b |
| 4 | b |
| 5 | c |
-----------------------
我想创建一个具有随机或增量标识符的新列,该标识符对于列值是唯一的,如下所示:
-----------------------------------------------
| id | value | new_id |
-----------------------------------------------
| 3 | a | 1 |
| 2 | a | 1 |
| 1 | b | 2 |
| 4 | b | 2 |
| 5 | c | 3 |
-----------------------------------------------
除了使用 distinct 并稍后加入之外,还有其他选择吗?
谢谢!
解决方案
您可以在 Window 中使用 dense_rank() 并按值排序,但是这会将所有数据移动到单个分区,因此对于大型 DataSet 会表现不佳。
val window = Window.orderBy($"value")
df.withColumn("new_id", dense_rank.over(window))
编辑 - 似乎使用虚拟分区可确保数据被打乱到 spark.sql.shuffle.partitions 分区
val window = Window.partitionBy(lit(0)).orderBy($"value")
推荐阅读
- angular - 如何仅使用 Angular Material 使我的应用程序响应?
- javascript - 使用 document.querySelector 应用样式
- javascript - 使用 MySQL 在 Node.js 中实现 async/await 和 Promise
- ruby-on-rails - 引用两个模型的模型的 Rails 迁移
- ajax - Ajax post call 似乎工作,仍然抛出错误?
- javascript - 如何使用 javascript 修复 div 元素内的鼠标指针?
- opencv - 在 OpenCv 中使用 SolvePnP 时的断言错误
- c# - Newtonsoft.Json System.InvalidOperationException:不允许同步操作
- sql - 查找给定课程的所有先决条件
- python - 在 django 调试模式下,浏览器中未显示的正确 url 列表