HAWQ 官方文档创建filespace,tablespace,database,table

1.创建Filespace

创建Filespace必须是数据库超级用户( You must be a database superuser to create a filespace.)
首先创建一个filespace的配置文件:

[hadoop@hadoop hawq]$ hawq filespace -o hawqfilespace_config  #生成配置文件,只要配置了环境变量命令可以在任何目录下运行
Enter a name for this filespace
> testfs    #输入filespace的名称
Enter replica num for filespace. If 0, default replica num is used (default=3)
>     #设置副本个数

Please specify the DFS location for the filespace (for example: localhost:9000/fs)
location> localhost:9000/testfs #输入创建这个filespace文件在HDFS上的位置,最终会生成目录:localhost:9000/testfs/testfs
20170401:10:23:39:133234 hawqfilespace:hadoop:hadoop-[INFO]:-[created]
20170401:10:23:39:133234 hawqfilespace:hadoop:hadoop-[INFO]:-
To add this filespace to the database please run the command:
   hawqfilespace --config /home/hadoop/note/hawq/hawqfilespace_config

[hadoop@hadoop hawq]$ cat /home/hadoop/note/hawq/hawqfilespace_config    #可以查看下配置文件的内容
filespace:testfs
fsreplica:3
dfs_url::localhost:9000/testfs[hadoop@hadoop hawq]$
[hadoop@hadoop hawq]$ hawq filespace --config /home/hadoop/note/hawq/hawqfilespace_config    #使用命令进行创建
Reading Configuration file: '/home/hadoop/note/hawq/hawqfilespace_config'

CREATE FILESPACE testfs ON hdfs
('localhost:9000/testfs/testfs') WITH (NUMREPLICA = 3);
20170401:10:25:29:133433 hawqfilespace:hadoop:hadoop-[INFO]:-Connecting to database
20170401:10:25:29:133433 hawqfilespace:hadoop:hadoop-[INFO]:-Filespace "testfs" successfully created    #创建成功
[hadoop@hadoop hawq]$

通过浏览器查看我们我们刚才生成的目录:
http://localhost:50070/explorer.html#/testfs/testfs

创建filespace成功,可以使用命令基于配置文件再次创建:
[hadoop@hadoop hawq]$ hawq filespace -c hawqfilespace_config


2.创建表空间
hadoop=# CREATE TABLESPACE testts FILESPACE testfs; #创建表空间并指定文件空间
CREATE TABLESPACE
可以查看刚才创建的表空间
hadoop=# db
         List of tablespaces
    Name     | Owner  | Filespae Name
-------------+--------+---------------
 dfs_default | hadoop | dfs_system
 pg_default  | hadoop | pg_system
 pg_global   | hadoop | pg_system
 testts      | hadoop | testfs        #创建表空间及对应的文件空间
(4 rows)

可以使用如下命令将表空间的访问权限授予某个用户,前提是该用户已经存在
=# GRANT CREATE ON TABLESPACE fastspace TO admin;

创建一张表并指定表空间
hadoop=# CREATE TABLE foo(i int) TABLESPACE testts;
CREATE TABLE
注意:数据库下的表并不一定与库在同一个表空间。
表空间和表是一对多的关系,一个模式下的表可以分布在多个表空间下;
一个数据库下有可以有多个模式,一个模式只属于一个数据库。模式在GP中也被称为Namespace,不同数据库之间的模式没有关系,可以重名。
一个文件空间可以有多个表空间,一个表空间只属于一个文件空间,文件空间和角色之间没有关系。
除了文件空间之外,其他的权限管理都是通过角色来实现,在这些层次结构中,用户必须对上一层有访问权限才能够访问该层的内容。

如果在创建数据库或表时没有指定表空间,会使用默认的表空间,已可以使用如下命令设置某个表空间为默认表空间:
SET default_tablespace = space1;
CREATE TABLE foo(i int);

查看已经存在的表空间和文件空间:
每个HAWQ系统默认存在的表空间
    pg_global:用于共享系统目录。
    pg_default:默认的表空间,默认的存在的数据库template1和tmplate0使用这个表空间。
这些表空间使用的是系统默认的文件空间 pg_system,数据存放目录是在初始化是创建的。

可以查看表空间的定义信息:
hadoop=# SELECT spcname AS tblspc, fsname AS filespc,
          fsedbid AS seg_dbid, fselocation AS datadir
   FROM   pg_tablespace pgts, pg_filespace pgfs,
          pg_filespace_entry pgfse
   WHERE  pgts.spcfsoid=pgfse.fsefsoid
          AND pgfse.fsefsoid=pgfs.oid
   ORDER BY tblspc, seg_dbid;
查询结果:
   tblspc    |  filespc   | seg_dbid |                    datadir                     
