目录

  • 背景
  • 创建表结构
    • 单主键设置
    • 联合主键设置
    • 删除表,添加删除字段

背景

如前面几篇文章所述,kudu的环境已经搭建好了,剩下就是对kudu-api的上手操作了。
本次主要是创建表,添加,删除字段。

创建表结构

    private static final String KUDU_MASTERS = "192.168.220.145";private static final Logger logger = LoggerFactory.getLogger(TableDDL.class);public static void main(String[] args) throws KuduException {KuduClient kuduClient = new KuduClient.KuduClientBuilder(KUDU_MASTERS).build();createExampleTable(kuduClient, "kudu_test");createExample2Table(kuduClient, "kudu_test2");alterTableAddColumn(kuduClient, "kudu_test2", "domain_id_default", Type.INT32);alterTableDeleteColumn(kuduClient, "kudu_test2", "domain_id_default");kuduClient.close();}

单主键设置

单column主键设置,与app一一对应的关系,也是我们常见的结构,然后根据ID进行hash分区。
需要注意以下几点:
必需指定一个或多个字段为主键,多个即为联合主键,如果不设置为报异常

org.apache.kudu.client.NonRecoverableException: must specify at least one key column

buckets数值也就是cto.addHashPartitions(hashKeys, 2);第二个参数必须是>=2, 否则会报异常

org.apache.kudu.client.NonRecoverableException: must have at least two hash buckets

因为我搭建的是单机模式(kudu-master与kudu-tserver均安装在一台机器上),副本数一定要设置为1
否则会报如下异常

org.apache.kudu.client.NonRecoverableException: Not enough live tablet servers to create a table
with the requested replication factor 3. 1 tablet servers are alive.

并且副本数一定要设置成奇数,否则会报异常

org.apache.kudu.client.NonRecoverableException: illegal replication factor 2 (replication factor must be odd)

    /*** 背景:* 单column主键设置,与app一一对应的关系* 根据Id hash分了两个区。** @param client* @param tableName* @throws KuduException*/static void createExampleTable(KuduClient client, String tableName) throws KuduException {List<ColumnSchema> columnSchemas = Lists.newArrayList();columnSchemas.add(new ColumnSchema.ColumnSchemaBuilder("id", Type.STRING).key(true).build());columnSchemas.add(new ColumnSchema.ColumnSchemaBuilder("app", Type.INT8).build());Schema schema = new Schema(columnSchemas);ImmutableList<String> hashKeys = ImmutableList.of("id");CreateTableOptions cto = new CreateTableOptions();cto.addHashPartitions(hashKeys, 2);cto.setNumReplicas(1);client.createTable(tableName, schema, cto);System.out.println("Create table " + tableName);}

创建好后,可以在界面查看到,我们可以看到,即使没有装impala-kudu组件,但页面一样显示了impala create table的语法。这点很友好。

联合主键设置

由于需求原因,一个device_id,可能会有多个app的情况,所以仅使用device_id做为主键是不够用的。
这时就需要有联合主键了。此处根据业务场景,应使用device_idapp_id做为联合主键, 此外对于多个主键,
可以对不同的主键进行不同的分区策略。而Kudu共有两种分区策略,一个是hash,另一个是range
在创建联合主键的表是时,还需要注意以下几点:
联合主键是有序的,这就意味着,你的主键在进行代码添加(也就是通过columnSchemas.add()方法)时,
必须要严格按照你的业务来进行,比如你不能把action_time放在非主键app_name之后,否则会报异常

