分享

HBase 工具 | hbase-sdk 推出HQL功能

问题导读:
1、hbase-sdk是什么?
2、hbase-sdk如何进行集群管理?
3、hbase-sdk如何读取、保存、删除数据?
4、hbase-sdk如何使用HQL?


hbase-sdk

基于HBase Client的相关API开发而来的一款轻量级的HBase ORM框架。提供SQL查询功能,以类SQL的方式——HQL读写HBase数据。😋

针对HBase 1.x和2.xAPI的不同之处,在其上做了一层统一的封装。

hbase-sdk分为spring-boot-starter-hbase和hbase-sdk-core两部分。

SpringBoot项目中引入spring-boot-starter-hbase,在普通的Java项目中则可以使用hbase-sdk-core。


hbase-sdk 是一款轻量级的ORM框架,封装了对HBase数据表的读写操作和对集群的运维管理,并针对HBase1.x的API和2.xAPI的差异,做了统一的定义, 提供更加方便的调用API。同时,HQL的功能也已上线,提供了类SQL读写数据的能力,这将大大降低HBase Client API的使用门槛。API文档地址:

  1. https://weixiaotome.gitee.io/hbase-sdk/
复制代码

如果觉得这个项目不错可以 star 支持或者打赏它。
功能特性

    [x] 消除不同版本API的差异,重新定义接口规范
    [x] 优良的ORM特性,数据查询结果集自动映射Java实体类
    [x] HQL,以类SQL的形式读写HBase的表中数据
    [x] 利用spring-boot-starter-hbase无缝与SpringBoot集成
    [x] HBatis,类似于myBatis,提供配置文件管理HQL的功能(努力规划中)
    [x] 熔断能力,提供API级别的主备集群自动切换功能,保障服务的高可用(努力规划中)
    [x] JDK8+

快速开始

hbase-sdk 的每个版本经过测试完成之后,都会编译打包至各个模块,最后发布到maven中央仓库之中,只是最新版本的代码有一定的延迟。如果你想在第一时间体验该项目, 可以选择在Gitee或Github中克隆源码,在本地编译并运行测试用例。

hbase-sdk 基于java8开发,如果你想自己编译或体验,请确保已经安装了Java8和maven3+。此外,如果你想在本地进行开发调试,建议在本地存在一个可连通的HBase环境。如果你想快速搭建一个HBase的开发环境,请参考:

  1. https://www.jielongping.com/archives/dockerhbasetest
复制代码

hbase-sdk 开发所用的工具为IDEA,所以也极力推荐导入项目到idea中。

1. 普通项目

Maven 配置:

创建一个基础的 Maven 工程,HBase SDK API开发时基于的HBase版本主要是1.4.3和2.1.0。

所以,如果你的HBase版本是1.x,可以使用如下依赖。
  1. <dependency>
  2.     <groupId>com.github.CCweixiao</groupId>
  3.     <artifactId>hbase-sdk-core_1.4</artifactId>
  4.     <version>2.0.6</version>
  5. </dependency>
复制代码

如果你的HBase版本是2.x,则可以使用如下依赖。
  1. <dependency>
  2.     <groupId>com.github.CCweixiao</groupId>
  3.     <artifactId>hbase-sdk-core_2.1</artifactId>
  4.     <version>1.0.5</version>
  5. </dependency>
复制代码

hbase-sdk目前最新的版本是2.0.6。你可以在maven仓库中搜索CCweixiao来获取hbase-sdk相关jar包的最新版本。

  1. https://mvnrepository.com/artifact/com.github.CCweixiao
复制代码

当然,如果你想重新编译,以适配你自己的HBase版本,也可以选择下载源码,修改项目根pom.xml文件中的hbase.version,之后运行如下编译命令:

  1. git clone https://github.com/CCweixiao/hbase-sdk.git  or
  2. git clone https://gitee.com/weixiaotome/hbase-sdk.git
  3. cd hbase-sdk
  4. mvn clean install -Dmaven.test.skip=true
