我有一个 bash 文件,它需要一个大的 csv 并根据此博客将 csv 分割成较小的 csvhttps://medium.com/swlh/automatic-s3-file-splitter-620d04b6e81c。它工作得很好,因为速度很快,无需下载 csv,这对于 lambda 来说非常有用。分割后的 csv 没有标题,只有原始 csv。这对我来说是个问题,因为我无法使用 apache pyspark 读取一组带有标题行的文件和许多其他没有标题行的文件。
我想为每个写入的 csv 添加标题行。
代码的作用
内文件
- “s3 //测试桶/test.csv”
OUTFILES - 分成 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”
您可以使用 dash 参数将文件流式传输到标准输入 (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\""))