如何在 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。
如何在所有分区的 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。