本文介绍Lindorm计算引擎访问宽表引擎数据(包括关系表和HBase表)的相关内容。

表的类型

Lindorm计算引擎访问宽表引擎支持两种类型的表:
  • 关系表:表示通过Lindorm宽表SQL进行读写的表。
  • HBase表:表示通过HBase客户端进行读写的表。
Lindorm计算引擎访问宽表引擎数据(包括关系表和HBase表)的相关内容如下:
内容 关系表 HBase表
访问方式 使用SQL直接访问。 需要先为HBase表设置LINDORM_HBASE_CATALOG属性,设置方法请参见为HBase表设置表属性
支持的数据类型 支持的数据类型
支持的语法 支持的语法

为HBase表设置表属性

Lindorm计算引擎访问宽表引擎中的HBase表时,需要先为HBase表设置LINDORM_HBASE_CATALOG属性,该属性表示SparkSQL Schema与HBase表Schema的对应关系。LINDORM_HBASE_CATALOG属性值为一个JSON,如下所示:
说明 LINDORM_HBASE_CATALOG属性中所有的字段和值都区分大小写。
{
  "table": {"namespace": "hbase", "name": "table1"},
  "rowkey": "hbase_rowkey1:hbase_rowkey2",
  "columns": {
    "SQL_PK1": {"cf": "rowkey", "col": "hbase_rowkey1", "type": "int"},
    "SQL_PK2": {"cf": "rowkey", "col": "hbase_rowkey2", "type": "string"},
    "SQL_COL1": {"cf": "cf", "col": "hbase_qualifier1", "type": "short"},
    "SQL_COL2": {"cf": "cf", "col": "hbase_qualifier2", "type": "string"}
  }
}
参数 示例 描述
table "namespace": "hbase", "name": "table1" HBase表的Namespace和表名称。
  • namespace:HBase表的Namespace。
  • name:HBase表的表名称。
rowkey hbase_rowkey1:hbase_rowkey2表示rowkey由hbase_rowkey1和hbase_rowkey2组成,那么columns中需要有两个字段的"cf:rowkey",并且col字段分别为hbase_rowkey1和hbase_rowkey2。 HBase表的rowkey字段组成,需要与columns参数中"cf:rowkey"的字段col定义保持一致。
columns "SQL_PK1": {"cf": "rowkey", "col": "hbase_rowkey1", "type": "int"} SQL字段与HBase表字段的对应信息,每个SQL字段的定义由字段名称,对应的 HBase字段及类型组成。
  • SQL_PK1:字段名称,可以自定义,使用SparkSQL访问时使用该字段名称。
  • cfcol:SQL字段对应的HBase columnFamily和qualifier,其中rowkey字段的cf需要定义为rowkey,rowkey由多个字段构成时,string或者binary只能为最后一个字段。
  • type:SQL字段对应的类型,SparkSQL根据type定义来进行字段解析,支持的字段类型请参考支持的数据类型
为HBase表设置LINDORM_HBASE_CATALOG属性有两种方法:
  • 通过HBase shell方式:
    alter 'hbase:table1', METADATA => { 'LINDORM_HBASE_CATALOG' => '<CATALOG_JSON>' }
  • 通过HBase Java API方式:
    HTableDescriptor tableDescriptor = admin.getTableDescriptor(TableName.valueOf(tableName));
    tableDescriptor.setValue("LINDORM_HBASE_CATALOG", catalogJSON);
    admin.modifyTable(tableDescriptor.build());
示例
HBase表的Namespace为hbase,表名称为table1。该表的rowkey字段由一个string组成,有一个columnFamily名为 cf,该columnFamily中有两个qualifier:col1(int类型)和col2(string类型)。通过Lindorm计算引擎访问该HBase表,使用pk字段对应rowkey字段,col1对应"cf:col1"字段,col2对应"cf:col2"字段。
  1. HBase表的LINDORM_HBASE_CATALOG属性值如下:
    {
      "table": {"namespace": "hbase", "name": "table1"},
      "rowkey": "rk1",
      "columns": {
        "pk": {"cf": "rowkey", "col": "rk1", "type": "string"},
        "col1": {"cf": "cf", "col": "col1", "type": "int"},
        "col2": {"cf": "cf", "col": "col2", "type": "string"}
      }
    }
  2. 使用HBase shell设置表属性。
    ALTER 'hbase:table1', METADATA => { 'LINDORM_HBASE_CATALOG' => '<CATALOG_JSON>' }
  3. 通过JDBC方式连接Lindorm计算引擎,具体操作请参见通过JDBC连接计算引擎并访问Lindorm数据
  4. 执行以下语句查询HBase表的数据。
    SELECT pk, col1 FROM lindorm_table.hbase.table1 LIMIT 5;

