• Transwarp Inceptor中的对象


    1.1. Inceptor中的对象


    在Inceptor中,您可以使用常见的数据库对象,包括数据库(database),表(table),视图(view)和函数(function)。您可以使用Inceptor SQL、Inceptor PL/SQL以及Inceptor SQL PL来操作这些数据库对象。Inceptor中数据库对象的元数据保存在Inceptor Metastore中,而数据库对象内的数据可以存放在:

    • 内存或者SSD中(Holodesk表)
    • HDFS中(TEXT表/ORC表/CSV表)

    另外,Inceptor的SQL引擎还可以对接TDH中的其他分布式存储,如HBase和{es}。这些不在本手册的讨论范围内,如果您有兴趣可以参考《Hyperbase使用手册》。

    本章我们将对Inceptor数据库对象进行总览,具体细节在本手册的其他部分讨论。

    1.1.1. 数据库

    在Inceptor中,数据库是存放一组表的目录。Inceptor有一个默认的数据库default,用户也可以在Inceptor中创建其他数据库。

    通过beeline连接Inceptor时可以指定连接的数据库:

    beeline -u "jdbc:hive2://:10000/"

    安全模式下,连接InceptorServer 2的连接串需要提供认证信息,具体请参考Inceptor多租户手册。

    在所在数据库内可以直接使用对象名指代对象,如果要使用其他数据库中的对象,需要使用 . 来指代,例如 my_db.my_table。您也可以用 USE 指令切换使用的数据库。

    每个Inceptor中的数据库都是HDFS上的目录,路径为:

    hdfs:////user/hive/warehouse/.db

     是HDFS的nameservice名称; 是Inceptor的服务名; 是数据库名。数据库中的表都存在数据库对应的HDFS目录下。HDFS上属于Inceptor对象的目录和文件管理由Inceptor执行。

    1.1.2.

    Inceptor和其他数据库类似,将表(table)作为最主要的存放数据的对象。逻辑上,Inceptor的表用行(row)和列(column)来组织存储在其中的数据。

    1.1.2.1. 表的分类

    Inceptor中的表可以按以下不同维度划分:

    1. 按 Inceptor的所有权 分类可分为:外部表(或简称为外表)和托管表。
    2. 按 表的存储格式 分类可分为:TEXT表、ORC表、CSV表和Holodesk表。
    3. 按表 是否分区 可分为:分区表和非分区表。
    4. 按表 是否分桶 可分为:分桶表和非分桶表。

    同一维度下一张表只能有一个属性,而不同维度不互相干涉(有一些特例,我们会另外说明),例如一张表可以同时有下面属性:

    (外部表,TEXT表,分区表,分桶表)

    本节对这些维度下不同类型的表进行简要介绍。

    1.1.2.1.1. 按Inceptor的所有权分类

    表按Inceptor对它的所有权可以分为 外表(external table) 和 托管表(managed table)。托管表常常又称 内表

    • 托管表

    CREATE TABLE 默认创建托管表。Inceptor对托管表有所有权——用 DROP 删除托管表时,Inceptor会将表中数据全部删除。

    • 外表

    外表用 CREATE EXTERNAL TABLE 创建,外表中的数据可以保存在HDFS的一个指定路径上(和 LOCATION  合用)。Inceptor对外表没有所有权。用 DROP 删除外部表时,Inceptor删除表在metastore中的元数据而不删除表中数据,也就是说 DROP 仅仅解除Inceptor对外表操作的权利。

    1.1.2.1.2. 按表的存储格式分类

    按存储格式可以将表分为TEXT表、ORC表、CSV表和Holodesk表。

    • TEXT

    TEXT表即文本格式的表,是Inceptor默认的表格式。在数据量大的情况下,TEXT表的统计和查询性能都比较低;TEXT表也不支持事务处理,所以通常用于将文本文件中的原始数据导入Inceptor中。针对不同的使用场景,用户可以将其中的数据放入ORC表或Holodesk表中。

    Inceptor提供两种方式将文本文件中的数据导入TEXT表中:

      1. 建外部TEXT表,让该表指向HDFS上的一个目录,Inceptor会将目录下文件中的数据都导入该表。我们推荐使用这个方式导数据。
      2. 建TEXT表(外表内表皆可)后将本地或者HDFS上的一个文件或者一个目录下的数据 LOAD 进该表。这种方式在安全模式下需要多重认证设置,极易出错,我们 不推荐 使用这个方式导数据。

    关于TEXT表的更多内容和具体操作,请参考inceptor_sql手册/text表/text表。

    • CSV

    CSV表的数据来源为CSV格式(Comma-Separated Values)的文件。文件以纯文本形式存储表格数据(数字和文本),CSV文件由任意数目的记录组成,记录间以某种换行符分隔;每条记录由字段组成,字段间的分隔符是其它字符或字符串,最常见的是逗号或制表符。通常,所有记录都有完全相同的字段序列。和TEXT表相似,CSV表常用于向Inceptor中导入原始数据,然后针对不同场景,用户可以将其中的数据放入ORC表或Holodesk表中。

    关于CSV表的更多内容和具体操作,请参考inceptor_sql手册/csv表/csv表。

    • ORC

    ORC表即ORC格式的表。在Inceptor中,ORC表还分为ORC事务表和非事务表。

      1. ORC事务表支持事务处理和更多增删改语法(INSERT VALUES/UPDATE/DELETE/MERGE),所以如果您需要对表进行事务处理,应该选择使用ORC事务表。
      2. ORC非事务表则主要用来做统计分析。

    ORC表以及事务处理相关细节请参考inceptor_sql手册/orc表/orc表和inceptor_sql手册/事务处理语言(TCL)/事务处理语言(TCL)

    • Holodesk

    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中有交易记录的账户持有人名字:

    1. SELECT DISTINCT name FROM (
    2. SELECT name FROM user_info JOIN trans_info
    3. ON user_info.acc_num = trans_info.acc_num
    4. );

    name

    华*

    马**

    潘**

    管**

    邱*

    李*

    魏**

    祝**

     我们可以把这个查询中的子查询封装进一个视图中,从而简化这个查询。

    1. DROP VIEW IF EXISTS user_join_trans;
    2. CREATE VIEW user_join_trans AS
    3. SELECT name FROM user_info JOIN trans_info
    4. ON user_info.acc_num = trans_info.acc_num;
    5. 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中不涉及账户安全的列:

    1. DROP VIEW IF EXISTS user_info_secure;
    2. CREATE VIEW user_info_secure AS
    3. SELECT name, acc_num, reg_date, acc_level
    4. 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部分介绍。

  • 相关阅读:
    HTTP/1.1协议中的响应报文
    线程池|单例模式|STL、智能指针线程安全|读者写者问题
    数商云供应链系统深耕采购、物流多业务场景,打造家居建材企业智慧供应链体系
    数组补全(秋季每日一题 10)
    WPF——自定义日历
    gdb调试
    条件查询和数据查询
    京东按关键字搜索商品 API 返回值说明
    Notion 程序猿必备笔记软件
    【Electron】electron与cljs的处理
  • 原文地址:https://blog.csdn.net/Auspicious_air/article/details/127878939