大規模なデータセットをマージする最速の方法

大規模なデータセットをマージする最速の方法

私は大きなデータセット〜100 GBとより小さなcsvファイル〜100,000を持っています。すべての.csvファイルを一緒にマージする最速の方法が欲しいです。ファイルは2つの異なるフォルダにあります。

  1. 誰かがglobを使用する代わりに、2つのフォルダにあるファイル名を含む2つのファイルを作成し、そのファイル名を使用してディレクトリを繰り返し出力ファイルを追加することを提案しましたls *。 Linuxを使ってどのようにこれを達成できますか?私はこれについて非常に新しいものであり、誰でも私を助けることができればとても感謝します。
  2. 他の方法がある場合は、データセットを考慮して結果を得てください。

答え1

私が正しく理解したら、すべてのファイルから1つの(100GBサイズ?)ファイルを作成したいと思います。この場合、猫は次のようにすることができます。

cat foo1 foo2 bar1 bar2 > newfile

またはあなたの場合

cat folder1/* folder2/* > newfile

これにより、フォルダ1とフォルダ2のすべてのファイルがインポートされ(テキストとして)新しいファイルにマージされます。 catはファイルを末尾にのみ追加します(つまり、行を追加します)。

ただし、これにより古いファイルが保持されるため、2倍のスペースが必要になり、個別に処理することもできます。

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のサブディレクトリに配置されている場合は、32 GBまたは64 GBのメモリとして使用できるDuckDBを使用することをお勧めします。

すべてのファイルをインポートする方法は次のとおりです。

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

作成されたテーブルをすばやく見つけます。

SUMMARIZE SELECT * from merge;

最後に、単一のcsvファイルにエクスポート

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

関連情報