Range-specific hash schemas example: Using Kudu Java client API

Review an example of using Kudu Java client API to create a table with a range partition having range-specific hash schema and then alter the table, adding one more range with custom hash schema.

  // Define the column schema.
  ArrayList<ColumnSchema> columns = new ArrayList<>(2);
  columns.add(new ColumnSchema.ColumnSchemaBuilder(
      "key", Type.INT32).key(true).build());
  columns.add(new ColumnSchema.ColumnSchemaBuilder(
      "col", Type.INT64).build());
  final Schema schema = new Schema(columns);

  CreateTableOptions builder = new CreateTableOptions();

  // Do range partitioning on the "key" column.
  builder.setRangePartitionColumns(ImmutableList.of("key"));

  // Define the table-wide schema: two buckets on the "key" column.
  builder.addHashPartitions(ImmutableList.of("key"), 2, 0);

  // Add [0, 100) range partition with custom hash schema.
  {
    PartialRow lower = schema.newPartialRow();
    lower.addInt("key", 0);
    PartialRow upper = schema.newPartialRow();
    upper.addInt("key", 100);

    // Custom hash schema for the range: five buckets on the "key" column.
    RangePartitionWithCustomHashSchema rangePartition =
        new RangePartitionWithCustomHashSchema(
            lower,
            upper,
            RangePartitionBound.INCLUSIVE_BOUND,
            RangePartitionBound.EXCLUSIVE_BOUND);
    rangePartition.addHashPartitions(ImmutableList.of("key"), 5, 0);
    builder.addRangePartition(rangePartition);
  }

  // Create the table.
  KuduTable table = client.createTable("mytable", schema, builder);

  // Work with the table.
  . . .

  // Alter the table: add [100, 200) range partition with custom hash schema.
  {
    PartialRow lower = schema.newPartialRow();
    lower.addInt("key", 100);
    PartialRow upper = schema.newPartialRow();
    upper.addInt("key", 200);
    RangePartitionWithCustomHashSchema range =
        new RangePartitionWithCustomHashSchema(
            lower,
            upper,
            RangePartitionBound.INCLUSIVE_BOUND,
            RangePartitionBound.EXCLUSIVE_BOUND);
    range.addHashPartitions(ImmutableList.of("key"), 3, 0);
    client.alterTable("mytable",
        new AlterTableOptions().addRangePartition(range));
  }

  // NOTE: after adding or dropping a range with custom hash schemas
  //       it’s necessary to refresh the KuduTable handle
  table = client.openTable("mytable");

  // Continue working with the table.
  . . .