我是pyspark的新手并试图从聚合函数的结果中显示所有行,以便在其他计算中使用这些列。
我有2个数据帧
数量
+ ---- + ----- + ----- + ---- +
| ID |尺寸|
+ ---- + -----
| 1 | 3 |
| 1 | 3 |
| 1 | 3 |
| 2 | 6 |
| 2 | 6 |
+ ---- + -----
价格
+ ---- + ----- + ----- + ---- +
| ID | perf |尺寸|日期|
+ ---- + ----- + ----- + ---- +
| 1 | 7.5 | 3 | 2017-01-03 |
| 1 | 39 | 3 | 2012-01-06 |
| 1 | 12 | 3 | 2009-04-01 |
| 1 | 28 | 3 | 2011-11-08 |
| 1 | 9 | 3 | 2012-09-12 |
| 1 | 15 | 3 | 2017-07-03 |
| 1 | 10 | 3 | 2017-05-03 |
| 1 | 33 | 3 | 2012-03-08 |
| 2 | 53 | 6 | 2012-03-08 |
+ ---- + ----- + ----- + ---- +
我已经能够在2个数据帧上执行连接,并且还按日期排序,以获取每个ID的开始和结束日期。
这就是我所做的
dJoin = quantity.join(price, (quantity.id==price.id) & (quantity.size==price.size)). select(quantity.id, quantity.size, price.perf, price.date)
part_asc = Window.partitionBy(dJoin.id).orderBy((dJoin.date).desc())
part_desc = Window.partitionBy(dJoin.id).orderBy((dJoin.date).asc())
add_cols = dJoin.withColumn("rnASC", row_number().over(part_asc)) \
.withColumn("rnDESC", row_number().over(part_desc))
以上代码给出了以下内容:
+ ---- + ----- + ----- + ---- +
| ID | perf |尺寸|日期| rnASC | rnDESC
+ ---- + ----- + ----- + ---- + ------- + ----
| 1 | 7.5 | 3 | 2017-01-03 | 1 | 8
| 1 | 39 | 3 | 2012-01-06 | 2 | 7
| 1 | 12 | 3 | 2009-04-01 | 3 | 6
| 1 | 28 | 3 | 2011-11-08 | 4 | 5
| 1 | 9 | 3 | 2012-09-12 | 5 | 4
| 1 | 15 | 3 | 2017-07-03 | 6 | 3
| 1 | 10 | 3 | 2017-05-03 | 7 | 2
| 1 | 33 | 3 | 2012-03-08 | 8 | 1
| 2 | 53 | 6 | 2012-03-08 | 1 | 1
+ ---- + ----- + ----- + ---- +
当 rnASC 和 rnDESC 都为1时,我试图获取 perf 列,然后执行两者中的不同操作。
目前,我可以显示两个值均为1但无法访问性能
add_cols.groupBy(add_cols.id).agg((min('rnASC')), min('rnDESC')).show()
上面只显示了 ID ,但我认为我需要与 id 相对应的性能以便做差分计算。
这是为了你的帮助!