复制代码

2. 项目结构
2021-05-19_202635.jpg

API核心类继承结构示意图:

2021-05-19_202708.jpg

3. 在SpringBoot项目中使用

Maven 配置:

创建一个基于Maven的spring boot工程。

  1. <dependency>
  2.     <groupId>com.github.CCweixiao</groupId>
  3.     <artifactId>spring-boot-starter-hbase_1.4</artifactId>
  4.     <version>2.0.6</version>
  5. </dependency>
  6. or
  7. <dependency>
  8.     <groupId>com.github.CCweixiao</groupId>
  9.     <artifactId>spring-boot-starter-hbase_2.1</artifactId>
  10.     <version>2.0.6</version>
  11. </dependency>
复制代码

spring-boot-starter-hbase这个模块中已经包含了hbase-sdk-core。

4. 引入hbase-client的依赖

除了引入hbase-sdk的相关依赖之外,你还需要引入hbase-client的依赖,hbase-client的版本目前建议为1.2.x、1.4.x、2.1.x。hbase-client1.x和2.x的新旧API有所差异。未来,hbase-sdk会持续完善该依赖的版本兼容。
  1. <dependency>
  2.     <groupId>org.apache.hbase</groupId>
  3.     <artifactId>hbase-client</artifactId>
  4.     <version>1.4.3</version>
  5. </dependency>        
  6. or
  7. <dependency>
  8.     <groupId>org.apache.hbase</groupId>
  9.     <artifactId>hbase-client</artifactId>
  10.     <version>2.1.0</version>
  11. </dependency>   
复制代码

5. 配置HBase数据库连接

普通项目
  1. // 数据读写API
  2. HBaseTemplate hBaseTemplate = new HBaseTemplate("node1", "2181");
  3. // 管理员API
  4. HBaseAdminTemplate hBaseAdminTemplate = new HBaseAdminTemplate("node1", "2181");
  5. // HQL操作API
  6. HBaseSqlTemplate hBaseSqlTemplate = new HBaseSqlTemplate("localhost", "2181");
复制代码

spring boot项目

application.yaml

  1. spring:
  2.   data:
  3.     hbase:
  4.       quorum: node1,node2,node3
  5.       node-parent: /hbase
  6.       zk-client-port: 2181
  7.       root-dir: /hbase
  8.       client-properties: hbase.client.retries.number=3
  9. @Autowired 依赖注入
  10. @Service
  11. public class UserService {
  12.     @Autowired
  13.     private HBaseTemplate hBaseTemplate;
  14.     @Autowired
  15.     private HBaseAdminTemplate hBaseAdminTemplate;
  16. }
复制代码


集群管理

HBaseAdminTemplate封装了HBaseAdmin的常用操作,比如namespace的管理、表的管理、以及快照管理等等,后续这些API将会更加完善。

2021-05-19_202912.jpg

创建namespace

  1.     @Test
  2.     public void testCreateNamespace() {
  3.         String namespaceName = "LEO_NS";
  4.         
  5.         NamespaceDesc namespaceDesc = new NamespaceDesc();
  6.         namespaceDesc.setNamespaceName(namespaceName);
  7.         // 为namespace添加属性
  8.         namespaceDesc = namespaceDesc.addNamespaceProp("desc", "测试命名空间")
  9.                 .addNamespaceProp("createBy", "leo").addNamespaceProp("updateBy", "admin");
  10.         hBaseTemplate.createNamespace(namespaceDesc);
  11.     }
复制代码

