@Override
  public void load(
      MapJoinTableContainer[] mapJoinTables, MapJoinTableContainerSerDe[] mapJoinTableSerdes)
      throws HiveException {

    Map<Integer, String> parentToInput = desc.getParentToInput();
    Map<Integer, Long> parentKeyCounts = desc.getParentKeyCounts();

    for (int pos = 0; pos < mapJoinTables.length; pos++) {
      if (pos == desc.getPosBigTable()) {
        continue;
      }

      String inputName = parentToInput.get(pos);
      LogicalInput input = tezContext.getInput(inputName);

      try {
        input.start();
        tezContext
            .getTezProcessorContext()
            .waitForAnyInputReady(Collections.<Input>singletonList(input));
      } catch (Exception e) {
        throw new HiveException(e);
      }

      try {
        KeyValueReader kvReader = (KeyValueReader) input.getReader();

        Long keyCountObj = parentKeyCounts.get(pos);
        long keyCount = (keyCountObj == null) ? -1 : keyCountObj.longValue();

        VectorMapJoinFastTableContainer vectorMapJoinFastTableContainer =
            new VectorMapJoinFastTableContainer(desc, hconf, keyCount);

        while (kvReader.next()) {
          vectorMapJoinFastTableContainer.putRow(
              null, (BytesWritable) kvReader.getCurrentKey(),
              null, (BytesWritable) kvReader.getCurrentValue());
        }

        vectorMapJoinFastTableContainer.seal();
        mapJoinTables[pos] = (MapJoinTableContainer) vectorMapJoinFastTableContainer;

      } catch (IOException e) {
        throw new HiveException(e);
      } catch (SerDeException e) {
        throw new HiveException(e);
      } catch (Exception e) {
        throw new HiveException(e);
      }
    }
  }
 @Override
 public Object getCurrentValue() throws IOException, InterruptedException {
   return reader.getCurrentValue();
 }
 @Override
 public boolean nextKeyValue() throws IOException, InterruptedException {
   return reader.next();
 }