【问题标题】:Combine map-reduce output from different folders into single folder将不同文件夹的 map-reduce 输出合并到单个文件夹中
【发布时间】:2013-11-14 14:11:47
【问题描述】:

我在网格上的 map-reduce 输出分布在多个文件夹中。每个文件的格式都是一样的。每个文件夹都有一堆文件: 示例:/folderpath/folder1/part-r-00001 到 /folderpath/folder1/part-r-00100 ... /folderpath/foldern/part-r-00001 到 /folderpath/foldern/part-r-00100

将内容组合在一起的最简单方法是什么,即将文件聚合到单个文件夹中(我想稍后使用) /folderpath/merged/part-r-0000* ... /folderpath/merged/part-r-000n

我可以想到 pig 脚本,它从每个路径读取输出并读取关系并集,然后转储它们。

还有其他选项/命令吗?

【问题讨论】:

    标签: hadoop mapreduce apache-pig


    【解决方案1】:

    使用 Pig 会非常简单:

    data = LOAD '/folderpath/folder*' USING PigStorage('\n');
    STORE data INTO '/newfolderpath';
    

    您也可以使用 hadoop shell 的 getmerge 函数,但这会将所有内容变成本地磁盘上的单个文件。

    如果文件不是太大,这将是一种将其转换为 HDFS 上的单个文件的简单方法:

    hdfs dfs -cat /folderpath/folder* | hdfs dfs -copyFromLocal - /newfolderpath/file
    

    【讨论】:

    • 是的,即使我之前也想到了猪脚本(如 ques 中所述)。我会去的。谢谢!
    • 我确实在问题中看到了它,但请注意,它可能比您描述的更简单——无需单独阅读输入并执行UNION。只需LOAD 一次,然后STORE。
    • 哦,是的。那要简单得多!不需要联合。再次感谢。
    【解决方案2】:

    老实说,我会使用 hadoop fs 命令编写一个简短的 bash 脚本。

    hadoop fs -mv /source1/somefolder/.* /destination/somefolder
    hadoop fs -mv /source2/somefolder/.* /destination/somefolder
    

    为您需要移动的每个文件夹添加一行。

    【讨论】:

    • 这行不通,因为不同目录下的文件同名。
    • @WinnieNicklaus 只需指定绝对路径。例如,如果您有一个文件夹,请说以下内容:put /user/all/folders/back/to/root/source1/somefolder/.* 对其他文件夹执行相同操作。两个文件夹不可能有相同的绝对路径,这样应该可以解决问题。
    • 对,但是文件本身是同名的,所以不重命名是不能放到同一个文件夹里的。
    • 感谢您的建议。我猜猪脚本解决了重命名问题,所以我同意了!
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多