public void operateOnPartition( PartitionDefinition definition, RowIterator inputIterator, RowEmitter outputEmitter) { errorHandler.enterOperateOnPartition(definition, inputIterator, outputEmitter); try { // Collect input rows for observed and expected values ArrayList<Double> expectedList = new ArrayList<Double>(); ArrayList<Long> observedList = new ArrayList<Long>(); while (inputIterator.advanceToNextRow()) { errorHandler.enterOperateOnRow(inputIterator, outputEmitter); if (inputIterator.isNullAt(observedArgumentIdx) || inputIterator.isNullAt(expectedArgumentIdx)) throw new IllegalArgumentException("observed and expected values cannot be null"); expectedList.add(inputIterator.getDoubleAt(expectedArgumentIdx)); observedList.add(inputIterator.getLongAt(observedArgumentIdx)); errorHandler.exitOperateOnRow(); } double[] expected = new double[expectedList.size()]; for (int i = 0; i < expected.length; i++) expected[i] = expectedList.get(i); long[] observed = new long[observedList.size()]; for (int i = 0; i < observed.length; i++) observed[i] = observedList.get(i); // Run test double pValue = chiSquareTest.chiSquareTest(expected, observed); // Emit result accumulator.emit(inputIterator, outputEmitter); outputEmitter.addDouble(pValue); outputEmitter.emitRow(); } catch (IllegalArgumentException e) { errorHandler.catchException(e); return; // End this partition and go to next if stopOnError is set to false (otherwise // exception is thrown) } errorHandler.exitOperateOnPartition(); }