【问题标题】:How to get s3distcp to merge with newlines如何让 s3distcp 与换行符合并
【发布时间】:2015-07-13 21:20:21
【问题描述】:

我有数百万个小的单行 s3 文件,我希望将它们合并在一起。我有 s3distcp 语法,但是,我发现在合并文件后,合并集中不包含换行符。

我想知道 s3distcp 是否包含任何强制换行的选项,或者是否有其他方法可以在不直接修改源文件(或复制它们并执行相同操作)的情况下完成此操作

【问题讨论】:

  • 看起来您需要在单行文件本身中添加新行。这不是一种选择吗?
  • 是的,我希望避免这种情况并直接从 s3distcp 获得“免费”,但不幸的是,我似乎无法避免这种情况

标签: hadoop amazon-s3 hadoop-streaming amazon-emr


【解决方案1】:

如果您的文本文件以唯一的字符序列开始/结束,您可以先使用 s3distcp 将它们合并到一个文件中(我通过将 --targetSize 设置为一个非常大的数字来做到这一点),然后使用 @ 987654323@ 使用 Hadoop 流添加新行;在以下示例中,每个文件都包含一个 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"'

【讨论】:

    【解决方案2】:

    我有同样的问题,sed 命令会破坏文件夹结构。
    s3distcp 只是 MapReduce 程序。
    所以另一种方法是编写一个合并和添加新行的 MapReduce 程序,你喜欢更多的行为。

    或者你可以从互联网、GitHub 存储库中搜索这样的 MapReduce 程序,我创建了其中一个 github.com/ksmaxeed/s3distcp。

    【讨论】:

      猜你喜欢
      • 2017-09-25
      • 2017-11-03
      • 2020-07-26
      • 2019-12-05
      • 2016-11-17
      • 1970-01-01
      • 2018-05-08
      • 1970-01-01
      • 2019-03-01
      相关资源
      最近更新 更多