in kudu/src/main/java/site/ycsb/db/KuduYCSBClient.java [172:264]
private void setupTable() throws DBException {
Properties prop = getProperties();
synchronized (KuduYCSBClient.class) {
if (tableSetup) {
return;
}
int numTablets = getIntFromProp(prop, PRE_SPLIT_NUM_TABLETS_OPT, 4);
if (numTablets > MAX_TABLETS) {
throw new DBException("Specified number of tablets (" + numTablets
+ ") must be equal " + "or below " + MAX_TABLETS);
}
int numReplicas = getIntFromProp(prop, TABLE_NUM_REPLICAS, DEFAULT_NUM_REPLICAS);
long recordCount = Long.parseLong(prop.getProperty(RECORD_COUNT_PROPERTY, DEFAULT_RECORD_COUNT));
if (recordCount == 0) {
recordCount = Integer.MAX_VALUE;
}
int blockSize = getIntFromProp(prop, BLOCK_SIZE_OPT, BLOCK_SIZE_DEFAULT);
int fieldCount = getIntFromProp(prop, CoreWorkload.FIELD_COUNT_PROPERTY,
Integer.parseInt(CoreWorkload.FIELD_COUNT_PROPERTY_DEFAULT));
final String fieldprefix = prop.getProperty(CoreWorkload.FIELD_NAME_PREFIX,
CoreWorkload.FIELD_NAME_PREFIX_DEFAULT);
List<ColumnSchema> columns = new ArrayList<ColumnSchema>(fieldCount + 1);
ColumnSchema keyColumn = new ColumnSchema.ColumnSchemaBuilder(KEY, STRING)
.key(true)
.desiredBlockSize(blockSize)
.build();
columns.add(keyColumn);
COLUMN_NAMES.add(KEY);
for (int i = 0; i < fieldCount; i++) {
String name = fieldprefix + i;
COLUMN_NAMES.add(name);
columns.add(new ColumnSchema.ColumnSchemaBuilder(name, STRING)
.desiredBlockSize(blockSize)
.build());
}
schema = new Schema(columns);
CreateTableOptions builder = new CreateTableOptions();
if (partitionSchema.equals("hashPartition")) {
builder.setRangePartitionColumns(new ArrayList<String>());
List<String> hashPartitionColumns = new ArrayList<>();
hashPartitionColumns.add(KEY);
builder.addHashPartitions(hashPartitionColumns, numTablets);
} else if (partitionSchema.equals("rangePartition")) {
if (!orderedinserts) {
// We need to use ordered keys to determine how to split range partitions.
throw new DBException("Must specify `insertorder=ordered` if using rangePartition schema.");
}
String maxKeyValue = String.valueOf(recordCount);
if (zeropadding < maxKeyValue.length()) {
throw new DBException(String.format("Invalid zeropadding value: %d, zeropadding needs to be larger "
+ "or equal to number of digits in the record number: %d.", zeropadding, maxKeyValue.length()));
}
List<String> rangePartitionColumns = new ArrayList<>();
rangePartitionColumns.add(KEY);
builder.setRangePartitionColumns(rangePartitionColumns);
// Add rangePartitions
long lowerNum = 0;
long upperNum = 0;
int remainder = (int) recordCount % numTablets;
for (int i = 0; i < numTablets; i++) {
lowerNum = upperNum;
upperNum = lowerNum + recordCount / numTablets;
if (i < remainder) {
++upperNum;
}
PartialRow lower = schema.newPartialRow();
lower.addString(KEY, CoreWorkload.buildKeyName(lowerNum, zeropadding, orderedinserts));
PartialRow upper = schema.newPartialRow();
upper.addString(KEY, CoreWorkload.buildKeyName(upperNum, zeropadding, orderedinserts));
builder.addRangePartition(lower, upper);
}
} else {
throw new DBException("Invalid partition_schema specified: " + partitionSchema
+ ", must specify `partition_schema=hashPartition` or `partition_schema=rangePartition`");
}
builder.setNumReplicas(numReplicas);
try {
client.createTable(tableName, schema, builder);
} catch (Exception e) {
if (!e.getMessage().contains("already exists")) {
throw new DBException("Couldn't create the table", e);
}
}
tableSetup = true;
}
}