如何解决如何在内部窗口进行第一笔订单后保留Spark数据框中的默认订单
我有一个火花数据框,其列为user_id,C1,f1,f2,f3。我想按user id
进行分区/分组,并在组内维护与C1
相关的顺序,这已成功完成,但是在对C1进行排序之后,我想保留其余部分按默认顺序排列。
例如。下面是特定用户的数据框(例如,应用于user_id == 1
的文件管理器)
+--------+-------------+-------------+--------+------------------
|User_id | C1 |f1 |f2 | f3 |
+--------+-------------+-------------+----------------------------
|1 | 6420048 |B1 |TC |19 |
|1 | 21610696 |U0 |PC |135 |
|1 | 21610700 |U0 |IP |135 |
|1 | 28975032 |B1 |CU |20 |
|1 | 46422270 |U3 |CU |73 |
|1 | 68008129 |U1 |RM |135 |
|1 | 68008129 |U1 |CM |135 |
|1 | 68008129 |U1 |CM |129 |
|1 | 68008129 |U1 |PM |130 |
|1 | 68023980 |U1 |PM |129 |
|1 | 68023980 |U1 |CM |135 |
|1 | 68023980 |U1 |PM |135 |
|1 | 68023980 |U1 |PM |130 |
+--------+---------+-------------+--------+---------------------
我现在正在做的是,我正在按user_id
进行分区,并按C1
进行排序。我正在使用的窗口是
Window.partitionBy('user_id').orderBy('C1')
仅是为了解释我的问题,我在下面添加了order
列
df= df.withColumn('order',row_number().over(w))
但是在窗口顺序为C1(针对每个用户)给出正确的顺序之后,但未保留C1顺序作为默认顺序,请注意,对于C1列值68023980
,它现在具有f2序列{{1} },但应该有[CM,PM,PM]
,对于C1 [PM,CM,PM]
,我有f2 68008129
而不是[PM,PM]
。对于其他列(f3)同样。
这里是电流输出的例子
[CM,PM]
由C1订购后如何保持默认订单?
解决方法
按照@Jxc在评论中的指导,我能够在窗口操作之前添加monotonically_increasing_id()来做到这一点。
这里是例子
df= df.withColumn("idx",monotonically_increasing_id())
w= Window.partitionBy("user-id").orderBy('C1','idx')
版权声明:本文内容由互联网用户自发贡献,该文观点与技术仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 dio@foxmail.com 举报,一经查实,本站将立刻删除。