创建表

  1.     @Test
  2.     public void testCreateTable() {
  3.         String tableName = "LEO_NS:USER";
  4.         TableDesc tableDesc = new TableDesc();
  5.         tableDesc.setTableName(tableName);
  6.         tableDesc = tableDesc.addProp("tag", "测试用户表").addProp("createUser", "leo");
  7.         FamilyDesc familyDesc1 = new FamilyDesc.Builder()
  8.                 .familyName("INFO")
  9.                 .replicationScope(1)
  10.                 .compressionType("NONE")
  11.                 .timeToLive(2147483647)
  12.                 .maxVersions(1).build();
  13.         FamilyDesc familyDesc2 = new FamilyDesc.Builder()
  14.                 .familyName("INFO2")
  15.                 .replicationScope(0)
  16.                 .compressionType("SNAPPY")
  17.                 .timeToLive(864000)
  18.                 .maxVersions(3).build();
  19.         tableDesc = tableDesc.addFamilyDesc(familyDesc1).addFamilyDesc(familyDesc2);
  20.         hBaseTemplate.createTable(tableDesc, false);
  21.     }
复制代码

更多操作

可以参考相关API文档或测试用例

数据读写

类似于Hibernate,你也可以使用hbase-sdk框架所提供的ORM特性,来实现对HBase的数据读写操作。
2021-05-19_203002.jpg

创建数据模型类

  1. public class ModelEntity {
  2.     private String createBy;
  3.     private Long createTime;
  4.     public String getCreateBy() {
  5.         return createBy;
  6.     }
  7.     public void setCreateBy(String createBy) {
  8.         this.createBy = createBy;
  9.     }
  10.     public Long getCreateTime() {
  11.         return createTime;
  12.     }
  13.     public void setCreateTime(Long createTime) {
  14.         this.createTime = createTime;
  15.     }
  16. }
  17. @HBaseTable(schema = "TEST", name = "LEO_USER", uniqueFamily = "info1")
  18. public class UserEntity extends ModelEntity{
  19.     @HBaseRowKey
  20.     private String userId;
  21.     private String username;
  22.     private int age;
  23.     private List<String> addresses;
  24.     private Map<String,Object> contactInfo;
  25.     private Double pay;
  26.     @HBaseColumn(name = "is_vip", family = "INFO2", toUpperCase = true)
  27.     private boolean isVip;
  28.     public String getUserId() {
  29.         return userId;
  30.     }
  31.     public void setUserId(String userId) {
  32.         this.userId = userId;
  33.     }
  34.     public String getUsername() {
  35.         return username;
  36.     }
  37.     public void setUsername(String username) {
  38.         this.username = username;
  39.     }
  40.     public int getAge() {
  41.         return age;
  42.     }
  43.     public void setAge(int age) {
  44.         this.age = age;
  45.     }
  46.     public boolean isVip() {
  47.         return isVip;
  48.     }
  49.     public void setVip(boolean vip) {
  50.         isVip = vip;
  51.     }
  52.     public List<String> getAddresses() {
  53.         return addresses;
  54.     }
  55.     public void setAddresses(List<String> addresses) {
  56.         this.addresses = addresses;
  57.     }
  58.     public Map<String, Object> getContactInfo() {
  59.         return contactInfo;
  60.     }
  61.     public void setContactInfo(Map<String, Object> contactInfo) {
  62.         this.contactInfo = contactInfo;
  63.     }
  64.     public Double getPay() {
  65.         return pay;
  66.     }
  67.     public void setPay(Double pay) {
  68.         this.pay = pay;
  69.     }
  70.     @Override
  71.     public String toString() {
  72.         return "UserEntity{" +
  73.                 "userId='" + userId + '\'' +
  74.                 ", username='" + username + '\'' +
  75.                 ", age=" + age +
  76.                 ", addresses=" + addresses +
  77.                 ", contactInfo=" + contactInfo +
  78.                 ", pay=" + pay +
  79.                 ", isVip=" + isVip +
  80.                 '}';
  81.     }
  82. }
  83. @HBaseTable(schema = "TEST", name = "LEO_USER", uniqueFamily = "info1")
复制代码

