我有数百万个小的单行s3文件,我希望将它们合并在一起。我已经把s3distcp语法写下来了,但是我发现在合并文件之后,合并后的文件集中没有包含换行符。
我想知道s3distcp是否包含强制换行符的选项,或者是否有其他方法可以在不直接修改源文件(或复制它们并执行相同操作)的情况下完成此操作。
发布于 2015-08-28 08:52:10
如果文本文件以唯一的字符序列开头/结尾,则可以首先使用s3distcp将它们合并为一个文件(我通过将--targetSize设置为一个非常大的数字来完成此操作),然后使用sed和Hadoop streaming添加新行;在下面的示例中,每个文件都包含一个json (文件名都以0开头),并且sed命令会在每个}{实例之间插入一个换行符
hadoop fs -mkdir hdfs:///tmpoutputfolder/
hadoop fs -mkdir hdfs:///finaloutputfolder/
hadoop jar lib/emr-s3distcp-1.0.jar \
--src s3://inputfolder \
--dest hdfs:///tmpoutputfolder \
--targetSize 1000000000 \
--groupBy ".*(0).*"
hadoop jar /home/hadoop/contrib/streaming/hadoop-streaming.jar \
-D mapred.reduce.tasks=1 \
--input hdfs:///tmpoutputfolder \
--output hdfs:///finaloutputfolder \
--mapper /bin/cat \
--reducer '/bin/sed "s/}{/}\n{/g"'发布于 2021-08-28 11:30:10
我有相同的probrem和sed命令中断文件夹结构。
s3distcp只是一个MapReduce程序。
因此,另一种方法是编写一个合并的MapReduce程序,并添加新的行,更多您喜欢的行为。
或者你可以从互联网上搜索这样的MapReduce程序,GitHub存储库,我创建了其中一个github.com/ksmaxeed/s3distcp。
https://stackoverflow.com/questions/31393706
复制相似问题