org.apache.kudu.client.NonRecoverableException: Got out-of-order key column: name: “action_time” type: INT64 is_key: true is_nullable: false cfile_block_size: 0
设备action_time为range分区时,那么action_time必须要设置为主键, 否则会报异常
org.apache.kudu.client.NonRecoverableException: must specify only primary key columns for range partition component

    /*** range分区数*/private static final int RANGE_PARTITION_NUMS = 10;/**** @param client* @param tableName*/static void createExample2Table (KuduClient client, String tableName) throws KuduException {List<ColumnSchema> columnSchemas = Lists.newArrayList();//org.apache.kudu.client.NonRecoverableException: must specify at least one key columncolumnSchemas.add(new ColumnSchema.ColumnSchemaBuilder("device_id", Type.STRING).key(true).build());columnSchemas.add(new ColumnSchema.ColumnSchemaBuilder("app_id", Type.INT32).key(true).build());columnSchemas.add(new ColumnSchema.ColumnSchemaBuilder("action_time", Type.INT64).key(true).build());columnSchemas.add(new ColumnSchema.ColumnSchemaBuilder("app_name", Type.STRING).nullable(true).build());Schema schema = new Schema(columnSchemas);//设置hash分区CreateTableOptions cto = new CreateTableOptions();cto.addHashPartitions(ImmutableList.of("device_id", "app_id"), 2);cto.setNumReplicas(1);//设置action_time的range分区cto.setRangePartitionColumns(ImmutableList.of("action_time"));int count = 0;for (long i = 0; i < RANGE_PARTITION_NUMS; i++) {PartialRow lower = schema.newPartialRow();lower.addLong("action_time", count);PartialRow upper = schema.newPartialRow();count += 10;upper.addLong("action_time", count);cto.addRangePartition(lower, upper);}// 创建table, 并设置partitionclient.createTable(tableName, schema, cto);System.out.println("Create table " + tableName);}

查看页面:

删除表,添加删除字段

需要注意以下两点就行
给表添加字段,但要注意的是添加的字段不能再设置成主键。(kudu-version: 1.10.0),也就是主键必须要在创建表之前就要根据业务实际情况想好,因为后续是不能进行更改的,否则会报如下异常

java.lang.IllegalArgumentException: Key columns cannot be added

添加的字段nullabel参数默认为false,所以要设置defaultValue的值,或者将nullable设置为true, 否则会异常:

java.lang.IllegalArgumentException: A new non-null column must have a default value

    static void dropExampleTable(KuduClient client, String tableName) throws KuduException {client.deleteTable(tableName);}static void alterTableAddColumn(KuduClient client, String tableName, String column, Type type) {AlterTableOptions alterTableOptions = new AlterTableOptions();alterTableOptions.addColumn(new ColumnSchema.ColumnSchemaBuilder(column, type).nullable(true).build());try {client.alterTable(tableName, alterTableOptions);} catch (KuduException e) {e.printStackTrace();logger.debug("给表{}添加字段失败, 失败信息: cause -> {}, message -> {}", tableName, e.getCause(), e.getMessage());}}static void alterTableDeleteColumn(KuduClient client, String tableName, String column){AlterTableOptions alterTableOptions = new AlterTableOptions().dropColumn(column);try {client.alterTable(tableName, alterTableOptions);} catch (KuduException e) {e.printStackTrace();logger.error("删除表{}字段失败, 失败信息: cause -> {}, message -> {}", tableName, e.getCause(), e.getMessage());}}

Kudu-Java-api操作表(DDL)相关推荐

  1. 5 hbase-shell + hbase的java api

    本博文的主要内容有 .HBase的单机模式(1节点)安装 .HBase的单机模式(1节点)的启动 .HBase的伪分布模式(1节点)安装  .HBase的伪分布模式(1节点)的启动    .HBase ...

  2. 6 HBase java API访问HBase数据库

    HBase java API访问HBase数据库 package com.hunan.hbase_options;import org.apache.hadoop.conf.Configuration ...

  3. Hbase java API操作(模板代码)

    Hbase java API操作 1 创建maven工程 导入jar包 <repositories><repository><id>cloudera</id& ...

  4. ArangoDB 学习笔记(二)AQL Java API | AQL语法 | 使用Java连接ArangoDB

    文章目录 参考资料 一.ArangoDB Java Driver 支持的不同类型 1.1 BaseDocument 1.2 XML 1.3 Graph 二.AQL 2.1 AQL 语法 2.1.1 查 ...

  5. 2021年大数据Kafka(五):❤️Kafka的java API编写❤️

    全网最详细的大数据Kafka文章系列,强烈建议收藏加关注! 新文章都已经列出历史文章目录,帮助大家回顾前面的知识重点. 目录 系列历史文章 Kafka的java API编写 一.生产者代码 第一步: ...

  6. 2021年大数据ZooKeeper(五):ZooKeeper Java API操作

    目录 ZooKeeper Java API操作 引入maven坐标 节点的操作 ZooKeeper Java API操作 这里操作Zookeeper的JavaAPI使用的是一套zookeeper客户端 ...

  7. 随机森林 java_机器学习weka,java api调用随机森林及保存模型

    工作需要,了解了一下weka的java api,主要是随机森林这一块,刚开始学习,记录下. 了解不多,直接上demo,里面有一些注释说明: package weka; import java.io.F ...

  8. 【ZooKeeper Notes 3】ZooKeeper Java API 使用样例

    查看PDF版本 转载请注明:@ni掌柜 nileader@gmail.com ZooKeeper是一个分布式的,开放源码的分布式应用程序协调服务框架,包含一组简单的原语集合.通过这些原语言的组合使用, ...

  9. Kafka系列三 java API操作

    使用java API操作kafka 1.pom.xml <project xmlns="http://maven.apache.org/POM/4.0.0" xmlns:xs ...

  10. java代码操作git_JGit--实现Git命令操作的Java API

    问题来源:最近在做一个项目,其中有一块需要用户上传代码到服务器中,然后分析用户所传的代码,传代码最直接的方式就是用户打个包上传,但是后期再分析代码的时候还要代码实现解压上传的代码,操作起来比较复杂. ...

最新文章

  1. ELECTRA:超越BERT,2019年最佳NLP预训练模型
  2. 优化物理和机器学习之间的协同作用
  3. 【Java】 大话数据结构(13) 查找算法(4) (散列表(哈希表))
  4. android 闹钟服务,如果闹钟时间已经过去,android可以防止即时触发闹钟服务
  5. Myeclipse学习总结(8)——Eclipse实用操作
  6. ShowMsg函数妙用
  7. 常见的CSS和HTML面试题
  8. C++11 explicit关键字的作用
  9. 好玩小游戏来啦,免费拿走,一个赞一个关注就够啦
  10. iOS---UICollectlionView 的使用
  11. 为什么有的人手机通知栏显示的是4G+而有的是HD?
  12. 多线程篇三:线程同步
  13. python 在windows下的 虚拟环境
  14. window操作Python27
  15. lunix remount u盘_使用e2fsck修复损坏的Linux磁盘|Read only|LVM|EXT4-FS
  16. ios真机测试,Ineligible Devices,不可以选中真机
  17. 低功耗蓝牙迈向工业车规级,助力充电桩和电动车智能化
  18. QT多线程之:moveToThread
  19. 详解adb shell 常用命令
  20. 对不同的人说不同的话的职场口才分享

热门文章

  1. Open3D法线双边滤波, 利用法向信息提高点云滤波效果
  2. android 获取生肖和星座
  3. cs1.5服务器指定ip,求上海地区cs1.5服务器IP
  4. wordpress小说发布软件
  5. Maven Profiles
  6. Oracle游标设置
  7. 踏遍青山情未老 —— 九山顶重游记(三)
  8. navicat 远程连接docker mysql提示:Authentication plugin ‘caching_sha2_password‘ cannot be loaded
  9. 6666666666欢迎使用CSDN-markdown编辑器
  10. DPOS——授权股权证明机制