HBaseTable注解用于定义HBase的表信息,schema用于定义该表的命名空间,如果不指定,默认是default, name用于定义该表的表名,如果不指定,表名则为类名的组合单词拆分加'_'拼接,如:UserEntity对应的表名为:user_entity。uniqueFamily用于定义如果所有的字段不特配置列簇名,则使用此处配置的列簇名。

@HBaseRowKey private String userId;

该注解表示userId字段为rowKey字段。

@HBaseColumn(name = "is_vip", family = "INFO2", toUpperCase = true) private boolean isVip; 该注解用于定义一个字段信息,name用于定义字段名,如果不指定,则默认使用字段名的组合单词拆分加'_'拼接,如:isVip,对应的字段名是:is_vip. family用于定义该字段属于INFO2列簇,toUpperCase表示字段名是否转大写,默认false,不做操作。

保存数据

  1.    @Test
  2.     public void testSaveUser() {
  3.         UserEntity userEntity = new UserEntity();
  4.         userEntity.setUserId("10001");
  5.         userEntity.setUsername("leo");
  6.         userEntity.setAge(18);
  7.         userEntity.setVip(true);
  8.         userEntity.setAddresses(Arrays.asList("北京", "上海"));
  9.         userEntity.setCreateBy("admin");
  10.         userEntity.setCreateTime(System.currentTimeMillis());
  11.         Map<String, Object> contactInfo = new HashMap<>(2);
  12.         contactInfo.put("email", "2326130720@qq.com");
  13.         contactInfo.put("phone", "18739577988");
  14.         contactInfo.put("address", "浦东新区");
  15.         userEntity.setContactInfo(contactInfo);
  16.         userEntity.setPay(100000.0d);
  17.         try {
  18.             hBaseTemplate.save(userEntity);
  19.             System.out.println("用户数据保存成功!");
  20.         } catch (Exception e) {
  21.             e.printStackTrace();
  22.         }
  23.     }
复制代码

除此之外,保存数据时也可以不必构造数据模型类,而直接构造map数据模型。

  1.     @Test
  2.     public void testToSave() {
  3.         Map<String, Object> data = new HashMap<>();
  4.         data.put("info1:addresses", Arrays.asList("广州", "深圳"));
  5.         data.put("info1:username", "leo");
  6.         data.put("info1:age", 18);
  7.         data.put("INFO2:IS_VIP", true);
  8.         data.put("info1:pay", 10000.1d);
  9.         data.put("info1:create_by", "tom");
  10.         data.put("info1:create_time", System.currentTimeMillis());
  11.         Map<String, Object> contactInfo = new HashMap<>(2);
  12.         contactInfo.put("email", "2326130720@qq.com");
  13.         contactInfo.put("phone", "18739577988");
  14.         contactInfo.put("address", "浦东新区");
  15.         data.put("info1:contact_info", contactInfo);
  16.         hBaseTemplate.save("TEST:LEO_USER", "10002", data);
  17.         System.out.println("用户数据保存成功!");
  18.     }
复制代码

批量保存数据

  1.     @Test
  2.     public void testToSaveBatch() {
  3.         Map<String, Map<String, Object>> data = new HashMap<>();
  4.         Map<String, Object> data1 = new HashMap<>();
  5.         data1.put("info1:username", "kangkang");
  6.         data1.put("info1:age", 18);
  7.         data1.put("INFO2:IS_VIP", true);
  8.         Map<String, Object> data2 = new HashMap<>();
  9.         data2.put("info1:username", "jane");
  10.         data2.put("info1:age", 18);
  11.         data2.put("INFO2:IS_VIP", false);
  12.         data.put("12003", data1);
  13.         data.put("11004", data2);
  14.         hBaseTemplate.saveBatch("TEST:LEO_USER", data);
  15.         System.out.println("用户数据批量保存成功!");
  16.     }
复制代码

