在Inceptor中,您可以使用常见的数据库对象,包括数据库(database),表(table),视图(view)和函数(function)。您可以使用Inceptor SQL、Inceptor PL/SQL以及Inceptor SQL PL来操作这些数据库对象。Inceptor中数据库对象的元数据保存在Inceptor Metastore中,而数据库对象内的数据可以存放在:
另外,Inceptor的SQL引擎还可以对接TDH中的其他分布式存储,如HBase和{es}。这些不在本手册的讨论范围内,如果您有兴趣可以参考《Hyperbase使用手册》。
本章我们将对Inceptor数据库对象进行总览,具体细节在本手册的其他部分讨论。
1.1.1. 数据库
在Inceptor中,数据库是存放一组表的目录。Inceptor有一个默认的数据库default,用户也可以在Inceptor中创建其他数据库。
通过beeline连接Inceptor时可以指定连接的数据库:
beeline -u "jdbc:hive2://:10000/"
| 安全模式下,连接InceptorServer 2的连接串需要提供认证信息,具体请参考Inceptor多租户手册。 |
在所在数据库内可以直接使用对象名指代对象,如果要使用其他数据库中的对象,需要使用
每个Inceptor中的数据库都是HDFS上的目录,路径为:
hdfs:////user/hive/warehouse/.db
1.1.2. 表
Inceptor和其他数据库类似,将表(table)作为最主要的存放数据的对象。逻辑上,Inceptor的表用行(row)和列(column)来组织存储在其中的数据。
1.1.2.1. 表的分类
Inceptor中的表可以按以下不同维度划分:
同一维度下一张表只能有一个属性,而不同维度不互相干涉(有一些特例,我们会另外说明),例如一张表可以同时有下面属性:
(外部表,TEXT表,分区表,分桶表)
本节对这些维度下不同类型的表进行简要介绍。
1.1.2.1.1. 按Inceptor的所有权分类
表按Inceptor对它的所有权可以分为 外表(external table) 和 托管表(managed table)。托管表常常又称 内表。
CREATE TABLE 默认创建托管表。Inceptor对托管表有所有权——用 DROP 删除托管表时,Inceptor会将表中数据全部删除。
外表用 CREATE EXTERNAL TABLE 创建,外表中的数据可以保存在HDFS的一个指定路径上(和 LOCATION
1.1.2.1.2. 按表的存储格式分类
按存储格式可以将表分为TEXT表、ORC表、CSV表和Holodesk表。
TEXT表即文本格式的表,是Inceptor默认的表格式。在数据量大的情况下,TEXT表的统计和查询性能都比较低;TEXT表也不支持事务处理,所以通常用于将文本文件中的原始数据导入Inceptor中。针对不同的使用场景,用户可以将其中的数据放入ORC表或Holodesk表中。
Inceptor提供两种方式将文本文件中的数据导入TEXT表中:
关于TEXT表的更多内容和具体操作,请参考inceptor_sql手册/text表/text表。
CSV表的数据来源为CSV格式(Comma-Separated Values)的文件。文件以纯文本形式存储表格数据(数字和文本),CSV文件由任意数目的记录组成,记录间以某种换行符分隔;每条记录由字段组成,字段间的分隔符是其它字符或字符串,最常见的是逗号或制表符。通常,所有记录都有完全相同的字段序列。和TEXT表相似,CSV表常用于向Inceptor中导入原始数据,然后针对不同场景,用户可以将其中的数据放入ORC表或Holodesk表中。
关于CSV表的更多内容和具体操作,请参考inceptor_sql手册/csv表/csv表。
ORC表即ORC格式的表。在Inceptor中,ORC表还分为ORC事务表和非事务表。
ORC表以及事务处理相关细节请参考inceptor_sql手册/orc表/orc表和inceptor_sql手册/事务处理语言(TCL)/事务处理语言(TCL)
Holodesk表存储在内存或者SSD中(可以根据您的需要设置),同时,星环科技为其提供了一系列优化工具,使得在Holodesk表上进行大批量复杂查询能达到极高的性能。所以,如果您的数据量特别大,查询非常复杂,您应该选择使用Holodesk表。
关于Holodesk表的更多内容和具体操作,请参考“Holodesk表”章节。
1.1.2.1.3. 按表是否分区分类
按表是否分区可以将表为两类:分区表和非分区表。
如果在建表时使用了 PARTITIONED BY,表即为分区表。分区表下的数据按分区键的值(或值的范围)放在HDFS下的不同目录中,可以有效减少查询时扫描的数据量,提升查询效率。
关于分区表的更多内容和具体操作,请参考“分区表”章节。
非分区表即除分区表之外的表。
1.1.2.1.4. 按表是否分桶分类
按表是否分桶可以将表分为两类:分桶表和非分桶表。
如果在建表时使用了 CLUSTERED BY … INTO … BUCKETS,表即为分桶表。分桶表下的数据按分桶键的哈希值放在HDFS下的不同目录中,可以有效减少查询时扫描的数据量,提升查询效率。
关于分桶表的更多内容和具体操作,请参考“分桶表”章节。
非分桶表即除分桶表之外的表。
1.1.3. 视图
视图由 CREATE VIEW … AS SELECT… 创建,将一个查询建成一张逻辑上的表——当我们创建一个视图以后,它就可以和 CREATE TABLE … AS SELECT 所建的表一样用来查询。但是和表不同的是,Inceptor中的视图是 非实物化(unmaterialized) 的,也就是说视图中没有实际的数据,每次对视图进行查询时,建视图所用的查询语句会被再次执行一次。所以,我们也可以将视图理解为 查询的封装。视图不能和表重名。
视图的作用很多,比如简化查询、对表中内容的权限控制等。
例 1. 简化查询
下面的语句查询所有在trans_info中有交易记录的账户持有人名字:
- SELECT DISTINCT name FROM (
- SELECT name FROM user_info JOIN trans_info
- ON user_info.acc_num = trans_info.acc_num
- );
| name |
| 华* |
| 马** |
| 潘** |
| 管** |
| 邱* |
| 李* |
| 魏** |
| 祝** |
我们可以把这个查询中的子查询封装进一个视图中,从而简化这个查询。
- DROP VIEW IF EXISTS user_join_trans;
- CREATE VIEW user_join_trans AS
- SELECT name FROM user_info JOIN trans_info
- ON user_info.acc_num = trans_info.acc_num;
- SELECT DISTINCT name FROM user_join_trans;
| name |
| 华* |
| 马** |
| 潘** |
| 邱* |
| 管** |
| 李* |
| 魏** |
| 祝** |
例 2. 权限控制
user_info表中包含涉及账户安全的信息,如身份证号码、密码等。现在我们想要做到让一部分Inceptor用户(例如Inceptor用户Alice和Bob)只能读到user_info表中不涉及账户安全的信息,我们可以做下面的操作:
1.确保Alice和Bob对user_info表没有读权限。
2.建视图user_info_secure,包含user_info中不涉及账户安全的列:
- DROP VIEW IF EXISTS user_info_secure;
- CREATE VIEW user_info_secure AS
- SELECT name, acc_num, reg_date, acc_level
- FROM user_info;
3.赋予用户Alice和Bob对视图user_info_secure的读权限:
GRANT SELECT ON user_info_secure TO USER alice, USER bob;
1.1.4. 函数
您可以用函数对Inceptor中的数据进行多种计算。Inceptor拥有大量的内置函数,这些函数以及它们的用法在Inceptor函数和运算符手册中列出。
另外,您可以在Inceptor中创建自定义函数。自定义函数分为 临时函数和永久函数, 临时函数在重启Inceptor前在各个session间都是有效的,重启Inceptor后该函数将不再存在,如需使用需要重新创建。永久函数则在Inceptor重启后依然可以使用。临时函数和永久函数的创建和删除可以通过Inceptor SQL进行,细节请参考CREATE/DROP FUNCTION部分介绍。