2014-07-22 60 views
2

作爲配置單元查詢的結果,我獲得了多個輸出文件(按排序分配),現在我想合併它們以生成單個文件。所以我試過hdfs dfs -getmerge命令。現在我想了解-getmerge是否在連接之前對文件進行排序,或者它只是連接在一起?hdfs dfs -getmerge命令有什麼作用?

+0

我不認爲'getmerge'排序。它只是連接在一起。 –

+0

@PhaniRahul我認爲它可以分類,如果你看到實現,它會在代碼中執行一個Arrays.sort,並按默認順序升序排列這些文件。但到目前爲止我還沒有測試過它。 –

回答

4
public static boolean More ...copyMerge(FileSystem srcFS, Path srcDir, 
277         FileSystem dstFS, Path dstFile, 
278         boolean deleteSource, 
279         Configuration conf, String addString) throws IOException { 
280 dstFile = checkDest(srcDir.getName(), dstFS, dstFile, false); 
281 
282 if (!srcFS.getFileStatus(srcDir).isDirectory()) 
283  return false; 
284 
285 OutputStream out = dstFS.create(dstFile); 
286  
287 try { 
288  FileStatus contents[] = srcFS.listStatus(srcDir); 
289  Arrays.sort(contents); 
290  for (int i = 0; i < contents.length; i++) { 
291  if (contents[i].isFile()) { 
292   InputStream in = srcFS.open(contents[i].getPath()); 
293   try { 
294   IOUtils.copyBytes(in, out, conf, false); 
295   if (addString!=null) 
296    out.write(addString.getBytes("UTF-8")); 
297     
298   } finally { 
299   in.close(); 
300   } 
301  } 
302  } 
303 } finally { 
304  out.close(); 
305 } 
306  
307 
308 if (deleteSource) { 
309  return srcFS.delete(srcDir, true); 
310 } else { 
311  return true; 
312 } 
313 } 

它排序文件陣列(默認升序),源的hadoop 0.23