根据RowKey查询

  1.     @Test
  2.     public void testGet() {
  3.         UserEntity userEntity = hBaseTemplate.getByRowKey("10001", UserEntity.class);
  4.         final UserEntity userEntity1 = hBaseTemplate.getByRowKey("10002", UserEntity.class);
  5.         System.out.println("用户数据获取成功!");
  6.         System.out.println(userEntity);
  7.     }
  8.     @Test
  9.     public void testGetToMap() {
  10.         Map<String, Object> userInfo = hBaseTemplate.getByRowKey("TEST:LEO_USER", "10001");
  11.         System.out.println(Boolean.valueOf(userInfo.get("INFO2:IS_VIP").toString()));
  12.         System.out.println(userInfo);
  13.     }
复制代码

scan查询

  1.     @Test
  2.     public void testFind() {
  3.         final List<UserEntity> userEntities = hBaseTemplate.findAll(10, UserEntity.class);
  4.         System.out.println(userEntities);
  5.         System.out.println("用户数据批量查询");
  6.     }
  7.     @Test
  8.     public void testFindByPrefix() {
  9.         final List<UserEntity> userEntities = hBaseTemplate.findByPrefix("11", 10, UserEntity.class);
  10.         System.out.println("用户数据批量查询");
  11.     }
复制代码

删除数据
  1. <div>    @Test
  2.     public void testDeleteData() {
  3.         hBaseTemplate.delete("TEST:LEO_USER", "12003");
  4.         hBaseTemplate.delete("TEST:LEO_USER", "11004", "INFO2");
  5.         hBaseTemplate.delete("TEST:LEO_USER", "10001", "info1", "addresses");
  6.         System.out.println("数据删除完成");
  7.     }
  8.     @Test
  9.     public void testDeleteBatch() {
  10.         hBaseTemplate.deleteBatch("TEST:LEO_USER", Arrays.asList("10001", "10002"));
  11.         hBaseTemplate.deleteBatch("TEST:LEO_USER", Collections.singletonList("10003"), "INFO2");
  12.         hBaseTemplate.deleteBatch("TEST:LEO_USER", Collections.singletonList("10004"),
  13.                 "info1", "age", "username");
  14.     }
  15. </div>
复制代码

HQL

hbase-sdk 从2.0.6版本开始,开始提供HQL功能,一种以类SQL的方式读写HBase集群的数据,降低API的使用复杂度。HQL的操作依赖HBaseSqlTemplate来完成, 因此使用之前,必须构造好HBaseSqlTemplate的对象实例。
2021-05-19_203255.jpg

构造HBaseSqlTemplate的示例。

  1.     private HBaseSqlTemplate hBaseSqlTemplate;
  2.     @Before
  3.     public void testInitHBaseSqlTemplate() {
  4.         hBaseSqlTemplate = new HBaseSqlTemplate("localhost", "2181");
  5.         List<HBaseColumnSchema> hBaseColumnSchemas = createHBaseColumnSchemaList();
  6.         HBaseTableSchema hBaseTableSchema = new HBaseTableSchema();
  7.         hBaseTableSchema.setTableName("LEO_USER");
  8.         hBaseTableSchema.setDefaultFamily("g");
  9.         //hBaseTableSchema.setRowKeyHandlerName("string");
  10.         HBaseTableConfig hBaseTableConfig = new DefaultHBaseTableConfig(hBaseTableSchema, hBaseColumnSchemas);
  11.         hBaseSqlTemplate.setHBaseTableConfig(hBaseTableConfig);
  12.     }
  13.         public List<HBaseColumnSchema> createHBaseColumnSchemaList() {
  14.             List<HBaseColumnSchema> hBaseColumnSchemas = new ArrayList<>();
  15.    
  16.             HBaseColumnSchema hBaseColumnSchema1 = new HBaseColumnSchema();
  17.             hBaseColumnSchema1.setFamily("g");
  18.             hBaseColumnSchema1.setQualifier("id");
  19.             hBaseColumnSchema1.setTypeName("string");
  20.    
  21.             HBaseColumnSchema hBaseColumnSchema2 = new HBaseColumnSchema();
  22.             hBaseColumnSchema2.setFamily("g");
  23.             hBaseColumnSchema2.setQualifier("name");
  24.             hBaseColumnSchema2.setTypeName("string");
  25.    
  26.             HBaseColumnSchema hBaseColumnSchema3 = new HBaseColumnSchema();
  27.             hBaseColumnSchema3.setFamily("g");
  28.             hBaseColumnSchema3.setQualifier("age");
  29.             hBaseColumnSchema3.setTypeName("int");
  30.    
  31.             HBaseColumnSchema hBaseColumnSchema4 = new HBaseColumnSchema();
  32.             hBaseColumnSchema4.setFamily("g");
  33.             hBaseColumnSchema4.setQualifier("address");
  34.             hBaseColumnSchema4.setTypeName("string");
  35.    
  36.             hBaseColumnSchemas.add(hBaseColumnSchema1);
  37.             hBaseColumnSchemas.add(hBaseColumnSchema2);
  38.             hBaseColumnSchemas.add(hBaseColumnSchema3);
  39.             hBaseColumnSchemas.add(hBaseColumnSchema4);
  40.    
  41.             return hBaseColumnSchemas;
  42.         }
