Kudu-Java-api操作表(DDL)
目录
- 背景
- 创建表结构
- 单主键设置
- 联合主键设置
- 删除表,添加删除字段
背景
如前面几篇文章所述,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_id
与app_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)相关推荐
- 5 hbase-shell + hbase的java api
本博文的主要内容有 .HBase的单机模式(1节点)安装 .HBase的单机模式(1节点)的启动 .HBase的伪分布模式(1节点)安装 .HBase的伪分布模式(1节点)的启动 .HBase ...
- 6 HBase java API访问HBase数据库
HBase java API访问HBase数据库 package com.hunan.hbase_options;import org.apache.hadoop.conf.Configuration ...
- Hbase java API操作(模板代码)
Hbase java API操作 1 创建maven工程 导入jar包 <repositories><repository><id>cloudera</id& ...
- 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 查 ...
- 2021年大数据Kafka(五):❤️Kafka的java API编写❤️
全网最详细的大数据Kafka文章系列,强烈建议收藏加关注! 新文章都已经列出历史文章目录,帮助大家回顾前面的知识重点. 目录 系列历史文章 Kafka的java API编写 一.生产者代码 第一步: ...
- 2021年大数据ZooKeeper(五):ZooKeeper Java API操作
目录 ZooKeeper Java API操作 引入maven坐标 节点的操作 ZooKeeper Java API操作 这里操作Zookeeper的JavaAPI使用的是一套zookeeper客户端 ...
- 随机森林 java_机器学习weka,java api调用随机森林及保存模型
工作需要,了解了一下weka的java api,主要是随机森林这一块,刚开始学习,记录下. 了解不多,直接上demo,里面有一些注释说明: package weka; import java.io.F ...
- 【ZooKeeper Notes 3】ZooKeeper Java API 使用样例
查看PDF版本 转载请注明:@ni掌柜 nileader@gmail.com ZooKeeper是一个分布式的,开放源码的分布式应用程序协调服务框架,包含一组简单的原语集合.通过这些原语言的组合使用, ...
- Kafka系列三 java API操作
使用java API操作kafka 1.pom.xml <project xmlns="http://maven.apache.org/POM/4.0.0" xmlns:xs ...
- java代码操作git_JGit--实现Git命令操作的Java API
问题来源:最近在做一个项目,其中有一块需要用户上传代码到服务器中,然后分析用户所传的代码,传代码最直接的方式就是用户打个包上传,但是后期再分析代码的时候还要代码实现解压上传的代码,操作起来比较复杂. ...
最新文章
- ELECTRA:超越BERT,2019年最佳NLP预训练模型
- 优化物理和机器学习之间的协同作用
- 【Java】 大话数据结构(13) 查找算法(4) (散列表(哈希表))
- android 闹钟服务,如果闹钟时间已经过去,android可以防止即时触发闹钟服务
- Myeclipse学习总结(8)——Eclipse实用操作
- ShowMsg函数妙用
- 常见的CSS和HTML面试题
- C++11 explicit关键字的作用
- 好玩小游戏来啦,免费拿走,一个赞一个关注就够啦
- iOS---UICollectlionView 的使用
- 为什么有的人手机通知栏显示的是4G+而有的是HD?
- 多线程篇三:线程同步
- python 在windows下的 虚拟环境
- window操作Python27
- lunix remount u盘_使用e2fsck修复损坏的Linux磁盘|Read only|LVM|EXT4-FS
- ios真机测试,Ineligible Devices,不可以选中真机
- 低功耗蓝牙迈向工业车规级,助力充电桩和电动车智能化
- QT多线程之:moveToThread
- 详解adb shell 常用命令
- 对不同的人说不同的话的职场口才分享
热门文章
- Open3D法线双边滤波, 利用法向信息提高点云滤波效果
- android 获取生肖和星座
- cs1.5服务器指定ip,求上海地区cs1.5服务器IP
- wordpress小说发布软件
- Maven Profiles
- Oracle游标设置
- 踏遍青山情未老 —— 九山顶重游记(三)
- navicat 远程连接docker mysql提示:Authentication plugin ‘caching_sha2_password‘ cannot be loaded
- 6666666666欢迎使用CSDN-markdown编辑器
- DPOS——授权股权证明机制