code: public <K> UnsortedGrouping<T> groupBy(KeySelector<T, K> keyExtractor) {
  		TypeInformation<K> keyType = TypeExtractor.getKeySelectorTypes(keyExtractor, getType());
  		return new UnsortedGrouping<>(this, new Keys.SelectorFunctionKeys<>(clean(keyExtractor), getType(), keyType));
  	}
docs: Groups a {@link DataSet} using a {@link KeySelector} function.
  The KeySelector function is called for each element of the DataSet and extracts a single
  key value on which the DataSet is grouped.
  
  <p>This method returns an {@link UnsortedGrouping} on which one of the following grouping transformation
  can be applied.
  <ul>
  <li>{@link UnsortedGrouping#sortGroup(int, org.apache.flink.api.common.operators.Order)} to get a {@link SortedGrouping}.
  <li>{@link UnsortedGrouping#aggregate(Aggregations, int)} to apply an Aggregate transformation.
  <li>{@link UnsortedGrouping#reduce(org.apache.flink.api.common.functions.ReduceFunction)} to apply a Reduce transformation.
  <li>{@link UnsortedGrouping#reduceGroup(org.apache.flink.api.common.functions.GroupReduceFunction)} to apply a GroupReduce transformation.
  </ul>
  
  @param keyExtractor The KeySelector function which extracts the key values from the DataSet on which it is grouped.
  @return An UnsortedGrouping on which a transformation needs to be applied to obtain a transformed DataSet.
  
  @see KeySelector
  @see UnsortedGrouping
  @see AggregateOperator
  @see ReduceOperator
  @see org.apache.flink.api.java.operators.GroupReduceOperator
  @see DataSet