private CreateTableOptions buildCreateTableOptions(Schema schema, Map<String, Object> properties) { CreateTableOptions options = new CreateTableOptions(); RangePartitionDefinition rangePartitionDefinition = null; PartitionDesign partitionDesign = KuduTableProperties.getPartitionDesign(properties); if (partitionDesign.getHash() != null) { for (HashPartitionDefinition partition : partitionDesign.getHash()) { options.addHashPartitions(partition.getColumns(), partition.getBuckets()); } } if (partitionDesign.getRange() != null) { rangePartitionDefinition = partitionDesign.getRange(); options.setRangePartitionColumns(rangePartitionDefinition.getColumns()); } List<RangePartition> rangePartitions = KuduTableProperties.getRangePartitions(properties); if (rangePartitionDefinition != null && !rangePartitions.isEmpty()) { for (RangePartition rangePartition : rangePartitions) { PartialRow lower = KuduTableProperties.toRangeBoundToPartialRow(schema, rangePartitionDefinition, rangePartition.getLower()); PartialRow upper = KuduTableProperties.toRangeBoundToPartialRow(schema, rangePartitionDefinition, rangePartition.getUpper()); options.addRangePartition(lower, upper); } } Optional<Integer> numReplicas = KuduTableProperties.getNumReplicas(properties); numReplicas.ifPresent(options::setNumReplicas); return options; }
/** * Add a range partition partition to the table with an inclusive lower bound * and an exclusive upper bound. * * If either row is empty, then that end of the range will be unbounded. If a * range column is missing a value, the logical minimum value for that column * type will be used as the default. * * Multiple range bounds may be added, but they must not overlap. All split * rows must fall in one of the range bounds. The lower bound must be less * than the upper bound. * * If not provided, the table's range will be unbounded. * * @param lower the inclusive lower bound * @param upper the exclusive upper bound * @return this instance */ public CreateTableOptions addRangePartition(PartialRow lower, PartialRow upper) { return addRangePartition(lower, upper, RangePartitionBound.INCLUSIVE_BOUND, RangePartitionBound.EXCLUSIVE_BOUND); }
PartialRow lower = KuduTableProperties.toRangeBoundToPartialRow(schema, rangePartitionDefinition, rangePartition.getLower()); PartialRow upper = KuduTableProperties.toRangeBoundToPartialRow(schema, rangePartitionDefinition, rangePartition.getUpper()); options.addRangePartition(lower, upper);
private CreateTableOptions buildCreateTableOptions(Schema schema, Map<String, Object> properties) { CreateTableOptions options = new CreateTableOptions(); RangePartitionDefinition rangePartitionDefinition = null; PartitionDesign partitionDesign = KuduTableProperties.getPartitionDesign(properties); if (partitionDesign.getHash() != null) { for (HashPartitionDefinition partition : partitionDesign.getHash()) { options.addHashPartitions(partition.getColumns(), partition.getBuckets()); } } if (partitionDesign.getRange() != null) { rangePartitionDefinition = partitionDesign.getRange(); options.setRangePartitionColumns(rangePartitionDefinition.getColumns()); } List<RangePartition> rangePartitions = KuduTableProperties.getRangePartitions(properties); if (rangePartitionDefinition != null && !rangePartitions.isEmpty()) { for (RangePartition rangePartition : rangePartitions) { PartialRow lower = KuduTableProperties.toRangeBoundToPartialRow(schema, rangePartitionDefinition, rangePartition.getLower()); PartialRow upper = KuduTableProperties.toRangeBoundToPartialRow(schema, rangePartitionDefinition, rangePartition.getUpper()); options.addRangePartition(lower, upper); } } Optional<Integer> numReplicas = KuduTableProperties.getNumReplicas(properties); numReplicas.ifPresent(options::setNumReplicas); return options; }
PartialRow upper = basicSchema.newPartialRow(); upper.addInt(0, -300); builder.addRangePartition(basicSchema.newPartialRow(), upper); PartialRow upper = basicSchema.newPartialRow(); upper.addInt(0, 0); builder.addRangePartition(lower, upper); PartialRow upper = basicSchema.newPartialRow(); upper.addInt(0, 99); builder.addRangePartition(lower, upper, RangePartitionBound.EXCLUSIVE_BOUND, RangePartitionBound.INCLUSIVE_BOUND); PartialRow upper = basicSchema.newPartialRow(); upper.addInt(0, 300); builder.addRangePartition(lower, upper, RangePartitionBound.INCLUSIVE_BOUND, RangePartitionBound.INCLUSIVE_BOUND); PartialRow lower = basicSchema.newPartialRow(); lower.addInt(0, 400); builder.addRangePartition(lower, basicSchema.newPartialRow());
PartialRow upper = schema.newPartialRow(); upper.addString(0, "\0"); builder.addRangePartition(schema.newPartialRow(), upper); PartialRow upper = schema.newPartialRow(); upper.addString(0, "abc\0"); builder.addRangePartition(lower, upper); PartialRow upper = schema.newPartialRow(); upper.addString(0, "ghi"); builder.addRangePartition(lower, upper); PartialRow lower = schema.newPartialRow(); lower.addString(0, "z"); builder.addRangePartition(lower, schema.newPartialRow());
upper.addString(0, ""); upper.addByte(1, (byte) -100); builder.addRangePartition(schema.newPartialRow(), upper); upper.addString(0, "abc"); upper.addByte(1, (byte) 1); builder.addRangePartition(lower, upper); upper.addString(0, "ghi"); upper.addByte(1, (byte) 99); builder.addRangePartition(lower, upper, RangePartitionBound.EXCLUSIVE_BOUND, RangePartitionBound.INCLUSIVE_BOUND);
/** * Creates table options with non-covering range partitioning for a table with * the basic schema. Range partition key ranges fall between the following values: * * [ 0, 50) * [ 50, 100) * [200, 300) */ public static CreateTableOptions getBasicTableOptionsWithNonCoveredRange() { Schema schema = getBasicSchema(); CreateTableOptions option = new CreateTableOptions(); option.setRangePartitionColumns(ImmutableList.of("key")); PartialRow aLowerBound = schema.newPartialRow(); aLowerBound.addInt("key", 0); PartialRow aUpperBound = schema.newPartialRow(); aUpperBound.addInt("key", 100); option.addRangePartition(aLowerBound, aUpperBound); PartialRow bLowerBound = schema.newPartialRow(); bLowerBound.addInt("key", 200); PartialRow bUpperBound = schema.newPartialRow(); bUpperBound.addInt("key", 300); option.addRangePartition(bLowerBound, bUpperBound); PartialRow split = schema.newPartialRow(); split.addInt("key", 50); option.addSplitRow(split); return option; }
/** * Creates a new table with two int columns, c0 and c1. c0 is the primary key. * The table is hash partitioned on c0 into two buckets, and range partitioned * with the provided bounds. */ private KuduTable createTable(List<Pair<Integer, Integer>> bounds) throws KuduException { // Create initial table with single range partition covering the entire key // space, and two hash buckets. ArrayList<ColumnSchema> columns = new ArrayList<>(1); columns.add(new ColumnSchema.ColumnSchemaBuilder("c0", Type.INT32) .nullable(false) .key(true) .build()); columns.add(new ColumnSchema.ColumnSchemaBuilder("c1", Type.INT32) .nullable(false) .build()); Schema schema = new Schema(columns); CreateTableOptions createOptions = new CreateTableOptions().setRangePartitionColumns(ImmutableList.of("c0")) .setNumReplicas(1) .addHashPartitions(ImmutableList.of("c0"), 2); for (Pair<Integer, Integer> bound : bounds) { PartialRow lower = schema.newPartialRow(); PartialRow upper = schema.newPartialRow(); lower.addInt("c0", bound.getFirst()); upper.addInt("c0", bound.getSecond()); createOptions.addRangePartition(lower, upper); } return client.createTable(tableName, schema, createOptions); }
PartialRow upper = schema.newPartialRow(); builder.addRangePartition(bottom, middle); builder.addRangePartition(middle, upper);
@Test(timeout = 100000) public void testHashBucketedAndNonCoveredRangePartitionedTable() throws Exception { Schema schema = createSchema(); CreateTableOptions tableBuilder = new CreateTableOptions(); tableBuilder.setRangePartitionColumns(ImmutableList.of("a", "b", "c")); // Create a non covered range between (3, 5, 6) and (4, 0, 0) PartialRow lowerBoundA = schema.newPartialRow(); lowerBoundA.addString("a", "0"); lowerBoundA.addString("b", "0"); lowerBoundA.addString("c", "0"); PartialRow upperBoundA = schema.newPartialRow(); upperBoundA.addString("a", "3"); upperBoundA.addString("b", "5"); upperBoundA.addString("c", "6"); tableBuilder.addRangePartition(lowerBoundA, upperBoundA); PartialRow lowerBoundB = schema.newPartialRow(); lowerBoundB.addString("a", "4"); lowerBoundB.addString("b", "0"); lowerBoundB.addString("c", "0"); PartialRow upperBoundB = schema.newPartialRow(); upperBoundB.addString("a", "5"); upperBoundB.addString("b", "5"); upperBoundB.addString("c", "6"); tableBuilder.addRangePartition(lowerBoundB, upperBoundB); tableBuilder.addHashPartitions(ImmutableList.of("a", "b", "c"), 4); testPartitionSchema(tableBuilder); }
@Test(timeout = 100000) public void testNonCoveredRangePartitionedTable() throws Exception { Schema schema = createSchema(); CreateTableOptions tableBuilder = new CreateTableOptions(); tableBuilder.setRangePartitionColumns(ImmutableList.of("a", "b", "c")); // Create a non covered range between (3, 5, 6) and (4, 0, 0) PartialRow lowerBoundA = schema.newPartialRow(); lowerBoundA.addString("a", "0"); lowerBoundA.addString("b", "0"); lowerBoundA.addString("c", "0"); PartialRow upperBoundA = schema.newPartialRow(); upperBoundA.addString("a", "3"); upperBoundA.addString("b", "5"); upperBoundA.addString("b", "6"); tableBuilder.addRangePartition(lowerBoundA, upperBoundA); PartialRow lowerBoundB = schema.newPartialRow(); lowerBoundB.addString("a", "4"); lowerBoundB.addString("b", "0"); lowerBoundB.addString("c", "0"); PartialRow upperBoundB = schema.newPartialRow(); upperBoundB.addString("a", "5"); upperBoundB.addString("b", "5"); upperBoundB.addString("b", "6"); tableBuilder.addRangePartition(lowerBoundB, upperBoundB); testPartitionSchema(tableBuilder); }
lower.addInt("key", 0); upper.addInt("key", 1); options.addRangePartition(lower, upper);
lower.addString("key", "a"); upper.addString("key", "f"); createOptions.addRangePartition(lower, upper); lower.addString("key", "h"); upper.addString("key", "z"); createOptions.addRangePartition(lower, upper);
lower.addInt("c0", -1); upper.addInt("c0", 99); createOptions.addRangePartition(lower, upper, RangePartitionBound.EXCLUSIVE_BOUND, RangePartitionBound.INCLUSIVE_BOUND);