When an IMDC is in the iterable state, you can iterate over its data.
You cannot iterate over IMDC data during contract negotiation.
-
Iterate over the data in an iterable IMDC:
import java.util.List; import java.util.ArrayList; import com.asterdata.ncluster.sqlmr.RowFunction; import com.asterdata.ncluster.sqlmr.data.RowEmitter; import com.asterdata.ncluster.sqlmr.data.RowIterator; import com.asterdata.ncluster.sqlmr.InMemoryDataCollectionRepository; import com.asterdata.ncluster.sqlmr.data.InMemoryDataCollection; import com.asterdata.ncluster.sqlmr.data.InMemoryDataCollectionRowIterator; import com.asterdata.ncluster.sqlmr.data.SqlType; import com.asterdata.ncluster.sqlmr.data.RowView; import com.asterdata.ncluster.sqlmr.data.RowBuilder; ... public void drainOutputRows(RowEmitter outputEmitter) { ... //Get handle to IMDC InMemoryDataCollection IMDC_name = InMemoryDataCollectionRepository.getInMemoryDataCollection( "IMDC_name", TaskInfo); //Get iterator to iterate over rows stored in IMDC InMemoryDataCollectionRowIterator IMDC_rowIterator_var = myIMDC.newRowIterator(); while( IMDC_rowIterator_var.advanceToNextRow() ) { outputEmitter.addInt(IMDC_rowIterator_var.gettype_0At(0)); outputEmitter.addDouble(IMDC_rowIterator_var.gettype_1At(1)); ... outputEmitter.addString(IMDC_rowIterator_var.gettype_nAt(n)); outputEmitter.emitRow(); } ... }
For example, the following code iterates over the rows of an IMDC named myIMDC, which has columns of types integer, double, and var.import java.util.List; import java.util.ArrayList; import com.asterdata.ncluster.sqlmr.RowFunction; import com.asterdata.ncluster.sqlmr.data.RowEmitter; import com.asterdata.ncluster.sqlmr.data.RowIterator; import com.asterdata.ncluster.sqlmr.InMemoryDataCollectionRepository; import com.asterdata.ncluster.sqlmr.data.InMemoryDataCollection; import com.asterdata.ncluster.sqlmr.data.InMemoryDataCollectionRowIterator; import com.asterdata.ncluster.sqlmr.data.SqlType; import com.asterdata.ncluster.sqlmr.data.RowView; import com.asterdata.ncluster.sqlmr.data.RowBuilder; ... public void drainOutputRows(RowEmitter outputEmitter) { ... //Get handle to IMDC InMemoryDataCollection myIMDC = InMemoryDataCollectionRepository.getInMemoryDataCollection( "myIMDC", TaskInfo); //Get iterator to iterate over rows stored in IMDC InMemoryDataCollectionRowIterator myIMDC_rowIterator = myIMDC.newRowIterator(); while( myIMDC_rowIterator.advanceToNextRow() ) { outputEmitter.addInt(myIMDC_rowIterator.getIntAt(0)); outputEmitter.addDouble(myIMDC_rowIterator.getDoubleAt(1)); outputEmitter.addString(myIMDC_rowIterator.getStringAt(2)); outputEmitter.emitRow(); } ... }
An alternative to getting a handle to the IMDC is to use a variable of the type RowIterator, because InMemoryDataCollectionRowIterator extends the RowIterator interface.
The row iterator remains open until you close it. To close the row iterator, call the method RowIterator::endIteration.