将不同文件夹的 map-reduce 输出合并到单个文件夹中
Posted
技术标签:
【中文标题】将不同文件夹的 map-reduce 输出合并到单个文件夹中【英文标题】:Combine map-reduce output from different folders into single folder 【发布时间】: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 脚本,它从每个路径读取输出并读取关系并集,然后转储它们。
还有其他选项/命令吗?
【问题讨论】:
【参考方案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/.*
对其他文件夹执行相同操作。两个文件夹不可能有相同的绝对路径,这样应该可以解决问题。
对,但是文件本身是同名的,所以不重命名是不能放到同一个文件夹里的。
感谢您的建议。我猜猪脚本解决了重命名问题,所以我同意了!以上是关于将不同文件夹的 map-reduce 输出合并到单个文件夹中的主要内容,如果未能解决你的问题,请参考以下文章