docs: public static JavaRDD<List<Writable>> executeJoin(Join join, JavaRDD<List<Writable>> left,
                      JavaRDD<List<Writable>> right) {
  
          String[] leftColumnNames = join.getJoinColumnsLeft();
          int[] leftColumnIndexes = new int[leftColumnNames.length];
          for (int i = 0; i < leftColumnNames.length; i++) {
              leftColumnIndexes[i] = join.getLeftSchema().getIndexOfColumn(leftColumnNames[i]);
          }
  
          JavaPairRDD<List<Writable>, List<Writable>> leftJV = left.mapToPair(new ExtractKeysFunction(leftColumnIndexes));
  
          String[] rightColumnNames = join.getJoinColumnsRight();
          int[] rightColumnIndexes = new int[rightColumnNames.length];
          for (int i = 0; i < rightColumnNames.length; i++) {
              rightColumnIndexes[i] = join.getRightSchema().getIndexOfColumn(rightColumnNames[i]);
          }
  
          JavaPairRDD<List<Writable>, List<Writable>> rightJV =
                          right.mapToPair(new ExtractKeysFunction(rightColumnIndexes));
  
          JavaPairRDD<List<Writable>, Tuple2<Iterable<List<Writable>>, Iterable<List<Writable>>>> cogroupedJV =
                          leftJV.cogroup(rightJV);
  
          return cogroupedJV.flatMap(new ExecuteJoinFromCoGroupFlatMapFunction(join));
      }