public static List<List<String>> uniqueSkewedValueList(List<List<String>> values) {
      if ((values == null) || (values.size() == 0)) {
        return null;
      }

      // skewed value has the same length.
      List<List<String>> result = new ArrayList<List<String>>();
      for (int i = 0; i < values.get(0).size(); i++) {
        result.add(new ArrayList<String>());
      }

      // add unique element to list per occurrence order in skewed value.
      // occurrence order in skewed value doesn't matter.
      // as long as we add them to a list, order is preserved from now on.
      for (List<String> value : values) {
        for (int i = 0; i < value.size(); i++) {
          if (!result.get(i).contains(value.get(i))) {
            result.get(i).add(value.get(i));
          }
        }
      }

      return result;
    }
Convert value to unique skewed value list. It is used in
{@link ListBucketingPrunerUtils#evaluateExprOnCell}

For example:

1. skewed column (list): C1, C2, C3
2. skewed value (list of list): (1,a,x), (2,b,x), (1,c,x), (2,a,y)

Input: skewed value (list of list): (1,a,x), (2,b,x), (1,c,x), (2,a,y)
Output: Unique skewed value for each skewed column (list of list):
(1,2), (a,b,c), (x,y)

Output matches order of skewed column. Output can be read as:
C1 has unique skewed value list (1,2,)
C2 has unique skewed value list (a,b,c)
C3 has unique skewed value list (x,y)

@param values
         skewed value list
@return a list of unique skewed value lists
ql/src/java/org/apache/hadoop/hive/ql/optimizer/listbucketingpruner/ListBucketingPruner.java