复制代码

构造hBaseSqlTemplate示例需要先构造HBaseTableConfig,HBaseTableConfig的两个成员变量,

  1.     protected HBaseTableSchema hBaseTableSchema;
  2.     protected  List<HBaseColumnSchema> hBaseColumnSchemaList;
复制代码

分别用来表的Schema信息和HBase表对应列的元数据信息。

针对HBase表列的数据类型转换,目前内置的实现有:

Boolean、Byte、Char、Date、Double、Float、Hex、Int、Long、Short、String

通过实现LiteralInterpreter接口,你可以定义自己的列数据类型转换实现。

  1. {
  2. "tableName":"TEST:USER",
  3. "defaultFamily":"INFO",
  4. "columnSchema":[
  5.   {
  6.    "family":"INFO",
  7.    "qualifier":"name",
  8.    "typeName":"string"
  9.   },
  10.   {
  11.    "family":"INFO2",
  12.    "qualifier":"age",
  13.    "typeName":"int"
  14.   }
  15. ]
  16. }
复制代码

通过实现相应的接口,你可以选择加载HBase表、列元数据信息的方式。如:类型myBatis在XML文件中加载。

HBaseSqlTemplate的实例准备好之后,就可以使用HQL来进行数据读写。

insert

  1. insert into LEO_USER ( g:id , g:name , g:age , g:address ) values ( '10001', 'leo1' , '18', 'shanghai' ) where rowKey is stringkey ( 'a10002' ) ts is '1604160000000'
  2. insert into LEO_USER ( g:id , g:name , g:age , g:address ) values ( '10002', 'leo2' , '17', 'beijing' ) where rowKey is stringkey ( 'a10002' )
  3.     @Test
  4.     public void testInsertSql() {
  5.         String sql = "insert into LEO_USER ( g:id , g:name , g:age , g:address ) values ( '10001', 'leo' , '18', 'shanghai' ) where rowKey is stringkey ( 'a10002' ) ts is '1604160000000'";
  6.         hBaseSqlTemplate.insert(sql);
  7.         System.out.println("insert successfully!");
  8.     }
复制代码

