目录
开发指南
1、连接数据库
udw支持按照postgresql方式来访问udw,可以支持jdbc、odbc、php、python、psql等方式来访问udw。图形化的pgAdmin、SQL Workbench/J 等工具
1.1 psql客户端方式访问
下载psql客户端(或者通过控制台下载udw客户端)
yum install postgresql.i686 (32位系统)
yum install postgresql.x86_64 (64位系统)
psql -h hostIP(或域名) –U username -d database -p port –W
hostIP:udw master节点的ip或者域名
username :数据库用户名
database:数据库名称
1.2 udw客户端方式访问
如果你选择是数据仓库类型是greenplum、请用greenplum客户端、如果你选择的数据仓库类型请用udpg客户端。
1.1 udw(greenplum)客户端方式访问(以Centos为例)
1)下载greenplum客户端解压
wget http://udwclient.cn-bj.ufileos.com/greenplum-client.tar.gz
tar -zxvf greenplum-client.tar.gz
2)配置udw客户端
进入greenplum-client安装目录,编辑 greenplum-client-path.sh
修改UDWHOME:export UDWHOME= client安装目录(如/root/greenplum-client)
3) 使配置生效
在~/.bashrc中添加如下配置
source /data/greenplum-client/greenplum-client-path.sh
source ~/.bashrc
备注:/data/greenplum-client是greenplum-client的安装路径
4) 连接数据库
psql -h hostIP(或域名) –U username -d database -p port –W
1.2 udw(udpg)客户端方式访问(以Centos为例)
1)下载udw客户端
wget http://udwclient.ufile.auto-ai.com.cn/udw-client.tar
解压: tar xvf udw-client.tar
2)配置udw客户端
进入udw-client安装目录,编辑 udw-client-path.sh
修改UDWCLIENT:
export UDWCLIENT=client安装目录(如/root/udw-client)
3)使配置生效在~/.bashrc中添加如下配置
source /data/udw-client/udw-client-path.sh
source ~/.bashrc
备注:/data/udw-client是udw-client的安装路径
4) 连接数据库
psql -h hostIP(或域名) –U username -d database -p port –W
1.3 SQL Workbench/J
2、数据库管理
当你成功连接上数据库后,你可以创建你的第一个数据库(但这不是必须的,你也使用默认创建的数据库来作为你的业务数据库)。下面的操作以psql方式连接到udw为例。
2.1 创建数据库
create database product;
2.2 查看所有数据库
2.3 变更数据库
使用ALTER DATABASE命令,语法如下:
ALTER DATABASE name [ [ WITH ] option [ ... ] ] where option can be: CONNECTION LIMIT connlimit ALTER DATABASE name SET parameter { TO | = } { value| DEFAULT } ALTER DATABASE name RESET parameter ALTER DATABASE name RENAME TO newname ALTER DATABASE name OWNER TO new_owner
2.4 删除数据库
c template1 (切换到template1数据库)
DROP DATABASE product;
3、模式管理
数据库模式(schema)是包含了一系列数据库对象(表,数据类型,自定义函数)集合的命名容器。一个数据库可以有多个模式。不同模式不共享命名空间。public模式是在创建数据库之后就会默认创建的,每个用户都有权限在这个schema创建对象,如果不指定schema那么就会默认创建到这里。
创建一个模式:
CREATE SCHEMA testSchema;
指定数据库的模式搜素路径:
ALTER DATABASE product SET search_path To testSchema,public;
为指定用户指定模式搜素路径:
ALTER ROLE roleName SET search_path To testSchema,public;
删除空模式:
DROP SCHEMA testSchema;
删除非空模式:
DROP SCHEMA testSchema CASCADE;
4、表格设计
udw的表格创建类似于postgresql,由于udw采用mpp数据,创建表格的时候可以选择不同的数据分布策略,不同的存储方式等等。创建表格的时候可以定义下面信息:
数据类型
表约束
数据分布策略
表存储模型
分区策略
外部表:udwfile、udwhdfs
下面分别根据上面的可选信息对表格设计进行分析。
4.1 数据类型
udw的数据类型和postgresql基本一致,在选择数据类型的时候应该尽可能占用空间小,同时能够保证存储所有可能的数值并且最合理地表达数据。
使用字符型数据类型保存字符串,日期或者日期时间戳类型保存日期类型,数值类型来保存数值。
使用 VARCHAR 或者 TEXT 来保存文本类数据。不推荐使用 CHAR 类型保存文本类型。VARCHAR 或 TEXT 类型对于数据末尾的空白字符将原样保存和处理,但是 CHAR 类型不能满足这个需求。请参考 CREATE TABLE 命令了解更多相关信息。
使用 BIGINT 类型存储 INT 或者 SMALLINT 数值会浪费存储空间。如果数据随时间推移需要扩展,并且数据重新加载比较浪费时间,那么在开始的时候就应该考虑使用更大的数据类型。
4.2 表约束
udw表格支持postgresql的表格约束,拥有primary、unique 、check、not null 、foreign等约束,主键约束必须使用hash策略来分布表数据存储,不能在同一个表同时使用主键和唯一约束,并且指定了primary和unique的列必须全部或者部分包含在分布键中。
创建表检查约束
CREATE TABLE products( product_no integer, name text,price numeric CHECK (price > 0) );
创建非空约束
CREATE TABLE products( product_no integer NOT NULL, name text NOT NULL,price numeric );
唯一约束:唯一约束确保存储在一张表中的一列或多列数据数据一定唯一。要使用唯一约束,表必须使用Hash分布策略,并且约束列必须和表的分布键对应的列一致(或者是超集)
CREATE TABLE products( product_no integer UNIQUE, name text, price numeric) DISTRIBUTED BY (product_no);
主键约束:主键约束是唯一约束和非空约束的组合。要使用主键约束,表必须使用Hash分布策略,并且约束列必须和表的分布键对应的列一致(或者是超集)。如果一张表指定了主键约束,分布键值默认会使用主键约束指定的列。
CREATE TABLE products( product_no integer PRIMARY KEY,name text,price numeric) DISTRIBUTED BY (product_no);
4.3 选择数据分布策略
UDW表的记录有两种分布策略,分别是哈希分布(DISTRIBUTED BY(key))和随机分布(DISTRIBUTED RANDOMLY)。如果不指定分布策略默认使用哈希分布,并且选择primary key或者第一个column。
为了尽可能的并行处理数据,需要选择能够最大化地将数据均匀分布到所有计算节点的策略,比如选择primary key;分布式处理中将会存在本地和分布式协作的操作,当不同的表使用相同的分布键的时候,大部分的排序、连接关联操作工作将会在本地完成,本地操作往往比分布式操作快很多,采用随机分布的策略无法享受到这个优势。
创建一个哈希分布的表:
CREATE TABLE products (name varchar(40),prod_id int, supplier_id int) DISTRIBUTED BY (prod_id);
创建一个随机分布的表:
CREATE TABLE randomTable (things text,content text, etc text) DISTRIBUTED RANDOMLY;
修改分布策略: 1)分区策略修改为随机分布:
alter table test set with (reorganize=true) distributed randomly;
2)分区策略修改为按照id的hash分布:
alter table test set with (reorganize=true) distributed by (id);
备注:更多关于分区策略的的使用可以通过命令行执行\h create table 或者 \h alter table 查看
4.4 表存储模型(heap表和appendonly表)
UDW支持两种类型的表:堆表(heap table)和追加表(Appendonly table)。默认创建的是堆表。
堆表(heap table)是最普通的表形式,适合于较小、经常更新的数据存储方式。
追加表(Appendonly table)简称ao表,适合大表、updte比较少的表。
创建一个堆表:
CREATE TABLE heapTable(a int,b text) DISTRIBUTED BY (a);
创建一个追加表(CREATE TABLE 命令的 WITH 子句来指定表存储模型):
CREATE TABLE aoTable(a int,b text) WITH (appendonly=true) DISTRIBUTED BY (a);
4.5 表存储方式(行存储、列存储)
UDW支持行式存储、列式存储。
行存储的应用场景
表数据在载入后经常update;
表数据经常insert;
查询中选择大部分的列;
列存储的应用场景
列存储一般适用于宽表(即字段非常多的表)。在使用列存储时,同一个字段的数据连续保存在一个物理文件中,所以列存储的压缩率比普通压缩表的压缩率要高很多,另外在多数字段中筛选其中几个字段中,需要扫描的数据量很小,扫描速度比较快。因此,列存储尤其适合在宽表中对部分字段进行筛选的场景。注意:列存储的表必须是追加表(Appendonly table)。
创建一个行式存储的表
CREATE TABLE rowTable(a int,b text) WITH (appendonly=true, orientation=row) DISTRIBUTED BY (a);
创建一个列式存储的表
CREATE TABLE colTable (a int,b text) WITH (appendonly=true, orientation=column) DISTRIBUTED BY (a)
4.6 压缩表
UDW压缩表必须是追加表。UDW支持两种级别的压缩:表级别和字段级别。行式表和列式表对压缩的支持也不一样。
行式表支持表级别的压缩,支持的压缩算法有ZLIB。
列式表支持表级别和字段级别的压缩,支持的压缩算法有RLE_TYPE,ZLIB。
RLETYPE的压缩级别compresslevel取值从1到4,级别越高压缩比越高。RLETYPE适合于有大量重复的数据记录。
ZLIB的压缩级别compresslevel取值从1到9,一般选择5已经足够了。
压缩表的应用场景:业务上对表进行更新和删除操作比较少,用truncate+delete就可以实现业务逻辑。不经常对表进行加字段或修改字段类型,对ao表加字段比普通表慢很多。
创建一个使用ZLIB压缩的行压缩表:
CREATE TABLE rowCompressTable (a int, b text) WITH (appendonly=true,orientation=column,compresstype=ZLIB,compresslevel=5);
创建一个使用RLE_TYPE压缩的列压缩表
CREATE TABLE colCompressTable (c1 int,c2 char,c3 char) WITH (appendonly=true, orientation=column, compresstype= RLE_TYPE,compresslevel=2);
4.7 外部表
4.8 变更表
我们可以通过 ALTER TABLE 语句来更改一张表的定义,包括列的定义、数据分布策略、存储模型和分区结构。
给表中的某一列增加非空约束:
ALTER TABLE test ALTER COLUMN street SET NOT NOT NULL;
改变表的数据分布策略
ALTER TABLE test SET DISTRIBUTED BY (id);
其他更多可以通过执行h ALTER TABLE查看帮助。
4.9 删除/清空表
删除表格:
DROP TABLE test;
清空表数据:
DELETE FROM test1; TRUNCATE test2;
5、加载数据
udw提供了丰富的数据加载方式和工具:
用postgresql的insert和copy方式导入数据到udw
用外部表的方式,把文件并行的导入到udw
创建hdfs的外部表,导入导出数据到hdfs
通过sqoop把hdfs中的数据导入到udw
用mysql2udw把mysql中的数据导入到udw
创建ufile的外部表、导入导出数据到ufile
通过外部表导入json格式的数据
在导入大量的数据的时候我们建议不要使用insert一条条的导入数据、强烈建议使用copy、udwfile导入数据。
5.1 insert加载数据
我们可以通过insert插入数据到udw,语法如下所示:
INSERT INTO 表名 [ ( 字段 [, …] ) ] { DEFAULT VALUES | VALUES ( { 表达式 | DEFAULT } [, …] ) | 子查询 }
每次插入一条的效率会比较低、我们建议一次插入多条(500-5000条)数据。如果要加载的数据量比较大的话、强烈建议使用copy方式加载或者我们下面介绍的几种方式加载。如果您的数据已经在udw中,也可以通过insert into table1 select * from table2这种方式加载数据。
5.2 copy加载数据
我们可以用copy快速加载文件数据到udw。具体语法如下:
cat /data/test.dat | psql -h hostIP -U UserName -d DB -c "COPY employee from STDIN with CSV DELIMITER '|';"
hostIP:udw访问id
UserName :访问数据的用户名
DB:数据库名称
employee:表名
5.3 外部表并行加载数据
外部表并行加载数据是利用http协议实现的一个文件服务器,用于创建udw的外部文件表。使用外部表并行加载数据可以让udw的每个子节点并行的加载数据、大大的加快数据导入udw的速度。在加载数据的时候我们可以先创建一个外部表,然后通过INSERT INTO