private void getStorageDescriptorInfo(StringBuilder tableInfo, Table table, StorageDescriptor storageDesc) {
    formatOutput("SerDe Library:", storageDesc.getSerdeInfo().getSerializationLib(), tableInfo);
    formatOutput("InputFormat:", storageDesc.getInputFormat(), tableInfo);
    formatOutput("OutputFormat:", storageDesc.getOutputFormat(), tableInfo);
    formatOutput("Compressed:", storageDesc.isCompressed() ? "Yes" : "No", tableInfo);
    if (!table.isNonNative() || table.getStorageHandler() == null ||
        !table.getStorageHandler().supportsPartitionTransform()) {
      // The Iceberg partition transform already contains the bucketing information, and these are not relevant there
      formatOutput("Num Buckets:", String.valueOf(storageDesc.getNumBuckets()), tableInfo);
      formatOutput("Bucket Columns:", storageDesc.getBucketCols().toString(), tableInfo);
    }

    String sortColumnsInfo;
    if (table.isNonNative() && table.getStorageHandler() != null && table.getStorageHandler().supportsSortColumns()) {
      sortColumnsInfo = table.getStorageHandler().sortColumns(table).toString();
    } else {
      sortColumnsInfo = storageDesc.getSortCols().toString();
    }
    formatOutput("Sort Columns:", sortColumnsInfo, tableInfo);

    if (storageDesc.isStoredAsSubDirectories()) {
      formatOutput("Stored As SubDirectories:", "Yes", tableInfo);
    }

    if (storageDesc.getSkewedInfo() != null) {
      if (CollectionUtils.isNotEmpty(storageDesc.getSkewedInfo().getSkewedColNames())) {
        List<String> skewedCoumnNames =
            storageDesc.getSkewedInfo().getSkewedColNames().stream()
              .sorted()
              .collect(Collectors.toList());
        formatOutput("Skewed Columns:", skewedCoumnNames.toString(), tableInfo);
      }

      if (CollectionUtils.isNotEmpty(storageDesc.getSkewedInfo().getSkewedColValues())) {
        List<List<String>> skewedColumnValues =
            storageDesc.getSkewedInfo().getSkewedColValues().stream()
              .sorted(new VectorComparator<String>())
              .collect(Collectors.toList());
        formatOutput("Skewed Values:", skewedColumnValues.toString(), tableInfo);
      }

      Map<List<String>, String> skewedColMap = new TreeMap<>(new VectorComparator<String>());
      skewedColMap.putAll(storageDesc.getSkewedInfo().getSkewedColValueLocationMaps());
      if (MapUtils.isNotEmpty(skewedColMap)) {
        formatOutput("Skewed Value to Path:", skewedColMap.toString(), tableInfo);
        Map<List<String>, String> truncatedSkewedColMap =
            new TreeMap<List<String>, String>(new VectorComparator<String>());
        // walk through existing map to truncate path so that test won't mask it then we can verify location is right
        Set<Entry<List<String>, String>> entries = skewedColMap.entrySet();
        for (Entry<List<String>, String> entry : entries) {
          truncatedSkewedColMap.put(entry.getKey(), PlanUtils.removePrefixFromWarehouseConfig(entry.getValue()));
        }
        formatOutput("Skewed Value to Truncated Path:", truncatedSkewedColMap.toString(), tableInfo);
      }
    }

    if (storageDesc.getSerdeInfo().getParametersSize() > 0) {
      tableInfo.append("Storage Desc Params:").append(LINE_DELIM);
      displayAllParameters(storageDesc.getSerdeInfo().getParameters(), tableInfo);
    }
  }
Formats DESC TABLE results to text format.
ql/src/java/org/apache/hadoop/hive/ql/ddl/table/info/desc/formatter/TextDescTableFormatter.java