2013-11-14 31 views
1

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

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

我能想到猪脚本,它读取每个路径的输出并读取关系的联合,然后转储它们。

任何其他选项/命令?

回答

1

使用猪会很容易:

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

或者您可以使用Hadoop的外壳的getmerge功能,但是这会变成一切到您的本地硬盘上的一个文件。

如果文件不是太大,这将是一个简单的方法来把它变成对HDFS单个文件:

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

是的,即使我早些时候认为猪脚本(如问题中提到的)。我会和它一起去的。谢谢! – Jay

+0

我在问题中看到了它,但请注意它可能比您描述的更简单 - 无需分别读取输入并执行“UNION”。只需一次'LOAD',然后'STORE'。 –

+0

哦,是的。这简单得多!不需要UNION。再次感谢。 – Jay

1

我老实说只是用hadoop fs命令写一个简短的bash脚本。

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

为每个需要移动的文件夹放入一行。

+0

这不会起作用,因为在不同的目录中的文件具有相同的名称。 –

+1

@WinnieNicklaus只需指定绝对路径。例如,如果你有一个文件夹,可以这样说:'put/user/all/folders/back/to/root/source1/somefolder /.*'对其他人也一样。两个文件夹具有相同的绝对路径是不可能的,所以应该解决问题。 –

+0

正确,但文件本身具有相同的名称,因此无需重命名它们就不能放入同一文件夹。 –

相关问题