이 블로그에 따라 큰 csv를 가져와 csv를 더 작은 csv로 분할하는 bash 파일이 있습니다.https://medium.com/swlh/automatic-s3-file-splitter-620d04b6e81c. 속도가 빠르고 csv를 다운로드할 필요가 없기 때문에 훌륭하게 작동합니다. 이는 람다에 적합합니다. 분할된 CSV에는 헤더가 없고 원본 CSV만 있습니다. Apache pyspark를 사용하여 헤더 라인이 있는 파일 세트와 헤더 라인이 없는 다른 많은 파일을 읽을 수 없기 때문에 이것이 문제가 됩니다.
작성된 각 CSV에 헤더 행을 추가하고 싶습니다.
코드의 기능
내부 파일
- "s3 //테스트 버킷/test.csv"
아웃파일 - 300K 라인으로 분할
- "s3//dest-test-bucket/test.00.csv"
- "s3//dest-test-bucket/test.01.csv"
- "s3//dest-test-bucket/test.02.csv"
- "s3//dest-test-bucket/test.03.csv"
대시 매개변수를 사용하여 파일을 표준 입력(stdin) 또는 표준 출력(stdout)으로 스트리밍할 수 있습니다.
열린 파일 스트림에서 이것이 가능한지 모르겠습니다.
유효한 원본 코드
LINECOUNT=300000
INFILE=s3://"${S3_BUCKET}"/"${FILENAME}"
OUTFILE=s3://"${DEST_S3_BUCKET}"/"${FILENAME%%.*}"
FILES=($(aws s3 cp "${INFILE}" - | split -d -l ${LINECOUNT} --filter "aws s3 cp - \"${OUTFILE}_\$FILE.csv\" | echo \"\$FILE.csv\""))
이것은 나가는 파일 스트림에 변수를 추가하려고 시도했지만 작동하지 않습니다.
LINECOUNT=300000
INFILE=s3://"${S3_BUCKET}"/"${FILENAME}"
OUTFILE=s3://"${DEST_S3_BUCKET}"/"${FILENAME%%.*}"
HEADER=$(aws s3 cp "${INFILE}" - | head -n 1)
FILES=($(aws s3 cp "${INFILE}" - | split -d -l ${LINECOUNT} --filter "echo ${HEADER}; aws s3 cp - \"${OUTFILE}_\$FILE.csv\" | echo \"\$FILE.csv\""))