Pyspark如何为event列值相同的行分配相同ID且保留原行顺序?
解决方案
以下是不同场景下的实现方法,均满足同event对应唯一id、保留原始行顺序的要求:
SQL 实现
优先用窗口函数实现,不需要修改原表即可查询到目标结果:
SELECT DENSE_RANK() OVER(ORDER BY MIN(id) OVER (PARTITION BY event)) AS new_id, event FROM your_table;
如果需要修改原表存储结果,先新增字段再更新即可:
-- 新增存储新id的列 ALTER TABLE your_table ADD COLUMN new_id INT; -- 给新列赋值 UPDATE your_table t1 SET new_id = ( SELECT DENSE_RANK() OVER(ORDER BY MIN(t2.id)) FROM your_table t2 WHERE t2.event = t1.event GROUP BY t2.event );
上述逻辑会按照event第一次出现的顺序分配连续的唯一id,不受event本身的字符排序规则影响。
Python Pandas 实现
处理内存中的数据集时,用factorize方法一行代码即可实现:
import pandas as pd # df 为你的原始数据集对象 df["new_id"] = pd.factorize(df["event"], sort=False)[0] + 1
sort=False参数保证按event首次出现的顺序分配id,不会打乱原始行的排列顺序。
内容的提问来源于stack exchange,提问作者question1234
相关产品推荐
相关产品推荐