支持的数据类型

Lindorm计算引擎访问宽表引擎数据时,支持的数据类型如下表:

说明
  • 关于开源Spark语法的数据类型介绍请参见Spark数据类型
  • 下表中的短划线(-)表示不支持该数据类型。
关系表的数据类型 HBase表的数据类型 Spark数据类型 描述
BOOLEAN boolean BooleanType 长度为1字节。定长精确数值类型。值域取决于长度,以及是否为无符号。0表示false,1表示true。
BYTE byte ByteType 长度为1字节。定长精确数值类型。值域取决于长度,以及是否为无符号。
SHORT short ShortType 长度为2字节。定长精确数值类型。值域取决于长度,以及是否为无符号。
INT int IntegerType 长度为4字节。定长精确数值类型。值域取决于长度,以及是否为无符号。
LONG long LongType 长度为8字节。定长精确数值类型。值域取决于长度,以及是否为无符号。
FLOAT float FloatType 长度为4字节。定长非精确数值类型。值域和精度取决于长度、precision和scale,以及是否为无符号。
DOUBLE double DoubleType 长度为8字节。定长非精确数值类型。值域和精度取决于长度、precision和scale,以及是否为无符号。
STRING string StringType 变长二进制类型,支持中文。
VARBINARY - BinaryType 变长二进制类型,作为主键时只能是最后一列主键。
BINARY(N) binary BinaryType 定长二进制类型,N表示字节数。写入数据时,包括两种情况。
  • 若给出的值不足N字节,系统会自动在末尾将缺的字节用0补充。
  • 若超出N字节,则自动截断。
DATE - DateType 日期时间(仅存储日期,不存储时间,在时区转换过程中容易出现日期不对的现象,不推荐使用)。
TIMESTAMP - TimestampType 时间戳。Lindorm默认使用GMT时间(UTC+0时区)读取数据,与中国时区相差8小时。

支持的语法

Lindorm计算引擎访问宽表引擎数据支持的语法包括DDL和DQL。
DDL
  • USE/SHOW/DESCRIBE
    语句 描述 语法
    SHOW CATALOGS 查看所有的Catalog。
    SHOW CATALOGS
    SHOW DATABASES 查看所有的Database。
    SHOW { DATABASES | SCHEMAS } [ LIKE regex_pattern ]
    USE DATABASE 使用某个Database。
    USE database_name
    SHOW TABLES 查看所有的Table。
    SHOW TABLES [ { FROM | IN } database_name ] [ LIKE regex_pattern ]
    DESCRIBE TABLE 查看某个表的详细信息。
    { DESC | DESCRIBE } [ TABLE ] table_identifier
  • INSERT
    语句 描述 语法
    INSERT 在表中插入数据。
    INSERT INTO [ TABLE ] table_identifier [ partition_spec ] [ ( column_list ) ]
        { VALUES ( { value | NULL } [ , ... ] ) [ , ( ... ) ] | query }

    Lindorm计算引擎支持SparkSQLINSERT INTO语法,具体使用方法请参见INSERT使用方法

DQL

Lindorm计算引擎访问宽表引擎数据,仅支持SELECT语句。

语法
select_statement [ { UNION | INTERSECT | EXCEPT } [ ALL | DISTINCT ] select_statement, ... ]
    [ ORDER BY { expression [ ASC | DESC ] [ NULLS { FIRST | LAST } ] [ , ... ] } ]
    [ SORT BY { expression [ ASC | DESC ] [ NULLS { FIRST | LAST } ] [ , ... ] } ]
    [ LIMIT { ALL | expression } ]
select_statement定义如下:
SELECT [ ALL | DISTINCT ] named_expression
    FROM { from_item [ , ... ] }
    [ WHERE boolean_expression ]
    [ GROUP BY expression [ , ... ] ]
    [ HAVING boolean_expression ]
参数说明
SELECT语法的参数说明请参见参数说明。其中from_item参数支持的表达式和示例如下:
  • Table relation:table_name
  • Subquery:SELECT * FROM tableX WHERE count > 20
  • Join relation:tableA LEFT JOIN tableB ON tableA.deptno=tableB.deptno
示例
SELECT * FROM student WHERE age > 12;
SELECT * FROM score WHERE exam_round = 1 and subject = 'Chinese' ORDER BY score LIMIT 5;
SELECT student.school_id, avg(score.score) AS avg_score FROM student INNER JOIN score ON score.student_id = student.id GROUP BY student.school_id ORDER BY avg_score desc