雨翔河
首页
列表
关于
spark行转列和row_number分组排序用法记录
2023-11-28 15:27
> 年纪大了,不记下来容易忘记 ### 1. spark行转列 spark行转列主要就是 `pivot` 和 `agg` 这两个方法的使用,其他的都是非常普通的逻辑。 如下所示就是对 "axxId", "cxxId", "dxxId", "exxId", "fxxd" 这几个字段进行group分组。 然后将结果的eventType字段进行行转列,意味着每一个eventType的值都会作为列。 对于可能出现多个值的flag字段:进行逗号拼接成一个叫flag的字段; 对于可能出现多个值的orderId字段:进行逗号拼接成一个叫allOrderId的字段; 对于可能出现多个值的time字段:取最大的time值。 ``` ** * 对xx信息进行行转列,将不同的eventType转为列 */ private Dataset<Row> findPivotEventSourceDataset(Dataset<EventSource> eventSourceDataset) { return eventSourceDataset .groupBy("axxId", "cxxId", "dxxId", "exxId", "fxxd") .pivot("eventType") .agg( concat_ws(",", collect_list("flag")).alias("flag"), concat_ws(",", collect_list("orderId")).alias("allOrderId"), max("time") ).toDF(); } ``` ### 2. row_number分组排序的用法。 分组查询的用法大致是这样的: `ROW_NUMBER() OVER(PARTITION BY group_id,user_id order by time desc) as row_index` 如下所示,查询的是一个群组用户信息表,从一个群组用户信息表里找到群组id是123和456的所有的用户。 对这些用户查询出 group_id,user_id,time 这些字段的同时还需要一个时间先后的排序字段,因为同一个用户在不同的群组里的加入时间是不一样的。 通过对 group_id,user_id 这两个字段进行分组,然后对结果的 time 字段进行降序排序,得到了row_index的排序 ``` select group_id,user_id,time, ROW_NUMBER() OVER(PARTITION BY group_id,user_id order by time desc) as row_index from xxx_group_user_info where group_id in( '123','456' ) ```
类型:工作
标签:spark,行转列,row_number
Copyright © 雨翔河
我与我周旋久
独孤影
开源实验室