当前位置:   article > 正文

Inceptor简介

inceptor

声明:本文章仅为个人学习笔记,方便个人学习,不用做任何商业用途,转载请说明出处。参考 星环Inceptor使用手册

1 基本介绍

系统架构
在这里插入图片描述
功能:提供完整的SQL支持,支持主流的SQL模块化扩展,兼容通用开发框架和工具,支持事务特性保证数据的准确性,允许多租户的隔离与管理,且能够利用内存或者SSD来加速数据的读取,支持与关系型数据库实时对接并做统计分析,辅以高性能的SQL执行引擎,为企业提供高性价比和高度可扩展的解决方案

用途:用于数据仓库和交互式分析

Inceptor中的对象:数据库(database),表(table),视图(view)和函数(function)

Inceptor中的数据类型:TINYINT,INT,FLOAT,DOUBLE,DECIMAL(m,n),BOOLEAN,STRING,CHAR,VARCHAR,DATE,TIMESTAMP,复杂数据类型(ARRAY,MAP,STRUCT)等

  • ARRAY
    创建数据表array_test,将person_id参数定义为 ARRAY < INT> 数据类型(即一组由 INT 数据组成的数列),然后将已存在的文本text.txt导入至array_test中。text.txt中的数据如下:在这里插入图片描述
    创建表array_test的语句为:(执行LOAD DATA之前请注意如何访问本地文件)
    DROP TABLE IF EXISTS array_test; CREATE TABLE array_test( name STRING, person_id array<INT> ) ROW FORMAT DELIMITED FIELDS TERMINATED BY ',' COLLECTION ITEMS TERMINATED BY ':'; LOAD DATA LOCAL INPATH '/LOCALWORKSPACE/manual-ut/manual_data/manual_crud_tmp/test.txt' INTO TABLE array_test;
    查看array_test全表,并检索其中一列的信息。结果如下:
    SELECT * FROM array_test;
    name person_id
    034 [1,2,3,4]
    035 [5,6]
    036 [7,8,9,10]
    SELECT person_id[1] AS person_1 FROM array_test;
    person_1
    2
    6
    8
  • MAP
    创建数据表map_test,将perf字段定义为 MAP<string,int> 数据类型(键为 STRING 类型,值为 INT 类型),然后将已存在的文本test_map.txt导入至map_test中。test_map.txt中的数据为:
    在这里插入图片描述
    创建表map_test的语句为:(执行LOAD DATA之前请注意如何访问本地文件)
    DROP TABLE IF EXISTS map_test; CREATE TABLE map_test( id STRING, perf map<STRING, INT> ) ROW FORMAT DELIMITED FIELDS TERMINATED BY '|' COLLECTION ITEMS TERMINATED BY ',' MAP KEYS TERMINATED BY ':'; LOAD DATA LOCAL INPATH '/LOCALWORKSPACE/manual-ut/manual_data/manual_crud_tmp/test_map.txt' INTO TABLE map_test;
    查看map_test全表,并检索perf中“job”和“Person”的信息。结果如下:
    SELECT * FROM map_test;
    id perf
    1 {“job”:80,“team”:60,“person”:70}
    2 {“job”:60,“team”:80}
    3 {“job”:90,“team”:70,“person”:100}
    SELECT perf['job'] AS job FROM map_test;
    job
    80
    60
    90
  • STRUCT
    创建数据表person,将info定义为 STRUCT< name:STRING,age:INT> 数据类型(由name和age构成的字段,其中name为 STRING 类型,age为 INT 类型),然后将已存在的文本person.txt导入至person表中。person.txt中的数据为:
    在这里插入图片描述
    创建person.txt的语句为:(执行LOAD DATA之前请注意如何访问本地文件)
    DROP TABLE IF EXISTS person; CREATE TABLE person( id INT, info struct<name:STRING, age:INT> ) ROW FORMAT DELIMITED FIELDS TERMINATED BY ',' COLLECTION ITEMS TERMINATED BY ':'; LOAD DATA LOCAL INPATH "/LOCALWORKSPACE/manual-ut/manual_data/manual_crud_tmp/person.txt" INTO TABLE person;
    查看person全表,并检索info中“name”和“age”的信息。结果如下:
    SELECT * FROM person;
    id info
    1 {“name”:“zhou”,“age”:30}
    2 {“name”:“yan”,“age”:30}
    3 {“name”:“chen”,“age”:20}
    4 {“name”:“li”,“age”:80}
    SELECT info.name AS info_name FROM person;
    info_name
    zhou
    yan
    chen
    li