select
  1. select ( g:id , g:name , g:age , g:address ) from LEO_USER where startKey is stringkey ( 'a10001' ) , endKey is stringkey ( 'a10002' ) ( ( name equal 'leo' and age less '12' ) or ( id greater '10000' ) )  maxversion is 2  startTS is '1604160000000' , endTS is '1604160000001' limit 1, 10
  2. select * from LEO_USER where startKey is stringkey ( 'a10001' ) , endKey is stringkey ( 'a10002' ) ( ( name equal 'leo1' and age less '20' ) or ( id greater '10000' ) )  maxversion is 2  startTS is '1604160000000' , endTS is '1604160000001' limit 10
  3.     @Test
  4.     public void testSelectSql() {
  5.         String sql = "select ( g:id , g:name , g:age , g:address ) from LEO_USER where startKey is stringkey ( 'a10001' ) , endKey is stringkey ( 'a10002' ) ( ( name equal 'leo' and age less '12' ) or ( id greater '10000' ) )  maxversion is 2  startTS is '1604160000000' , endTS is '1604160000001' limit 10 ";
  6.         sql = "select * from LEO_USER where startKey is stringkey ( 'a10001' ) , endKey is stringkey ( 'a10002' ) ( ( name equal 'leo' and age less '12' ) or ( id greater '10000' ) )  maxversion is 2  startTS is '1604160000000' , endTS is '1604160000001' limit 10 ";
  7.         final List<List<HBaseCellResult>> listList = hBaseSqlTemplate.select(sql);
  8.         listList.forEach(dataList -> {
  9.             dataList.forEach(data -> {
  10.                 System.out.println(data.getRowKey());
  11.                 System.out.println(data.getFamilyStr());
  12.                 System.out.println(data.getQualifierStr());
  13.                 System.out.println(data.getTsDate());
  14.                 System.out.println("########################################");
  15.             });
  16.         });
  17.     }
复制代码

delete
  1. delete ( id , name ) from LEO_USER where startKey is stringkey ( 'a10001' ) , endKey is stringkey ( 'a10003' ) ( ( name equal 'leo' and age less '12' ) or ( id greater '10000' ) ) ts is '1604160000000'
  2. delete * from LEO_USER where startKey is stringkey ( 'a10001' ) , endKey is stringkey ( 'a10003' ) ( ( name equal 'leo' and age less '12' ) or ( id greater '10000' ) ) ts is '1604160000000'
  3. delete * from LEO_USER where rowKey is stringkey ( 'a10002' ) ( name equal 'leo2' or age less '21' ) ts is '1604160000000'
  4.     @Test
  5.     public void testDeleteSql(){
  6.         String sql = "delete ( id , name ) from LEO_USER where startKey is stringkey ( 'a10001' ) , endKey is stringkey ( 'a10003' ) ( ( name equal 'leo' and age less '12' ) or ( id greater '10000' ) ) ts is '1604160000000'";
  7.         sql = "delete * from LEO_USER where startKey is stringkey ( 'a10001' ) , endKey is stringkey ( 'a10003' ) ( ( name equal 'leo' and age less '12' ) or ( id greater '10000' ) ) ts is '1604160000000'";
  8.         sql = "delete * from LEO_USER where rowKey is stringkey ( 'a10002' ) ( name equal 'leo' or age less '21' ) ts is '1604160000000'";
  9.         hBaseSqlTemplate.delete(sql);
  10.     }
复制代码


特别鸣谢

HQL的语法设计以及antlr4的语法解析,有参考alibaba的开源项目 simplehbase,在此特别感谢。simplehbase感觉是一个被遗弃的项目,针对的HBase版本是0。94, 已经有超过6年没有维护了。

hbase-sdk 在simplehbase的基础上进行重组和解耦,以兼容hbase-sdk原有的框架设计,并便于以后的扩展。
hbase-sdk 目前的不足

非HQL的数据读写API还不丰富,特别是数据过滤的查询API。

HQL的antlr4解析功能不太完善,比如,目前HQL对中文要求不太好,同时,HQL对语法的要求比较严格,多一个空格少一个空格貌似都会引起语法错误。后续会针对这些缺点一一优化。


作者:介龙平
来源:https://mp.weixin.qq.com/s/_Vcco7MX6qSNlDNodnn_WA


最新经典文章,欢迎关注公众号


没找到任何评论,期待你打破沉寂

您需要登录后才可以回帖 登录 | 立即注册

本版积分规则

关闭

推荐上一条 /2 下一条