以一列方式清除约 100GB csv 重复项的最快速、最有效的方法

问题描述 投票:0回答:1

我有大约 100GB 的 csv 文件,其中包含以下列:

sex;name;dob;hash

此文件是在对另一个 .csv 文件进行一些处理后创建的。而且它可以包含元组,这就是为什么有这个哈希列。我需要的是根据“哈希”列从该文件中删除重复项并将新数据保存到 output.csv 中。

我既追求速度又追求效率。我尝试使用 Polars 上传到 PostgreSQL,然后仅选择唯一的列:

    df.write_database(
        table_name=input_table,
        connection=connection_for_db,
        if_table_exists='append'
    )

    SELECT sex, name, dob
      FROM (
          SELECT DISTINCT ON (hash)
              hash, sex, name, dob
          FROM input_table
      ) with_hash

但是上传到数据库太慢了! 我尝试使用 Polars LazyFrame 读取此 .csv:

    df = pl.scan_csv(input.csv, separator=';', infer_schema_length=0,
                     ignore_errors=True, rechunk=False)
    uni_df = df.unique(subset=['hash']).drop('hash')
    uni_df.sink_csv(output.csv, separator=';', maintain_order=False)

但是 python 占用了太多内存,导致我的电脑内存不足,脚本被杀死。我尝试做的最后一件事是使用 Dask 加载和清理数据:

    ddf = dsk.read_csv(input.csv, sep=';')
    ddf = ddf.drop_duplicates(subset=['hash'])
    ddf.to_csv(output.csv, sep=';')

它可以工作,但也占用了太多的系统内存。所以我真的没有选择,如果有人能帮助我解决这个问题,我会非常高兴。因为我将来可能会有更大的文件,并且想知道如何处理它们。

提前致谢!

python postgresql csv dask python-polars
1个回答
0
投票

您可以在 Excel 等中使用

=UNIQUE
,请参阅此示例:如果单元格名称已存在于 Excel 的上一行中,则删除行

这将清空重复的单元格,然后您可以删除给定单元格为空的所有行,请参阅https://superuser.com/questions/474530/excel-delete-row-if-cell-in-certain-column-是空白

如果这对您来说不可行,那么您可以插入数据库,但我不会使用不同的值来执行此操作。相反,我会在散列上的数据库表中创建一个

unique
索引,并执行插入操作,当违反约束时,该插入操作不会执行任何操作。示例:

INSERT INTO target_table (hash, sex, name, dob) 
SELECT 'myhash', 'M', 'John', '2020-01-01 0:00:0'
FROM input_table
ON CONFLICT (field_one) DO NOTHING;

如果基于这三个字段计算哈希,那么您可能不需要哈希,而是目标数据库中的

unique(sex, name, dob)

© www.soinside.com 2019 - 2024. All rights reserved.