package org.apache.hadoop.hive.cassandra.output; import java.io.DataInput; import java.io.DataOutput; import java.io.IOException; import java.nio.ByteBuffer; import java.util.ArrayList; import java.util.HashMap; import java.util.List; import java.util.Map; import org.apache.cassandra.thrift.Column; import org.apache.cassandra.thrift.ColumnOrSuperColumn; import org.apache.cassandra.thrift.ConsistencyLevel; import org.apache.cassandra.thrift.Mutation; import org.apache.cassandra.utils.ByteBufferUtil; import org.apache.hadoop.hive.cassandra.CassandraProxyClient; import org.apache.hadoop.io.Writable; import org.apache.hadoop.mapred.JobConf; /** * This represents a standard column family. It implements hadoop Writable interface. * */ public class CassandraPut extends CassandraAbstractPut implements Writable { private ByteBuffer key; private List<CassandraColumn> columns; public CassandraPut(){ columns = new ArrayList<CassandraColumn>(); } public CassandraPut(ByteBuffer key){ this(); this.key = key; } @Override public void readFields(DataInput in) throws IOException { int keyLen = in.readInt(); byte[] keyBytes = new byte[keyLen]; in.readFully(keyBytes); key = ByteBuffer.wrap(keyBytes); int ilevel = in.readInt(); int cols = in.readInt(); for (int i =0;i<cols;i++){ CassandraColumn cc = new CassandraColumn(); cc.readFields(in); columns.add(cc); } } @Override public void write(DataOutput out) throws IOException { out.writeInt(key.remaining()); out.write(ByteBufferUtil.getArray(key)); out.writeInt(1); out.writeInt(columns.size()); for (CassandraColumn c: columns){ c.write(out); } } public ByteBuffer getKey() { return key; } public void setKey(ByteBuffer key) { this.key = key; } public List<CassandraColumn> getColumns() { return columns; } public void setColumns(List<CassandraColumn> columns) { this.columns = columns; } @Override public String toString(){ StringBuilder sb = new StringBuilder(); sb.append("key: "); sb.append(this.key); for (CassandraColumn col:this.columns){ sb.append( "column : [" ); sb.append( col.toString() ); sb.append( "]" ); } return sb.toString(); } @Override public void write(String keySpace, CassandraProxyClient client, JobConf jc) throws IOException { ConsistencyLevel flevel = getConsistencyLevel(jc); int batchMutation = getBatchMutationSize(jc); Map<ByteBuffer,Map<String,List<Mutation>>> mutation_map = new HashMap<ByteBuffer,Map<String,List<Mutation>>>(); Map<String, List<Mutation>> maps = new HashMap<String, List<Mutation>>(); int count = 0; // TODO check for counter for (CassandraColumn col : columns) { Column cassCol = new Column(); cassCol.setValue(col.getValue()); cassCol.setTimestamp(col.getTimeStamp()); cassCol.setName(col.getColumn()); ColumnOrSuperColumn thisCol = new ColumnOrSuperColumn(); thisCol.setColumn(cassCol); Mutation mutation = new Mutation(); mutation.setColumn_or_supercolumn(thisCol); List<Mutation> mutList = maps.get(col.getColumnFamily()); if (mutList == null) { mutList = new ArrayList<Mutation>(); maps.put(col.getColumnFamily(), mutList); } mutList.add(mutation); count ++; if (count == batchMutation) { mutation_map.put(key, maps); commitChanges(keySpace, client, flevel, mutation_map); //reset mutation map, maps and count; mutation_map = new HashMap<ByteBuffer,Map<String,List<Mutation>>>(); maps = new HashMap<String, List<Mutation>>(); count = 0; } } if(count > 0) { mutation_map.put(key, maps); commitChanges(keySpace, client, flevel, mutation_map); } } }