testbook

图表对象:数据库,表和视图

Inceptor中主要有三种图表对象,数据库,表和视图。

数据库(DATABASE)

在Inceptor中,数据库实际上仅仅是表的目录,或者说是命名空间。Inceptor有一个自带的数据库default。用户可以自己在Inceptor中创建数据库。如果用户不指定使用哪个数据库,Inceptor默认使用default。

数据库的元数据
数据库的元数据包括数据库名称和地址。用DESCRIBE DATABASE可以查看数据库的名称和地址:

[$host] transwarp> CREATE DATABASE test_db;

[$host] transwarp> DESCRIBE DATABASE test_db; test_db hdfs://ns/inceptor1/user/hive/warehouse/test_db.db Inceptor提供WITH DBPROPERTIES让用户可以通过键值对来添加数据库的元数据。DESCRIBE DATABASE EXTENDED命令可以查看用户自定义的DBPROPERTIES:

[$host] transwarp> CREATE DATABASE test_db WITH DBPROPERTIES ('owner'='zhang san');
[$host] transwarp> DESCRIBE DATABASE EXTENDED test_db;
test_db         hdfs://ns/inceptor1/user/hive/warehouse/test_db.db      {owner=zhang san}

查看Inceptor中的所有数据库
使用SHOW DATABASES可以查看Inceptor中所有的数据库:

[$host]transwarp> SHOW DATABASES;
default
my_db
test
test_db

表(Table)

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

