private List<FileStatus> getManifestFilePaths(HiveConf conf, Path dirPath) throws IOException {
    FileSystem manifestFs = dirPath.getFileSystem(conf);
    List<String> filesKept;
    List<FileStatus> pathsKept = new ArrayList<>();
    try (FSDataInputStream inStream = manifestFs.open(new Path(dirPath, Utilities.BLOB_MANIFEST_FILE))) {
      String paths = IOUtils.toString(inStream, Charset.defaultCharset());
      filesKept = Lists.newArrayList(paths.split(System.lineSeparator()));
    }
    // The first string contains the directory information. Not useful.
    filesKept.remove(0);

    for (String file : filesKept) {
      pathsKept.add(manifestFs.getFileStatus(new Path(file)));
    }
    return pathsKept;
  }
This method generates actual task for conditional tasks. It could be
1. move task only
2. merge task only
3. merge task followed by a move task.
It used to be true for dynamic partition only since static partition doesn't have #3.
It changes w/ list bucketing. Static partition has #3 since it has sub-directories.
For example, if a static partition is defined as skewed and stored-as-directories,
instead of all files in one directory, it will create a sub-dir per skewed value plus
default directory. So #3 is required for static partition.
So, we move it to a method so that it can be used by both SP and DP.
@param conf
@param resTsks
@param trgtSize
@param avgConditionSize
@param mvTask
@param mrTask
@param mrAndMvTask
@param dirPath
@param inpFs
@param ctx
@param work
@param dpLbLevel
@throws IOException
ql/src/java/org/apache/hadoop/hive/ql/plan/ConditionalResolverMergeFiles.java