如何操作Inceptor中的对象:nceptor SQL、Inceptor PL/SQL以及Inceptor SQL PL

Inceptor的两种执行模式:Local和Cluster。切换方式:SET ngmr.exec.mode = local/cluster;

  • Cluster模式是默认执行模式,适用于批处理业务。它通过InceptorServer将SQL转换成Job分发到各个节点的Executor,并由Task具体处理,各个Task将结果汇总写入HDFS的结果目录,由Fetch Task显示结果,如果Task执行的是CTAS(CREATE TABLE …​ AS…​)则将结果Move到对应表的数据存储目录下。
  • Local模式适用于一些低延时、高并发、参与计算数据量少的场景。Local模式本身要求数据源检索有较快的速度,所以Local模式的优势是可以较快的返回结果,满足低延时需求。

Inceptor中数据库对象的元数据保存位置:在Inceptor Metastore中

数据库对象内的数据存放位置:内存或者SSD中(Holodesk表)、HDFS中(TEXT表/ORC表/CSV表)

数据库

  • 1.是存放一组表的目录,默认的数据库default
    2.通过beeline连接Inceptor数据库:beeline -u "jdbc:hive2://<server_ip/hostname>:10000/<database>"
    3.每个Inceptor中的数据库都是HDFS上的目录,路径为:hdfs://<nameservice>/<id>/user/hive/warehouse/<database_name>.db
    < nameservice > 是HDFS的nameservice名称;< id> 是Inceptor的服务名;< database_name> 是数据库名。数据库中的表都存在数据库对应的HDFS目录下。
    4.HDFS上属于Inceptor对象的目录和文件管理由Inceptor执行。


数据的对象。逻辑上,Inceptor的表用行(row)和列(column)来组织存储在其中的数据
表的分类:(Inceptor中的表可以按以下不同维度划分)

  • 1.按 Inceptor的所有权 分类可分为:外部表(或简称为外表)和托管表
    2.按 表的存储格式 分类可分为:TEXT表、ORC表、CSV表和Holodesk表
    3.按表 是否分区 可分为:分区表和非分区表
    4.按表 是否分桶 可分为:分桶表和非分桶表
    同一维度下一张表只能有一个属性,而不同维度不互相干涉,例如一张表可以同时有下面属性:(外部表,TEXT表,分区表,分桶表)

以下是对各种表的说明:

表分类创建Inceptor是否有所有权drop删除其他
外表CREATE EXTERNAL TABLE ,需指定路径只删除表在metastore中的元数据
托管表(内表)CREATE TABLE,默认路径将表中数据全部删除
表分类存储格式说明其他
TEXT表txt文本格式的表不支持事务,数据量大时性能低,通常用于将文本文件中的数据导入Inceptor中。导入方式:建外部TEXT表,让该表指向HDFS上的一个目录,Inceptor会将目录下文件中的数据都导入该表针对不同的使用场景,用户可以将其中的数据放入ORC表或Holodesk表中
CSV表csv格式的表记录间以换行符分隔,每条记录由字段组成,字段间的分隔符是逗号或制表符。所有记录都有完全相同的字段序列。和TEXT表相似,CSV表常用于向Inceptor中导入原始数据同TEXT表
ORC表orc格式的表分为ORC事务表和非事务表,ORC事务表支持事务处理和更多增删改语法(INSERT VALUES/UPDATE/DELETE/MERGE);ORC非事务表则主要用来做统计分析需要对表进行事务处理,应该选择使用ORC事务表
Holodesk表内存或SSDHolodesk表上进行大批量复杂查询能达到极高的性能数据量特别大,查询非常复杂,选择使用Holodesk表
表分类创建说明
分区表使用了PARTITIONED BY分区表下的数据按分区键的值(或值的范围)放在HDFS下的不同目录中
非分区表不使用PARTITIONED BY续:可以有效减少查询时扫描的数据量,提升查询效率
表分类创建说明
分桶表使用了CLUSTERED BY …​ INTO …​ BUCKETS分桶表下的数据按分桶键的哈希值放在HDFS下的不同目录中
非分桶表不使用CLUSTERED BY …​ INTO …​ BUCKETS续:可以有效减少查询时扫描的数据量,提升查询效率

