@InterfaceAudience.Private
  @InterfaceStability.Evolving
  public static void configureOutputStorageHandler(
      HCatStorageHandler storageHandler, Configuration conf, OutputJobInfo outputJobInfo) {
    // TODO replace IgnoreKeyTextOutputFormat with a
    // HiveOutputFormatWrapper in StorageHandler
    TableDesc tableDesc =
        new TableDesc(
            storageHandler.getSerDeClass(),
            storageHandler.getInputFormatClass(),
            IgnoreKeyTextOutputFormat.class,
            outputJobInfo.getTableInfo().getStorerInfo().getProperties());
    if (tableDesc.getJobProperties() == null)
      tableDesc.setJobProperties(new HashMap<String, String>());
    for (Map.Entry<String, String> el : conf) {
      tableDesc.getJobProperties().put(el.getKey(), el.getValue());
    }

    Map<String, String> jobProperties = new HashMap<String, String>();
    try {
      tableDesc
          .getJobProperties()
          .put(HCatConstants.HCAT_KEY_OUTPUT_INFO, HCatUtil.serialize(outputJobInfo));

      storageHandler.configureOutputJobProperties(tableDesc, jobProperties);

      for (Map.Entry<String, String> el : jobProperties.entrySet()) {
        conf.set(el.getKey(), el.getValue());
      }
    } catch (IOException e) {
      throw new IllegalStateException("Failed to configure StorageHandler", e);
    }
  }
  public static Map<String, String> getInputJobProperties(
      HCatStorageHandler storageHandler, InputJobInfo inputJobInfo) {
    TableDesc tableDesc =
        new TableDesc(
            storageHandler.getSerDeClass(),
            storageHandler.getInputFormatClass(),
            storageHandler.getOutputFormatClass(),
            inputJobInfo.getTableInfo().getStorerInfo().getProperties());
    if (tableDesc.getJobProperties() == null) {
      tableDesc.setJobProperties(new HashMap<String, String>());
    }

    Map<String, String> jobProperties = new HashMap<String, String>();
    try {
      tableDesc
          .getJobProperties()
          .put(HCatConstants.HCAT_KEY_JOB_INFO, HCatUtil.serialize(inputJobInfo));

      storageHandler.configureInputJobProperties(tableDesc, jobProperties);

    } catch (IOException e) {
      throw new IllegalStateException("Failed to configure StorageHandler", e);
    }

    return jobProperties;
  }