apache-spark-sql - Spark dataframe groupby 列中的唯一值
问题描述
我有以下数据框:
val df = Seq(
("A", 2.0),
("A", 1.5),
("B", 8.0),
("B", 9.0)
).toDF("id", "val")
我想做一个组,每个组基于唯一的ID 1.有一个运行计数,即第一个是0,第二个是1 2.组内的总计数。
应该看起来像
+---+---+---+---+
| id|val|order|count|
+---+---+---+---+
| A|2.0|0 |2
| A|1.5|1 |2
| A|2.5|2 |2
| B|8.0|0|2
| B|9.0|1 |2
+---+---+
我看不到如何使用 spark sql 或函数执行此操作。
解决方案
这是一种方法。
输入数据:
+---+---+
|id |val|
+---+---+
|A |2.0|
|A |1.5|
|A |4.5|
|A |0.5|
|B |8.0|
|B |9.0|
+---+---+
使用 row_number 函数获取订单计数。
val w1 = Window.partitionBy("id").orderBy(lit(null))
df.withColumn("rank", row_number().over(w1))
.withColumn("order", 'rank - 1)
.withColumn("count",count('order).over(w1))
.drop('rank)
.orderBy('id)
.show(false)
两者都给出相同的结果:
+---+---+-----+-----+
|id |val|order|count|
+---+---+-----+-----+
|A |2.0|0 |4 |
|A |1.5|1 |4 |
|A |4.5|2 |4 |
|A |0.5|3 |4 |
|B |8.0|0 |2 |
|B |9.0|1 |2 |
+---+---+-----+-----+
推荐阅读
- java - 无法解决:com.google.firebase:firebase-crashlytics.ktx
- docker - docker 中的 PowerShell 导入模块失败并出现错误“PowerShell 核心版当前不支持模块”
- sockets - 如何让网络外的客户端应用程序连接到您的服务器
- java - 如何在 Java 中创建具有特定名称(无随机数)的 tmp 文件夹?
- elasticsearch - 当变量包含特定字符串时,ansible执行任务
- bash - 如何在 git bash 中显示当前目录和分支
- java - android studio时钟设置时间只显示0或30
- c - 绕原点以外的点旋转?
- excel - 将 Excell 矩阵分解为列表,列在两行中有标签
- ios - 外部链接单击中的 iOS WKWebKit 不起作用