1.15.1 创建 DLI 表关联 HBase
功能描述
使用CREATE TABLE命令创建DLI表并关联HBase上已有的表,该语法支持CloudTable 服务HBase集群、MRS服务HBase实例以及自建HBase集群。
前提条件
● 创建DLI表关联HBase之前需要创建跨源连接。管理控制台操作请参考经典型跨源
连接和增强型跨源连接。
● 请确保在DLI队列host文件中添加MRS集群master节点的“/etc/hosts”信息。
如何添加IP域名映射,请参见《数据湖探索用户指南》中增强型跨源连接章节。
语法格式
● 单个RowKey
CREATE TABLE [IF NOT EXISTS] TABLE_NAME ( ATTR1 TYPE,
ATTR2 TYPE, ATTR3 TYPE)
USING [CLOUDTABLE | HBASE] OPTIONS (
'ZKHost'='xx',
'TableName'='TABLE_IN_HBASE', 'RowKey'='ATTR1',
'Cols'='ATTR2:CF1.C1, ATTR3:CF1.C2');
● 组合RowKey
CREATE TABLE [IF NOT EXISTS] TABLE_NAME ( ATTR1 String,
ATTR2 String, ATTR3 TYPE)
USING [CLOUDTABLE | HBASE] OPTIONS ( 'ZKHost'='xx',
'TableName'='TABLE_IN_HBASE', 'RowKey'='ATTR1:2, ATTR2:10', 'Cols'='ATTR2:CF1.C1, ATTR3:CF1.C2', 'krbauth'='KRB_AUTH_NAME');
关键字
表1-43 CREATE TABLE 参数描述
参数 描述
USING [CLOUDT ABLE | HBASE]
指定hbase datasource,"CLOUDTABLE"或"HBASE"二选一,大小写不 敏感。
ZKHost HBase集群的ZK连接地址。
获取ZK连接地址需要先创建跨源连接,管理控制台操作请参考经典型跨
源连接和增强型跨源连接。
● 访问CloudTable集群,填写ZK连接地址(内网)。
● 访问MRS集群,填写ZK所在节点IP与ZK对外端口,格式为:
"ZK_IP1:ZK_PORT1,ZK_IP2:ZK_PORT2"。
说明访问MRS集群,只支持创建增强型跨源连接并且需要配置主机信息,管理控制台
操作请参考增强型跨源连接,相关API信息请参考创建增强型跨源连接。
TableNa
me 指定在HBase集群中已创建的表名。
RowKey 指定作为rowkey的dli关联表字段,支持单rowkey与组合rowkey。单 rowkey支持数值与String类型,不需要指定长度。组合rowkey仅支持 String类型定长数据,格式为:属性名1:长度,属性名2:长度。
Cols 通过逗号分隔的DLI表字段与HBase表的列之间的对应关系。其中,冒号 前面放置DLI表字段,冒号后面放置HBase表信息,用‘.’分隔HBase 表的列族与列名。
krbauth 创建跨源认证的认证名。如果创建的MRS集群未开启kerb认证的集群,
请确保在DLI队列host文件中添加MRS集群master节点的“/etc/hosts”
信息。
注意事项
● 若所要创建的表已经存在将报错,可以通过添加IF NOT EXISTS参数跳过该错误。
● OPTIONS中的所有参数是必选的,参数名称大小写不敏感,但参数值大小写敏 感。
● OPTIONS中引号内的值前后不能带空格,空格也会被当做有效值。
● 表名及列名的描述仅支持字符串常量。
● 创建表时要说明列名及对应的数据类型,目前支持的数据类型为:boolean、
short、int、long、float、double和string。
● 作为RowKey的字段(如上述语法格式中的ATTR1),其值不能为null,长度要大 于0,小于或等于32767。
● Cols与RowKey中的字段加起来的数量必须与DLI表的字段保持一致,即表中所有 的字段都到对应到Cols和RowKey中,但是顺序可以任意。
● 组合Rowkey只支持String类型,在使用组合Rowkey时,每个属性后面必须带上长 度。当Rowkey指定的字段只有一个的时候,该字段的类型可以是支持的所有数据 类型,并且不需要填写长度。
● 在组合Rowkey的场景中
– 插入Rowkey数据时,如果某个属性的实际数据的长度比属性作为Rowkey时 指定的长度要短,则会在数据后面补'\0'字符;如果某个属性的实际数据的长 度比属性作为Rowkey时指定的长度要长,则会在实际插入HBase的时候进行 截断。
– 读取HBase上的Rowkey数据时,如果某个属性的实际数据的长度比属性作为 Rowkey时指定的长度要短,则会抛出异常(OutofBoundException);如果 某个属性的实际数据的长度比属性作为Rowkey时指定的长度要长,则会在读 取时进行截断。
示例
CREATE TABLE test_hbase(
ATTR1 int, ATTR2 int, ATTR3 string)
using hbase OPTIONS (
'ZKHost'='to-hbase-1174405101-CE1bDm5B.datasource.com:2181', 'TableName'='HBASE_TABLE',
'RowKey'='ATTR1',
'Cols'='ATTR2:CF1.C1, ATTR3:CF1.C2');
1.15.2 插入数据至 HBase 表
功能描述
INSERT INTO命令将DLI表中的数据插入到已关联的hbase表中。
语法格式
● 将SELECT查询结果插入到表中:
INSERT INTO DLI_TABLE SELECT field1,field2...
[FROM DLI_TEST]
[WHERE where_condition]
[LIMIT num]
[GROUP BY field]
[ORDER BY field] ...;
● 将某条数据插入到表中:
INSERT INTO DLI_TABLE
VALUES values_row [, values_row ...];
关键字
SELECT对应关键字说明请参考SELECT基本语句。
参数说明
表1-44 参数描述
参数 描述
DLI_TABLE 创建的DLI表名称,为插入数据的目的表。
DLI_TEST 为包含待查询数据的表。
field1,field2...,field 表“DLI_TEST”中的列值,需要匹配表“DLI_TABLE”的 列值和类型。
where_condition 查询过滤条件。
num 对查询结果进行限制,num参数仅支持INT类型。
values_row 想要插入到表中的值,列与列之间用逗号分隔。
注意事项
● DLI表必须已经存在。
● 在“创建表关联HBase”章节创建的表中,OPTIONS里的Cols指定的列族如果不 存在,insert into执行时会报错。
● 如果插入的(rowkey, 列族, 列)已存在,则执行插入操作时,会覆盖hbase中相同 的(rowkey, 列族, 列)。
● 不建议对同一张表并发插入数据,因为有一定概率发生并发冲突,导致插入失 败。
● 不支持INSERT OVERWRITE语法。
示例
● 查询表“user”中的数据插入表“test”中。
INSERT INTO test SELECT ATTR_EXPR FROM user
WHERE user_name='cyz' LIMIT 3
GROUP BY user_age
● 插入数据“1”到表“test”中
INSERT INTO test VALUES (1);
1.15.3 查询 HBase 表
SELECT命令用于查询hbase表中的数据。
语法格式
SELECT * FROM table_name LIMIT number;
关键字
LIMIT:对查询结果进行限制,number参数仅支持INT类型。
注意事项
所查询的表必须是已经存在的表,否则会出错。
示例
查询表test_ct中的数据。
SELECT * FROM test_hbase limit 100;
查询下压
通过hbase进行数据过滤,即HBase Client将过滤条件传给HBase服务端进行处理,
HBase服务端只返回用户需要的数据,提高了Spark SQL查询的速度。对于HBase不支 持的过滤条件,例如组合Rowkey的查询,直接由Spark SQL进行。
● 支持查询下压的场景 – 数据类型场景
▪
Int▪
boolean▪
short▪
long▪
double▪
string说明
float类型数据不支持查询下压。
– 过滤条件场景
▪
过滤条件为>,<,>=,<=,=,!=,and,or 例如:select * from tableName where (column1 >= value1 and column2<= value2) or column3 !
= value3
▪
过滤条件为like 和 not like,支持前缀,后缀和包含匹配 例如:select * from tableName where column1 like "%value" or column2 like "value%" or column3 like "%value%"
▪
过滤条件为IsNotNull() 例如:select * from tableName where IsNotNull(column)
▪
过滤条件为in ,not in 例如:select * from tableName where column1 in (value1,value2,value3) and column2 not in (value4,value5,value6)
▪
过滤条件为between _ and _ 例如:select * from tableName where column1 between value1 and value2
▪
组合rowkey中的子rowkey过滤例如,组合Rowkey为column1+column2+column3,进行子rowkey查 询:
select * from tableName where column1= value1
● 不支持查询下压的场景 – 数据类型场景
除上述支持的数据类型外,其余复杂数据类型不支持查询下压。
– 过滤条件场景
▪
length,count,max,min,join,groupby,orderby,limit和avg等▪
过滤条件为列比较例如:
select * from tableName where column1 > (column2+column3)