我有大约 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=';')
它可以工作,但也占用了太多的系统内存。所以我真的没有选择,如果有人能帮助我解决这个问题,我会非常高兴。因为我将来可能会有更大的文件,并且想知道如何处理它们。
提前致谢!
您可以在 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)
。