以最快的方式合并大数据集

以最快的方式合并大数据集

我有一个大数据集 ~ 100 GB,有较小的 csv 文件 ~ 100,000。我希望以最快的方式将所有 .csv 文件合并在一起。文件位于两个不同的文件夹中。

  1. 有人建议我创建两个文件,其中包含两个文件夹中文件的文件名,并使用文件名在目录中迭代以附加输出文件,而不是使用 glob ls *。我如何使用 Linux 来实现这一点。我对此还很陌生,如果有人能帮助我,我将不胜感激。
  2. 如果有其他方法,考虑数据集,来实现结果

答案1

如果我理解正确的话,您想从所有文件创建一个(100GB 大小?)文件。在这种情况下,猫可能会这么做:

cat foo1 foo2 bar1 bar2 > newfile

或者在你的情况下

cat folder1/* folder2/* > newfile

这将获取 folder1 和 folder2 中的所有文件并将它们(作为文本)合并到 newfile 中。请注意,cat 只是将文件附加在末尾(即添加行)

然而,这将保留旧文件,因此您将需要两倍的空间,因此您也可以单独处理它们:

for f in folder1/* folder2/* ; do
    cat $f >> newfile && rm $f
done

这样每个文件都会被添加然后删除。

这就是您正在寻找的吗?

答案2

尝试这样的事情:

find /path/to/dir1 /path/to/dir2 -type f -name '*.csv' -exec cat {} + >/path/to/merged.csv

确保不要将合并的文件放在任何一个输入目录中。 :)

答案3

如果所有 CSV 文件具有相同的结构(标头),并放置在 2 级子目录中,您可能需要使用 DuckDB,它可以使用具有 32GB 或64GB 内存

以下是获取所有文件的方法:

CREATE TABLE merge AS SELECT * from read_csv_auto('*/*/*.csv');

快速浏览生成的表格

SUMMARIZE SELECT * from merge;

最后,导出到单个 csv 文件

COPY merge TO 'export.csv' (HEADER, DELIMITER ',');

相关内容