-------------+------------+----------+------------------------------------------------
 dfs_default | dfs_system |        0 | hdfs://localhost:9000/hawq_default
 testts      | testfs     |        0 | hdfs://{replica=3}localhost:9000/testfs/testfs
(2 rows)

hadoop=#

移除表空间和文件空间:
    删除表空间:hadoop=# DROP TABLESPACE testts ;
             删除表空间必须是 tablespace owner或者superuser;
             删除表空间间前必须先删除该表空间下的所有对象;
    删除Filespace:hadoop=# DROP FILESPACE testfs;
             只有superuser可以删除文件空间;
             删除文件空间不能有与之关联的表空间;


3.创建和管理数据库(Creating and Managing Databases )

创建数据库:
template1=# CREATE DATABASE testdb WITH TABLESPACE=hawqts; #指定存储表空间为hawqts,如果不指定则使用默认表空噶进
CREATE DATABASE

可以使用客户端程序创建数据库:
$ createdb -h localhost -p 5432 mydatabase #这里的主机名和端口号必须和master节点的主机名和端口对应

可以使用clone的方式根据模板创建数据库:
=# CREATE DATABASE <new_dbname> WITH TEMPLATE template0;

显示所有的databases
可以使用 l 或使用=# SELECT datname FROM pg_database;
使用第二种方式需要是 superuser

修改数据库
可以使用ALTER DATABASE 修改数据库的owner或name等属性
可以使用ALTER DATABASE 修改数据库默认配置,例如修改search_path
=# ALTER DATABASE mydatabase SET search_path TO myschema, public, pg_catalog;
要修改数据库必须是owner of database or superuser

删除数据库
使用 DROP DATABASE 命令可以删除数据库,即删除数据库的system catalog和删除磁盘上的数据文件。
在删除前需要连接tmplate1或者其他数据库
=# c template1
=# DROP DATABASE mydatabase;

可以使用客户端程序删除数据库:
$ dropdb -h hmaster -p 5432 mydatabase

注意:删除数据库不能撤销。


4.创建和管理Schema

hadoop=# CREATE SCHEMA myschema;
CREATE SCHEMA

在访问schema中的对象时(Table,View,Index,Sequence,Function),可以前边带上schema名称来做相同对象名称的区分。
例如访问数据表:
=> SELECT * FROM myschema.mytable;

在创建Schema时可以指定所属用户:
hadoop=# CREATE SCHEMA ownby_schema AUTHORIZATION dbuser;
CREATE SCHEMA
hadoop=# dn
       List of schemas
        Name        | Owner  
--------------------+--------
 hawq_toolkit       | hadoop
 information_schema | hadoop
 myschema           | hadoop
 ownby_schema       | dbuser
 pg_aoseg           | hadoop
 pg_bitmapindex     | hadoop
 pg_catalog         | hadoop
 pg_toast           | hadoop
 public             | hadoop
(9 rows)

在创建具体object(table,views...)时如果没有指定schema,则使用默认schema:public

Schema的查找路径
在访问对象时如果没有指定schema,则会使用默认的查找路径;
可以设置查找路径search_path来修改默认的查找路径,可以同时指定多个schema

hadoop=# ALTER DATABASE postgres SET search_path TO myschema,public,pg_catalog;
ALTER DATABASE
指定后在访问对象时会按照查找路径的配置顺序查找object;

查看当前数据库的Schema
=> SELECT current_schema();

查看当前的查找路径
=> SHOW search_path;

删除Schema
hadoop=# DROP SCHEMA ownby_schema ;
DROP SCHEMA
在删除schema时schema中必须为空才能删除,可以使用CASECADE的方式删除schema同时删除包含的对象:
=> DROP SCHEMA myschema CASCADE;


5.创建和管理Tables

选择合适的列类型:
CHAR,VARCHAR,TEXT都可以应用于string,通常情况使用TEXT,VARCHAR要好于CHAR。

在存储numberic类型数据时,选取的类型越大越浪费空间 BININT > INT > SMALLINT

在使用JOIN 等关联或条件查询时尽量将字段类型保持一致,类型转换会增加不必要的系统负担。

Check Constraints

=> CREATE TABLE products
     ( product_no integer,
       name text,
       price numeric CHECK (price > 0) ); #限制价格大于0

=> CREATE TABLE products
     ( product_no integer NOT NULL,   #非空限制
       name text NOT NULL,
       price numeric );

Foreign Keys

Foreign keys are not supported. You can declare them, but referential integrity is not enforced.

Foreign key constraints specify that the values in a column or a group of columns must match the values appearing in some row of another table to maintain referential integrity between two related tables. Referential integrity checks cannot be enforced between the distributed table segments of a HAWQ database.