package hex;
import water.H2O;
import water.Key;
import water.Request2;
import water.UKV;
import water.api.DocGen;
import water.api.Request;
import water.api.RequestBuilders;
import water.fvec.Frame;
import water.fvec.RebalanceDataSet;
import water.util.RString;
/**
* Rebalance a Frame
*/
public class ReBalance extends Request2 {
static final int API_WEAVER=1; // This file has auto-gen'd doc & json fields
static public DocGen.FieldDoc[] DOC_FIELDS; // Initialized from Auto-Gen code.
@Request.API(help = "Frame to rebalance", required = true, filter = Request.Default.class, json=true)
public Frame source;
@Request.API(help = "Key for rebalanced frame", filter = Request.Default.class, json=true)
public Key after = source != null ? Key.make(source._key.toString() + ".balanced") : null;
@Request.API(help = "Number of chunks", filter = Request.Default.class, json=true)
public int chunks = H2O.CLOUD.size() * H2O.NUMCPUS * 4;
@Override public RequestBuilders.Response serve() {
if( source==null ) throw new IllegalArgumentException("Missing frame to rebalance!");
try {
if (chunks > source.numRows()) throw new IllegalArgumentException("Cannot create more than " + source.numRows() + " chunks.");
if( after==null ) after = Key.make(source._key.toString() + ".balanced");
RebalanceDataSet rb = new RebalanceDataSet(source, after, chunks);
H2O.submitTask(rb);
rb.join();
return RequestBuilders.Response.done(this);
} catch( Throwable t ) {
return RequestBuilders.Response.error(t);
}
}
@Override public boolean toHTML( StringBuilder sb ) {
if (UKV.get(after)==null) {
return false;
}
RString aft = new RString("<a href='Inspect2.html?src_key=%$key'>%key</a>");
aft.replace("key", after);
DocGen.HTML.section(sb, "Rebalancing done. Frame '" + aft.toString()
+ "' now has " + ((Frame)UKV.get(after)).anyVec().nChunks()
+ " chunks (source: " + source.anyVec().nChunks() + ").");
return true;
}
}