如何在 DASK_CUDF 中创建唯一 ID 列

How to create unique ID column in DASK_CUDF

如何在所有分区的 dsak cudf 数据框中创建唯一的 id 列 到目前为止,我使用的是以下技术,但如果我将数据增加到超过 10cr 行,则会出现内存错误。

def unique_id(df):
    rag = cupy.arrange(len(df))
    df['unique_id']=rag
    return df
    
part = data.npartitions
data = data.repartitions(npartitions=1)
cols_meta={c:str(data[c].dtype) for c in data.columns}
data = data.map_partitions(lambda df:unique_id(df), meta={**cols_meta,'unique_id'})
data = data.repartitions(npartitions=part)

如有其他方法,或修改代码,请指教。 谢谢你的帮助

你运行进入内存错误的原因是这一步:

data = data.repartitions(npartitions=1)

通过单个分区,您将所有数据强制分配给一个工作人员,这会随着数据集大小的增加而导致内存问题。您要做的是在维护每个分区的同时分配一个唯一标识符,请参阅

I was doing that because wanted to create ids sequentially, till the length data.

其他建议可能会奏效。但是,最简单的方法之一是创建一个值为 1 的临时列并使用 cumsum,如下所示:

import cudf
import dask_cudf
​
df = cudf.DataFrame({
    "a": ["dog"]*10
})
ddf = dask_cudf.from_cudf(df, 3)
​
ddf["temp"] = 1
ddf["monotonic_id"] = ddf["temp"].cumsum()
del ddf["temp"]
​
print(ddf.partitions[2].compute())
     a  monotonic_id
8  dog             9
9  dog            10

不出所料,分区索引2中的两行ID分别为9和10。如果需要索引从0开始,可以减去1。