如何在DuckDB中实现monotonically_increasing_id()功能?
在DuckDB中实现自动生成递增ID的替代方案
DuckDB并没有PySpark的monotonically_increasing_id()函数,你可以用以下两种方法实现需求:
方案1:使用DuckDB内置的窗口函数row_number()
修改你的SQL查询,用row_number() OVER ()替代PySpark的函数,它会为结果集的每一行分配唯一的递增整数ID:
SQL_QUERY_SRC_JOIN = """ SELECT row_number() OVER () AS col1, a.* FROM ( SELECT col2 FROM df_cust UNION SELECT col3 FROM df_branch UNION SELECT col4 FROM df_rep ) AS a ORDER BY col1 """ src_df = duckdb.sql(SQL_QUERY_SRC_JOIN).pl()
注意:row_number()生成的是连续的整数ID,而PySpark的monotonically_increasing_id()生成的是64位非连续整数,如果只是需要唯一递增的标识,这个方案完全满足需求。
方案2:直接用Polars生成索引列
既然你最终要得到Polars DataFrame,也可以跳过DuckDB SQL,直接用Polars的内置方法处理:
# 合并三个Polars DataFrame的指定列 combined_df = df_cust.select('col2').union(df_branch.select('col3')).union(df_rep.select('col4')) # 添加从0开始的递增ID列(若要从1开始,添加offset=1参数) src_df = combined_df.with_row_index(name='col1').sort('col1')
这种方法更高效,不需要在DuckDB和Polars之间来回转换数据。
内容的提问来源于stack exchange,提问作者Balaji Venkatachalam
相关产品推荐
相关产品推荐