表按Inceptor对它的所有权可以分为托管表(managed table)外表(external table)

  • 托管表
    CREATE TABLE语句默认创建托管表。Inceptor对它有所有权。用DROP语句删除托管表时,Inceptor会将表对应的目录下的数据全部删除。
  • 外表
    外表用CREATE EXTERNAL TABLE语句创建,它必须存储在HDFS上,而不是本地。Inceptor对它无所有权。Inceptor和Hadoop系统中的其他组件都可以对这张表进行操作。用DROP语句删除外部表时,Inceptor删除表在metastore中的元数据而不删除文件。也就是说DROP仅仅解除Inceptor对外部表操作的权利,表文件还是存储在HDFS中,Hadoop系统中的其他组件依旧可以对表进行操作。创建外部表时,可以使用Location 'hdfs_path'指令指定外部表在HDFS中的路径。

  • 表的schema
    表的schema是关于表的元数据,schema内容包括表中的列名,列的数值类型,分区键,分区键数值类型,列的注解等等,表的存储路径,表的SerDe等等信息。需要查看表的schema可以使用DESCRIBE和DESCRIBE EXTENDED语句。DESCRIBE语句可以显示列名,列的数值类型和列的注解:
    [$host] transwarp> CREATE TABLE test_table (col INT, col2 STRING COMMENT 'this is a comment on col2') COMMENT 'this is a comment on test_table' PARTITIONED BY (col3 DOUBLE);
    
    [$host] transwarp> DESCRIBE test_table;
    col                     int                     None
    col2                    string                  this is a comment on col2
    col3                    double                  None
    
    # Partition Information
    # col_name              data_type               comment
    
    col3                    double                  None
    
    Inceptor提供TBLPROPERTIES让用户以键值对的形式添加自定义的元数据。DESCRIBE EXTENDED 或者 DESCRIBE FORMATTED 可以显示TBLPROPERTIES和其他的schema信息:
    [$host] transwarp> CREATE TABLE test_table (col1 INT, col2 STRING COMMENT 'this is a comment on col2') COMMENT 'this is a comment on test_table' PARTITIONED BY (col3 DOUBLE) TBLPROPERTIES ('owner'='Zhang San');
    
    [$host] transwarp> DESCRIBE EXTENDED test_table;
    col1                    int                     None
    col2                    string                  this is a comment on col2
    col3                    double                  None
    
    # Partition Information
    # col_name              data_type               comment
    
    col3                    double                  None
    
    Detailed Table Information      Table(tableName:test_table, dbName:default, owner:yarn, createTime:1417790881, lastAccessTime:0, retention:0, sd:StorageDescriptor(cols:[FieldSchema(name:col1, type:int, comment:null), FieldSchema(name:col2, type:string, comment:this is a comment on col2), FieldSchema(name:col3, type:double, comment:null)], location:hdfs://ns/inceptor1/user/hive/warehouse/test_table, inputFormat:org.apache.hadoop.mapred.TextInputFormat, outputFormat:org.apache.hadoop.hive.ql.io.HiveIgnoreKeyTextOutputFormat, compressed:false, numBuckets:-1, serdeInfo:SerDeInfo(name:null, serializationLib:org.apache.hadoop.hive.serde2.lazy.LazySimpleSerDe, parameters:{serialization.format=1}), bucketCols:[], sortCols:[], parameters:{}, skewedInfo:SkewedInfo(skewedColNames:[], skewedColValues:[], skewedColValueLocationMaps:{}), storedAsSubDirectories:false), partitionKeys:[FieldSchema(name:col3, type:double, comment:null)], parameters:{owner=Zhang San, transient_lastDdlTime=1417790881, comment=this is a comment on test_table}, viewOriginalText:null, viewExpandedText:null, tableType:MANAGED_TABLE, isRangePartitioned:false)
    
    查看指定数据库下所有的表
    要查看指定数据库下所有的表可以使用SHOW TABLES指令。直接使用SHOW TABLES会显示所有在default数据库下的表:
    [$host] transwarp> SHOW TABLES;
    test_table
    
    如果想要显示一个其他数据库下的表,使用SHOW TABLES IN db_name指令。比如,我们来查看exchange_platform下的所有表:
    [$host] transwarp> SHOW TABLES IN exchange_platform;
    nonsecure_user_info
    part_user_info
    empty_user_info
    user_info
    

    视图(VIEW)

    CREATE VIEW ... AS SELECT...(link)语句创建一个视图,将一次查询结果保存为一张逻辑上的表 -- 当我们创建一个视图以后,它就可以和表一样用来查询。但是视图是非实物化(unmaterialized)的 -- 它只有元数据,不像表那样在HDFS中有自己的数据文件。试试看用DESCRIBE EXTENDED查看VIEW的目录,你会得到 location:null。它只是一次查询的快捷方式(alias) -- 每次用到这个视图时,它所记录的查询会被再次执行一次。所以如果查询非常复杂,有需要反复使用,为了加快速度,可以将查询结果保存为一张表CREATE TABLE...AS SELECT, 和编程中的函数encapsulation相像。 视图是只读的,不能用它来对它用到的表做任何修改。 创建之后只能修改TBLPROPERTIES, Inceptor用VIEW做的事儿和用查询做的是一样的,只是方便使用者而已。Inceptor先执行VIEW所封装的查询, VIEW不能和TABLE/VIEW重名。

    视图的作用很多,比如
  • 举例:简化查询
    下例返回所有进行过交易的账户持有人的名字:
    [$host] transwarp> SELECT DISTINCT name FROM (SELECT name FROM user_info JOIN transactions ON acc_num = acc_num);
    邱坤
    管淑艳
    李韩瑶
    潘营泽
    祝韩恒
    魏向卉
    马从筠
    华微
    
    我们可以把子查询SELECT name FROM user_info JOIN transactions ON acc_num = acc_num封装进一个VIEW,然后再查询:
    [$host] transwarp> CREATE VIEW name_view AS SELECT name FROM user_info JOIN transactions ON acc_num = acc_num;
    
    [$host] transwarp> SELECT DISTINCT name FROM name_view;
    祝韩恒
    魏向卉
    马从筠
    华微
    邱坤
    管淑艳
    李韩瑶
    潘营泽
    
  • 举例:限制用户看到的信息 下例VIEW包含user_info中不涉及账户安全的信息
    [$host] transwarp> CREATE VIEW secure_info AS SELECT name, acc_num, reg_date, acc_level from user_info;
    
    [$host] transwarp> SELECT * FROM secure_info;
    马从筠  6513065 20110101        A
    祝韩恒  6670192 20100101        C
    华微    5224133 20080214        B
    魏向卉  3912384 20091202        A
    宁新瑶  4580952 20081031        D
    邱坤    0700735 20121024        A
    李平    8725869 20130702        E
    潘营泽  6600641 20110430        C
    李韩瑶  2755506 20110916        D
    管淑艳  2394923 20141003        C