package org.apache.hadoop.hive.cassandra.output;
import java.io.IOException;
import java.nio.ByteBuffer;
import java.util.List;
import java.util.Map;
import org.apache.cassandra.thrift.ConsistencyLevel;
import org.apache.cassandra.thrift.InvalidRequestException;
import org.apache.cassandra.thrift.Mutation;
import org.apache.cassandra.thrift.TimedOutException;
import org.apache.cassandra.thrift.UnavailableException;
import org.apache.hadoop.hive.cassandra.CassandraProxyClient;
import org.apache.hadoop.hive.cassandra.serde.AbstractColumnSerDe;
import org.apache.hadoop.mapred.JobConf;
import org.apache.thrift.TException;
public abstract class CassandraAbstractPut implements Put {
/**
* Parse batch mutation size from job configuration. If none is defined, return the default value 500.
*
* @param jc job configuration
* @return batch mutation size
*/
protected int getBatchMutationSize(JobConf jc) {
return jc.getInt(
AbstractColumnSerDe.CASSANDRA_BATCH_MUTATION_SIZE,
AbstractColumnSerDe.DEFAULT_BATCH_MUTATION_SIZE);
}
/**
* Parse consistency level from job configuration. If none is defined, or if the specified value is not a valid
* <code>ConsistencyLevel</code>, return default consistency level ONE.
*
* @param jc job configuration
* @return cassandra consistency level
*/
protected static ConsistencyLevel getConsistencyLevel(JobConf jc) {
String consistencyLevel = jc.get(AbstractColumnSerDe.CASSANDRA_CONSISTENCY_LEVEL,
AbstractColumnSerDe.DEFAULT_CONSISTENCY_LEVEL);
ConsistencyLevel level = null;
try {
level = ConsistencyLevel.valueOf(consistencyLevel);
} catch (IllegalArgumentException e) {
level = ConsistencyLevel.ONE;
}
return level;
}
/**
* Commit the changes in mutation map to cassandra client for given keyspace with given consistency level.
*
* @param keySpace cassandra key space
* @param client cassandra client
* @param flevel cassandra consistency level
* @param mutation_map cassandra mutation map
* @throws IOException when error happens in batch mutate
*/
protected void commitChanges(String keySpace,
CassandraProxyClient client,
ConsistencyLevel flevel,
Map<ByteBuffer, Map<String,List<Mutation>>> mutation_map) throws IOException {
try {
client.getProxyConnection().set_keyspace(keySpace);
client.getProxyConnection().batch_mutate(mutation_map, flevel);
} catch (InvalidRequestException e) {
throw new IOException(e);
} catch (UnavailableException e) {
throw new IOException(e);
} catch (TimedOutException e) {
throw new IOException(e);
} catch (TException e) {
throw new IOException(e);
}
}
}