대규모 데이터 세트를 병합하는 가장 빠른 방법

대규모 데이터 세트를 병합하는 가장 빠른 방법

나는 큰 데이터 세트 ~ 100GB와 더 작은 csv 파일 ~ 100,000을 가지고 있습니다. 모든 .csv 파일을 함께 병합하는 가장 빠른 방법을 원합니다. 파일은 두 개의 다른 폴더에 있습니다.

  1. 누군가는 glob을 사용하는 대신 두 폴더에 있는 파일 이름을 포함하는 두 개의 파일을 만들고 해당 파일 이름을 사용하여 디렉터리를 반복하여 출력 파일을 추가할 것을 제안했습니다 ls *. Linux를 사용하여 어떻게 이를 달성할 수 있습니까? 나는 이것에 대해 매우 새로운 것이며 누구든지 나를 도울 수 있다면 매우 감사하겠습니다.
  2. 다른 방법이 있는 경우 데이터세트를 고려하여 결과를 얻으세요.

답변1

내가 올바르게 이해했다면 모든 파일에서 하나의 (100GB 크기?) 파일을 만들고 싶습니다. 이 경우 고양이는 다음과 같이 할 수 있습니다.

cat foo1 foo2 bar1 bar2 > newfile

아니면 당신의 경우

cat folder1/* folder2/* > newfile

그러면 폴더1과 폴더2의 모든 파일이 가져와서 (텍스트로) 새 파일로 병합됩니다. 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 하위 디렉터리에 배치되는 경우 32GB 또는 64GB 메모리로 사용할 수 있는 DuckDB를 사용하는 것이 좋습니다.

모든 파일을 가져오는 방법은 다음과 같습니다.

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

생성된 테이블을 빠르게 찾아보세요.

SUMMARIZE SELECT * from merge;

마지막으로 단일 csv 파일로 내보내기

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

관련 정보