视图
视图的创建:CREATE VIEW …​ 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);
    可以使用视图简化查询:
    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;
    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.关系运算符:>,<,=,==,>=,<=,<>,like等。例子:SELECT A < B AS result FROM system.dual LIMIT 1;A和B可以为任何基本类型,如果A小于B,则返回TRUE,否则返回FALSE。如果A或B值为“NULL”,结果返回“NULL”
    2.算术运算符:+,-,*,/,%,&,|,^,~等。例子:SELECT ~A AS result FROM system.dual LIMIT 1;A可以为TinyInt,Int,BitInt类型。对表达式 A 执行按位“非”(取反)
    3.逻辑运算符:AND,OR,NOT,IN,EXISTS等。SELECT A==B and true AS result FROM system.dual LIMIT 1;A和B必须是Boolean类型,返回二者的逻辑与的结果。即A和B同时正确时,返回TRUE,否则FALSE。如果A或B值为NULL,返回NULL
    4.数学函数:round(double a[, int d]),floor(double a),ceil(double a),rand([int seed]),exp(double n),sqrt(double a),bin(BIGINT a),sin(double a),regr_slope(col y,col x)等。例子:SELECT round(1.4523,3) AS result FROM system.dual LIMIT 1;,结果:(result:1.452)。未指定d时,四舍五入到小数点后一位;若指定了d,则四舍五入到小数点后第d位
    5.类型转换函数:CAST( AS )。例子:SELECT CAST('38' AS INT) AS result FROM system.dual LIMIT 1;expr 代表被转换的对象,TYPE 代表指定目标类型
    6.日期函数:EXTRACT(DAY|MONTH|YEAR FROM )。例子:SELECT EXTRACT(YEAR FROM '2015-01-15') AS result FROM system.dual LIMIT 1;结果:(result:2015)。参数date应该是datetime value,或者可以隐性转换成DATE类型
    7.条件函数:IF(booleantestCondition, T valueTrue, T valueFalseOrNull)。例子:SELECT IF(true,'trans','age') AS result FROM system.dual LIMIT 1;。如果booleantestCondition为true,返回valueTrue,否则返回TvalueFalseOrNull
    8.字符串函数:concat(a,b,c……)。例子:SELECT concat(1,2,3) AS result FROM system.dual LIMIT 1;结果:(result:123)
    9.XML函数:xmlforest(, [, …​])。例子:SELECT xmlforest(name, age) a FROM student_age ORDER BY a LIMIT 1;结果:(a:< name >Han Meimei < /name> < age >20</ age>)
    此外,还有复杂函数类型、表生成函数、聚合函数、窗口函数、Context函数、脱敏函数等。
    自定义函数:
声明:本文内容由网友自发贡献,不代表【wpsshop博客】立场,版权归原作者所有,本站不承担相应法律责任。如您发现有侵权的内容,请联系我们。转载请注明出处:https://www.wpsshop.cn/w/知新_RL/article/detail/904236
推荐阅读
相关标签
  

闽ICP备14008679号