本文介绍如何使用SQL语句访问HBase表。
前提条件
- 通过HBase Java API连接宽表引擎。具体操作,请参见通过HBase Java API连接并使用宽表引擎。
- HBase增强版或Lindorm宽表引擎版本需为2.4.0及以上版本。
背景信息
Lindorm宽表引擎支持直接访问通过HBase Shell或HBase Java API创建的数据表。但是HBase是Schema-free的,HBase中的列会被当做动态列处理,类型为VARBINARY,即Byte。关于动态列的详细信息,请参见动态列。为了能够在基于HBase API写入的列上使用Lindorm SQL,同时使用丰富的数据类型和二级索引,云数据库HBase提供了HBase列映射功能以及HBase兼容类型。
语法
在Lindorm SQL中,对Hbase表中自定义Column Family中的Qualifier添加映射,方便后续使用SQL进行查询。
添加和移除映射的语法如下:
dynamic_column_mapping_statement := ALTER TABLE table_name MAP DYNAMIC COLUMN
qualifer_definition hbase_type;
dynamic_column_unmapping_statement := ALTER TABLE table_name UNMAP DYNAMIC COLUMN
qualifer_definition_list;
qualifer_definition_list := qualifer_definition
(',' qualifer_definition)*
qualifer_definition := [ family_name ':' ] qualifier_name
hbase_type := HLONG | HINTEGER | HSHORT | HFLOAT |
HDOUBLE | HSTRING | HBOOLEAN
其中,hbase_type可指定的映射数据类型如下表所示:
数据类型 | 对应的Java类型 | 描述 |
---|---|---|
HLONG | java.lang.Long | 使用Bytes.toBytes(long)方式写入HBase的列。 |
HINTEGER | java.lang.Integer | 使用Bytes.toBytes(int)方式写入HBase的列。 |
HSHORT | java.lang.Short | 使用Bytes.toBytes(short)方式写入HBase的列。 |
HFLOAT | java.lang.Float | 使用Bytes.toBytes(float)方式写入HBase的列。 |
HDOUBLE | java.lang.Double | 使用Bytes.toBytes(double)方式写入HBase的列。 |
HSTRING | java.lang.String | 使用Bytes.toBytes(String)方式写入HBase的列。 |
HBOOLEAN | java.lang.Boolean | 使用Bytes.toBytes(boolean)方式写入HBase的列. |
说明
- 宽表引擎版本2.5.1及以上版本支持对Rowkey的映射,映射方法与其他Qualifier相同。映射对象固定为ROW且ROW关键字需要用反引号(``)引用。
- 如果使用其他语言,您可以参考Java类org.apache.hadoop.hbase.util.Bytes中的toBytes方法对数据进行编码写入。
- Java中Bytes.toBytes(String)采用UTF-8编码,其他语言利用toBytes将String转成Bytes时,也需要使用UTF-8编码。
操作步骤
以下以访问示例表dt为例,介绍如何使用SQL访问HBase表。
- 创建HBase表,并写入数据。
- 通过Lindorm-cli连接并使用宽表引擎。具体操作,请参见通过Lindorm-cli连接并使用宽表引擎。说明 如果您在HBase增强版中使用SQL访问HBase表,需要将控制台获取的地址拼接成
jdbc:lindorm:table:url=http://控制台上获取的Java API地址
的形式,端口需要由30020修改为30060。例如:在控制台上获取的连接串地址为
ld-bp1ietqp4fby3****-proxy-hbaseue.hbaseue.rds.aliyuncs.com:30020
,转换后的连接串地址为jdbc:lindorm:table:url=http://ld-bp1ietqp4fby3****-proxy-hbaseue.hbaseue.rds.aliyuncs.com:30060
。 - 使用ALTER TABLE语句对写入dt表的数据添加列映射。
ALTER TABLE dt MAP DYNAMIC COLUMN `ROW` HSTRING, f1:name HSTRING, f1:age HINTEGER, f1:time HLONG, f1:buycode HSHORT, f1:price HFLOAT, f1:price2 HDOUBLE, f1:isMale HBOOLEAN;
说明- 添加列映射是指定列的数据类型,与是否写入数据无关。
- 系统会根据Schema从Bytes中反解出原始数值,因此映射到Lindorm SQL时必须使用正确的数据类型。
以下示例中,如果用户把f:age2列的数据类型写为HINTEGER,系统调用Bytes.toInt()方法会反解出错误的原始值。
int age = 25; byte[] ageValue = Bytes.toBytes(age); put.addColumn(Bytes.toBytes("f"), Bytes.toBytes("age"), ageValue);//f:age列的数据类型为INT,映射到Lindorm SQL为HINTEGER类型。 String age2 = "25"; byte[] age2Value = Bytes.toBytes(name); put.addColumn(Bytes.toBytes("f"), Bytes.toBytes("age2"), age2Value);//f:age2列的数据类型为STRING,映射到Lindorm SQL为HSTRING类型。
- 通过DESCRIBE语句查看当前Schema的映射关系。
DESCRIBE dt;
说明 如果想了解DESCRIBE TABLE语法的详细信息,请参见DESCRIBE/SHOW/USE。 - 通过SQL语句查询dt表中的数据。
SELECT * FROM dt LIMIT 1; SELECT * FROM dt WHERE f1:isMale=true LIMIT 1; SELECT * FROM dt WHERE f1:name='Some one' LIMIT 1; SELECT * FROM dt WHERE f1:time>1656675490000 and f1:time<1656675492000 LIMIT 1;
- 创建二级索引。
二级索引是一种空间换时间的解决方案,它有利于提升非主键查询模式的查询效率,但需要占用一些存储空间。关于二级索引的语法使用限制,请参见CREATE INDEX和二级索引。
- 可选:删除列映射。
- 移除一个列映射。示例代码如下:
ALTER TABLE dt UNMAP DYNAMIC COLUMN f1:isMale;
- 移除多个列映射。示例代码如下:
ALTER TABLE dt UNMAP DYNAMIC COLUMN f1:price2, f1:price2;
- 移除一个列映射。示例代码如下: