diff --git ql/src/java/org/apache/hadoop/hive/ql/exec/spark/SparkReduceRecordHandler.java ql/src/java/org/apache/hadoop/hive/ql/exec/spark/SparkReduceRecordHandler.java index 44f2e4d..8251900 100644 --- ql/src/java/org/apache/hadoop/hive/ql/exec/spark/SparkReduceRecordHandler.java +++ ql/src/java/org/apache/hadoop/hive/ql/exec/spark/SparkReduceRecordHandler.java @@ -211,30 +211,44 @@ public void init(JobConf job, OutputCollector output, Reporter reporter) throws } /** - * TODO: Instead of creating a dummy iterator per row, we can implement a private method that's - * similar to processRow(Object key, Iterator values) but processes one row at a time. Then, - * we just call that private method here. + * A reusable dummy iterator that has only one value. + * */ - @Override - public void processRow(Object key, final Object value) throws IOException { - processRow(key, new Iterator() { - boolean done = false; - @Override - public boolean hasNext() { - return !done; - } + private static class DummyIterator implements Iterator { + private boolean done = false; + private Object value = null; - @Override - public Object next() { - done = true; - return value; - } + public void setValue(Object v) { + this.value = v; + done = false; + } - @Override - public void remove() { - throw new UnsupportedOperationException("Iterator.remove() is not implemented/supported"); - } - }); + @Override + public boolean hasNext() { + return !done; + } + + @Override + public Object next() { + done = true; + return value; + } + + @Override + public void remove() { + throw new UnsupportedOperationException("Iterator.remove() is not implemented/supported"); + } + } + + private DummyIterator dummyIterator = new DummyIterator(); + + /** + * Process one row using a dummy iterator. + */ + @Override + public void processRow(Object key, final Object value) throws IOException { + dummyIterator.setValue(value); + processRow(key, dummyIterator); } @Override