/** Insert rows through staging phase */ private void insertRowsThroughStaging( TaskAttemptContext taskAttemptContext, InsertNode insertNode, Path finalOutputPath, Path stagingDir, Path stagingResultDir) throws IOException { EvalExprExec evalExprExec = new EvalExprExec(taskAttemptContext, (EvalExprNode) insertNode.getChild()); InsertRowsExec exec = new InsertRowsExec(taskAttemptContext, insertNode, evalExprExec); try { exec.init(); exec.next(); } finally { exec.close(); } FileSystem fs = TajoConf.getWarehouseDir(context.getConf()).getFileSystem(context.getConf()); if (insertNode.isOverwrite()) { // INSERT OVERWRITE INTO // it moves the original table into the temporary location. // Then it moves the new result table into the original table location. // Upon failed, it recovers the original table if possible. boolean movedToOldTable = false; boolean committed = false; Path oldTableDir = new Path(stagingDir, TajoConstants.INSERT_OVERWIRTE_OLD_TABLE_NAME); try { if (fs.exists(finalOutputPath)) { fs.rename(finalOutputPath, oldTableDir); movedToOldTable = fs.exists(oldTableDir); } else { // if the parent does not exist, make its parent directory. fs.mkdirs(finalOutputPath.getParent()); } fs.rename(stagingResultDir, finalOutputPath); committed = fs.exists(finalOutputPath); } catch (IOException ioe) { // recover the old table if (movedToOldTable && !committed) { fs.rename(oldTableDir, finalOutputPath); } } } else { FileStatus[] files = fs.listStatus(stagingResultDir); for (FileStatus eachFile : files) { Path targetFilePath = new Path(finalOutputPath, eachFile.getPath().getName()); if (fs.exists(targetFilePath)) { targetFilePath = new Path( finalOutputPath, eachFile.getPath().getName() + "_" + System.currentTimeMillis()); } fs.rename(eachFile.getPath(), targetFilePath); } } }