【问题标题】:How to create unique ID column in DASK_CUDF如何在 DASK_CUDF 中创建唯一 ID 列
【发布时间】:2021-05-19 08:37:15
【问题描述】:

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

如果有其他方法,或者代码有任何修改,请提出建议。 谢谢你的帮助

【问题讨论】:

    标签: python dask cudf


    【解决方案1】:

    我这样做是因为想按顺序创建 id,直到长度数据。

    其他建议可能会奏效。但是,最简单的方法之一是创建一个值为 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。

    【讨论】:

    • 看起来不错,虽然我现在无法在我的机器上测试它。
    【解决方案2】:

    你遇到内存错误的原因是这一步:

    data = data.repartitions(npartitions=1)
    

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

    【讨论】:

    • 我这样做是因为想按顺序创建 id,直到长度数据。我尝试使用 map_partitions 的相同功能,然后在每个分区中它将从 0 开始,因为我会得到重复。我尝试了该解决方案,它正在创建随机 ID。是否有任何选项可以创建顺序 ID 直到数据帧的长度。
    • 我提供的链接创建了顺序 ID。
    • 谢谢。它在最近的 dask 版本中完美运行。但在 dask_cudf 0.18 版中,它没有按预期工作。
    • 如果我有重复的索引 den 我不会得到唯一的 ID 对吗?
    猜你喜欢
    • 2021-10-12
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2010-11-26
    • 1970-01-01
    • 2022-11-28
    • 1970-01-01
    相关资源
    最近更新 更多