Greenplum入门——基础知识、安装、常用函数

2017年10月08日 22:03:09 在咖啡里溺水的鱼 阅读数:8709
 
 版权声明:本文为博主原创,允许非商业性质转载但请注明原作者和出处。 https://blog.csdn.net/KEY0323/article/details/78177964

本文为博主在学习Greenplum时阅读的《Greenplum企业应用实战》时的笔记,对书中章节的知识要点进行了归纳和梳理。有兴趣的同学可以找原书学习下。如果认为文中内容涉嫌侵权请及时联系博主删除文章。


软件安装及数据库初始化

Greenplum架构

Master主机与Segment主机的职责

Master

  • 建立与客户端的会话连接和管理
  • SQL的解析并形成分布式的执行计划
  • 将生成好的执行计划分发到每个Segment上执行
  • 收集Segment的执行结果
  • 不存储业务数据,只存储数据字典
  • 可以一主一备,分布在两台机器上
  • 为了提高性能,最好单独占用一台机器

Segment

  • 业务数据的存储和存取
  • 执行由Master分发的SQL语句
  • 对于Master来说,每个Segment都是对等的,负责对应数据的存储和计算
  • 每一台机器上可以配置一到多个Segment
  • 由于每个Segment都是对等的,建议蚕蛹相同的及其配置
  • Segment分primary和mirror两种,一般交错的存放在子节点上

Master和Segment都是一个单独的PostgreSQL数据库。每一个都有自己单独的一套元数据字典。Master节点一般也叫主节点,Segment叫做数据节点。

为了实现高可用,每个Segment都有对应的备节点 Mirror Segment分别存在与不同的机器上。

Client一般只能与Master节点进行交互,Client将SQL发给Master,然后Master对SQL进行分析后再讲其分配给所有的Segment进行操作。

环境搭建

操作系统

Greenplum没有Windows版本,只能安装在类UNIX的操作系统上

数据库存储

Greenplumn极度消耗IO资源,所以对存储的要求比较高。

文件系统的选择上,Linux下建议使用XFS,Solaris建议使用ZFS,对于Raid根据需求选择硬Raid活软Raid,如果需要更大孔家,建议使用Raid5,如果对性能要求更高,可选择Raid1+0.

网络

配置/etc/hosts时,习惯将Master机器叫做mdw,将Segment机器叫做sdw

创建用户及用户组

将原有用户删除

#groupdel gpadmin
#userdel gpadmin
  • 1
  • 2

安装

1.安装数据库软件

创建新的用户和用户组

#groupadd -g 530 gpadmin
#useradd -g 530 -u 530 -m -d /home/gpadmin -s /bin/bash gpadmin
  • 1
  • 2

对文件夹赋权,为新用户创建密码

#chown -R gpadmin:gpadmin /home/gpadmin/
#passwd gpadmin
Changing password for user gpadmin.
New UNIX password:
Retype new UNIX password:
  • 1
  • 2
  • 3
  • 4
  • 5

执行unzip命令解压安装文件

unzip greenplum-db-4.1.1.1-build-1-RHEL5-x86_64.zip
  • 1

为Greenplum软件创建安装目录,并且赋给gpadmin用户权限

mkdir /opt/greenplum
chown -R gadmin:gpadmin /opt/greenplum
  • 1
  • 2

安装

./greenplum-db-4.1.1.1-build-1-RHEL5-x86_64.bin
  • 1

安装完成后Greenplum的环境变量已经在greenplum_path.sh中设置了。 
引用环境变量配置

source /opt/greenplum/greenplum-db/greenplum_path.sh
  • 1

2.配置hostlist

[gpadmin@dw-greenplum01 ]$ cat hostlist
mdw
sdw1
sdw2
sdw3
  • 1
  • 2
  • 3
  • 4
  • 5

seg_hosts只保存segment节点的hostname

[gpadmin@dw-greenplum-1 conf]$ cat seg_hosts
sdw1
sdw2
sdw3
  • 1
  • 2
  • 3
  • 4

3.使用gpssh-exkeys打通所有服务器

使用gpssh-exkeys将所有机器的通道打开,这样就不用输入密码使登陆在每台机器之间跳转了

[gpadmin@dw-greenplum-1 conf]$ gpssh-exkeys -f hostlist
  • 1

打通所有机器通道后,就可以使用gpssh命令对所有机器进行批量操作了

4.将软件分发到每一台机器上

将安装后的文件打包

tar -cf gp4.1.tar greenplum-db-4.1.1.1/
  • 1

使用gpscp命令将这个文件复制到每一台机器上

gpscp -f /home/gpadmin/conf/hostlist gp4.1.tar =:/opt/greenplum
  • 1

使用gpssh命令批量解压文件包

=> cd /opt/greenplum

=> tar -xf gp4.1.tar
  • 1
  • 2
  • 3

创建数据库数据目录 
- Master目录

=> mkdir -p /home/gpadmin/gpdata/gpmaster
  • 1
  • Primary节点目录
=> mkdir -p /home/gpadmin/gpdata/gpdatap1
=> mkdir -p /home/gpadmin/gpdata/gpdatap2
  • 1
  • 2
  • Mirror节点目录
=> mkdir -p /home/gpadmin/gpdata/gpdatam1
=> mkdir -p
/home/gpadmin/gpdata/gpdatam2
  • 1
  • 2
  • 3

Gpmaster目录保存Master的数据,么个机器上的gpdatap1、gpdatap2分别对应这个机器上的两个主数据节点目录,gpdatam1、gpdatam2对应备数据节点目录

5.配置~/.bash_profile

修改环境变量 
添加内容

source /opt/greenplum/greenplum-db/greenplum_path.sh
export MASTER_DATA_DIRECTORY=/home/gpadmin/gpdata/gpmaster/gpseg-1
export PGPORT=2345
export PGDATABASE=testDB
  • 1
  • 2
  • 3
  • 4

6.初始化Greenplum的配置文件

配置文件的模板可以在$GPHOME/docs/cli_help/gpconfigs/目录下找到。gpinitsystem_config文件是初始化Greenplum的模板,在这个模板中,Mirror Segment的配置都被注释掉了,模板中基本初始化数据库的参数都是有的。

# 数据库的代号
ARRAY_NAME = "Greenplum"
MACHINE_LIST_FILE=/home/gpadmin/conf/seg_hosts
# Segment的名称前缀
SEG_PREFIX=gpseg
# Primary Segment骑士的端口号
PORT_BASE=33000
# 指定Primary Segment的数据目录
declare -a DATA_DIRECTORY=(/home/gpadmin/gpdata/gpdatap1 /home/gpadmin/gpdata/gpdatap2)
# Master 所在机器的Hostname
MASTER_HOSTNAME=mdw
# 指定Master的数据目录
MASTER_DIRECTORY=/home/gpadmin/gpdata/gpmster
# Master的端口
MASTER_PORT=2345
# Bash版本
TRUSTED_SHELL=/usr/bin/ssh
# 字符集
ENCODING = UNICODE
# Mirror Segment起始的端口号
MIRROR_PORT_BASE=43000
# Primary Segment 主备同步的起始端口号
REPLICATION_PORT_BASE=34000
#Mirror Segment主备同步的起始端口号
MIRROR_REPLICATION_PORT_BASE=44000
# Mirror Segment的数据目录
declare -a MIRROR_DATA_DIRECTORY=(/home/gpadmin/gpdata/gpdatam1 /home/gpadmin/gpdata/gpdatam2)
  • 1
  • 2
  • 3
  • 4
  • 5
  • 6
  • 7
  • 8
  • 9
  • 10
  • 11
  • 12
  • 13
  • 14
  • 15
  • 16
  • 17
  • 18
  • 19
  • 20
  • 21
  • 22
  • 23
  • 24
  • 25
  • 26
  • 27
  • 28

7.初始化数据库

使用gpinitsystem脚本初始化数据库

gpinitsystem -c initgp_config -s sdw3
  • 1

登陆Greenplum默认的数据库postgres

[gpadmin@dw-greenplum-1 ~]$ psql -d postgres
  • 1

创建数据库

createdb testDB -E utf-8
  • 1

没有设置PGDATABASE环境变量时,使用psql进行登录,默认的数据库与操作系统用户名一致

设置环境变量,修改默认登陆数据库

[gpadmin@dw-greenplum01 ~]$ export PGDATABASE=testDB
[gpadmin@dw-greenplum01 ~]$ psql
  • 1
  • 2

数据库启动与关闭

1.启动数据库

Greenplum提供脚本来管理数据库,gpstart是启动数据库的脚本,可以用gpstart -help查看帮助

一般使用

gpstart -a
  • 1

直接启动数据库

2.关闭数据库

gpstop是关闭数据库的脚本

一般使用

gpstop -a
  • 1

直接关闭数据库

畅游Greenplum

访问Greenplum

1.psql

psql是Greenplum/PostgreSQL默认的客户端

使用psql远程连接

admin@test1:、home/admin>psql -h 10.20.151.7 -p 2345 -d testDB -U gpadmin
  • 1

Greenplum有权限控制,并不是所有的及其都可以连接到数据库。如果有其他计算机要登陆Greenplum,先为数据库用户gpadmin创建一个密码,然后在pg_hba.conf文件中增加客户端机器的权限配置,就可以成功登陆了。

testDB=# alter role gpadmin with password 'gpadmin';
  • 1
  • 2

在$MASTER_DATA_DIRECTORY/pg_hba.conf文件中增加

host testDB gpadmin 10.20.151.1/32 md5
  • 1

使配置生效

gpstop -u
  • 1

2.pgAdmin

基本语法

1.获取语法介绍

可以使用 \h 查看GreenPlum支持的所有语法 
在psql中使用\h command

testDB=# \h create view
  • 1

2.CREATE TABLE

与其他数据库不同的地方: 
- 在Greenplum中建表时需要指定表的分布键 
- 如果表需要用某个字段分区,可以通过partition by将表建成分区表 
- 可以使用like操作创建与like的表一样结构的表,功能类似 create table t1 as select * from t2 limit 0 
- 可以使用inherits实现表的继承

CREATE [[GLOBAL|LOCAL] {TEMPORARY|TEMP}] TABLE table_name (
    [
        {
            column_name data_type [DEFAULT default_expr]
            [column_constraint [...]]
            | table_constraint
            | LIKE ohter_table [{INCLUDING|EXCLUDING} {DEFAULTS|CONSTRAINTS} ...]
        }
        [,...]
    ]...
)
[INHERITS (parent_table [,...])]
[WITH (storage_parameter=value [,...])
[ON COMMIT {PRESERVE ROWS|DELETE ROWS|DROP}]
[TABLESPACE tablespace]
[DISTRIBUTED BY (column,[...]) | DISTRIBUTED RANDOMLY]
[PARTITION BY partition_type (column)
    [SUBPARTITION BY partition_type (column)]
        [SUBPARTITION TEMPLATE (template_spec)]
    [...]
    (partition_spec)
        |[SUBPARTITION BY partition_type(column)]
         [...]
    (partition_spec)
        [(subpartition_spec
            [(...)]
        )]
]
  • 1
  • 2
  • 3
  • 4
  • 5
  • 6
  • 7
  • 8
  • 9
  • 10
  • 11
  • 12
  • 13
  • 14
  • 15
  • 16
  • 17
  • 18
  • 19
  • 20
  • 21
  • 22
  • 23
  • 24
  • 25
  • 26
  • 27
  • 28

Greenplum是一个分布式数据库,有两种数据分布策略: 
1. Hash分布。指定一个活多个分布键,计算hash值,并且通过hash值路由到特定的Segment节点上,语法为Distributed by(…)。如果不指定分布键,默认将第一个字段作为分布键。 
2. 随机分布,也叫平均分布。数据随机分散在每一个节点中,这样无论数据是什么内容,都可以平均分布在每个节点上,==但是在执行SQL的过程中,关联等操作都需要将数据重分布,性能较差。==语法为在表字段定义的后面加上Distributed randomly

采用随机分布策略的表默认将主键或唯一键作为分布键,因为每一个Segment都是一个单一的数据库,单个的数据库可以保证唯一性,多个数据库节点就无法保证全局的跨库唯一性,故只能按照唯一键分布,同一个值的数据都在一个节点上,以此来保证唯一性。

==如果指定的分布键与主键不一样,那么分布键会被更改为主键。==

使用like创建的表,只是表结构会与原表一模一样,表的一些特殊属性并不会一样,例如亚索、只增 appendonly等。如果不指定分布键,则默认分布键与原表相同。

3.SELECT

SELECT语句的基本语法跟其他数据库类似,也有自己的一些特性,例如分页采用offset加limit操作

SELECT可以不用指定From字句,如执行函数、进行一些简单的科学计算等。

如果不加order by字句,查询的结果中,数据的顺序是不能够保证的。

4.create table as 与 select into

create table as 与 select into 有一样的功能,都可以使表根据直接执行SELECT的结果创建出一个新的表,这个在临时分析数据的时候十分方便。例如,在创建一个表的时候如果默认不指定分布键,那么Greenplum根据执行SELECT得到的结果集来选择,不用再次分重分布数据的字段作为表的分布键。

也可以手动加入distributed关键字,指定分布键,这样数据就会根据指定分布键再建表。

select into的语法比create table as更简单,虽然功能一样,但是执行select into不能指定分布键,只能使用默认的分布键。

5.explain

explain用于查询一个表的执行计划。

testDB=# explain select * from test1 x,test2 y where x.id=y.id;
  • 1

6.insert/update/delete

insert

在执行insert语句的时候,注意分布键不要为空,否则分布键默认会变成null,数据都被保存在一个节点上,造成数据分布不均。

可以批量操作

testDB=# insert into test001 values(100,'tom'),(101,'lily');
  • 1

update

不能批量对分布键执行update,因为对分布键执行update需要将数据重分布,Greenplum暂时不支持这个功能。

delete

Greenplum 3.x版本中,如果delete操作涉及子查询,并且子查询的结果还会涉及数据重分布,这样的删除语句会报错。

对整张表执行Delete较慢,有此需求时建议使用truncate

7.truncate

与oracle一样,执行truncate直接删除表的物理文件,然后创建新的数据文件。truncate操作比delete操作在性能上有非常大的提升,当前如果有sql正在操作这张表,那么truncate操作会被锁住,知道表上面的所有锁被释放

常用数据类型

Greenplum的数据类型基本与PostgreSQL的一样。

1.数值类型

类型名称 存储空间 描述 范围
smallint 2字节 小范围整数 -32 768~+32 767
integer 4字节 常用的整数 -2 147 483 648~+2 147 483 647
bigint 8字节 大范围的整数 -9 223 372 036 854 775 808~9 223 372 036 854 775 807
decimal 变长 用户声明精度,精确 无限制
numeric 变长 用户声明精度,精确 无限制
real 4字节 变精度,不精确 6位十进制数字精度
double precision 8字节 变精度,不精确 15位十进制数字精度
serial 4字节 自增整数 1 - 2 147 483 647
bigserial 8字节 大范围的自增整数 1 - 9 223 372 036 854 775 807

2.字符类型

类型名称 描述
character varying(n),varchar(n) 变长,有长度限制
character(n),char(n) 定长,不足补空白
text 变长,无长度限制

3.时间类型

类型名称 存储空间 描述 最低值 最高值 时间精度
timestamp[(p)][without time zone] 8字节 日期和时间 4713BC 5874897AD 1毫秒
timestamp[(p)] with time zone 8字节 日期和时间,带时区 4713BC 5874897AD 1毫秒
interval[(p)] 12字节 时间间隔 -178 000 000年 178 000 000年 1毫秒
date 4字节 只用于表示日期 4713BC 5 874 897AD 1天
time[(p)][without time zone] 8字节 只用于表示一日内的时间 00:00:00 24:00:00 1毫秒
time[(p)] with time zone 12字节 只用于表示一日内时间,带时区 00:00:00+1459 24:00:00-1459 1毫秒

常用函数

字符串函数

函数 返回类型 描述 例子 结果
string||string text 字符串连接    
length(string) int string中字符的数目 length(‘jose’) 4
position(substring in string) int 指定的子字符串的位置 position(‘om’in’Tomas’) 3
substring(string[from int][for int]) text 抽取子字符串 substring(‘Thomas’from 2 for 3) hom
trim([leading|trailing|both][characters]from string) text 从字符串string的开头/结尾/两边删除只包含characters中字符(默认是空白)的最长的字符串 trim(both ‘x’ from ‘xTomxx’) Tom
lower(string) text 把字符串转化为小写    
upper(string) text 把字符串转化为大写    
overlay(string placing string from int [for int]) text 替换子字符串 overlay(‘Txxxxas’ placing ‘hom’ from 2 for 4) Thomas
replace(string text,from text,to text) text 把字符串string中出现的所有子字符串from替换成子字符串to replace(‘abcdefabcdef’,’cd,’XX’) abXXefabXXef
split_part(string text, delimiter text,filed int) text 根据delimiter分隔string返回生成的第field个子字符串(1开始) split_part(‘abc|def|ghi’,’|’,2) def

时间函数

函数 返回类型 描述 例子 结果
age(timestamp,timestamp) interval 减去参数后的”符号化”结果 age(timestamp’2001-04-10’,timestamp’1957-06-13) 43 years 9 mons 27 das
age(timestam) interval 从current_date减去参数中的日期 age(timestam’1957-06-13) -
current_date date 当前的日期 - -
current_time time with time zone 当日时间 - -
current_timestamp timestamp with time zone 当前事务开始时的事件戳 - -
date_part(text,timestamp) double precision 获取子域(等效于extract) date_part(‘hour’,timestamp’2001-02-16 20:38:40) 20
date_trunc(text,timestamp) timestamp 截断成指定的精度 date_trunc(‘hour’,timestamp ‘2001-02-16 20:38:40’) 2001/2/16 20:00
extract(field from timestamp) double precision 获取子域 (同date_part) (同date_part)
now() timestampe with time zone 当前事务开始的时间戳 - -

使用interval类型可以直接对事件类型进行计算,用来计算时间的加减

数值计算函数

函数 返回类型 描述 例子 结果
abs(x) (与x相同) 绝对值 - -
ceil(dp或numeric)\ceiling (与输入相同) 不小于参数的最小整数 - -
exp(dp或numeric) (与输入相同) 自然指数 - -
ln(dp或numeric) (与输入相同) 自然对数 - -
log(dp或numeric) (与输入相同) 以10 为底的对数 - -
log(b numeric,x numeric) numeric 以b为底的对数 - -
mod(y,x) (与参数类型相同) y/x的余数 - -
pi() dp π - -
power(a numeric,b numeric) numeric a的b次幂 - -
radians(dp) dp 把角度转为弧度 - -
random() dp 0~1之间的随机数    
floor(dp或numeric) (与输入相同) 不大于参数的最大整数 - -
round(v numeric,s int) numeric 圆整为s位小数 round(42.4382,2) 42.44
sign(dp或numeric) (与输入相同) 参数的符号(-1,0,+1) sing(-8,4) -1
sqrt(dp或numeric) (与输入相同) 平方根 - -
cbrt(dp) dp 立方根 - -
trunc(v numeric,s int) numeric 截断为s位小数 - -

其他常用函数

序列号生成函数——generate_series

generate_series(x,y,t)
  • 1

生成多行数据从x到另外y,步长为t,默认是1

字符串列转行——string_agg

string_agg(str,symbol [order by str])
  • 1

(按照某字段排序)将str列转行,以symbol分隔

字符串行转列——regexp_split_to_table

hash函数——md5,hashbpchar

md5的hash算法精度为128位,返回一个字符串 
Hashbpchar的精度是32位,返回一个integer类型

分析函数

开窗函数

聚合函数返回各个分组的结果,开窗函数则为每一行返回结果。

rank()、row_number

grouping sets

如果需要对几个字段的组合进行group 不用,需要用到grouping sets功能

group sets语法 等价的普通SQL的语法
SELECT C1,C2,SUM(C3)FROM T GROUP BY GROUPING SETS((C1),(C2)) SELECT C1,NULL AS C2,SUM(C3) FROM T GROUP BY T UNION ALL SELECT NULL AS C1,C2,SUM(C3) FROM T GROUP BY YEAR
GROUP BY GROUPING SETS((C1,C2,…Cn)) GROUP BY C1,C2,…,Cn
GROUP BY ROLLUP(C1,C2,…,Cn-1,Cn) GROUP BY GROUPING SETS((C1,C2,…CCn-1,Cn),(C1,C2,…,Cn-1)…,(C1,C2),(C1),())
GROUP BY CUBE(C1,C2,C3) GROUP BY GROUPING SETS((C1,C2,C3),(C1,C2),(C1,C3),(C2,C3),(C1),(C2),(C3),())

分区表

Greenplum支持分区表。

可以使用时间分区、Every分区、list分区、

创建分区表

[PARTITION BY partition_type (column)
    [SUBPARTITION BY partition_type (column)]
        [SUBPARTITION TEMPLATE (template_spec)]
    [...]
    (partition_spec)
        |[SUBPARTITION BY partition_type(column)]
         [...]
    (partition_spec)
        [(subpartition_spec
            [(...)]
        )]
]
and partition_element is:

DEFAULT PARTITION name
| [PARTITION name] VALUES (list_value[,...])
| [PARTITION name]
    START ([datatype] 'start_value') [INCLUSIVE|EXCLUSIVE]
    [ END ([datatype] 'end_value') [INCLUSIVE|EXCLUSIVE]
    [ EVERY ([datatype] [number|INTERVAL] 'interval_value')]
| [PARTITION name]
    END ([DATATYPE] 'end_value') [INCLUSIVE|EXCLUSIVE]
    [ EVERY ([datatype] [number|INTERVAL] 'interval_value')]
    [ with (partition_storage_parameter=value [,...])]
    [ TABLESPACE tablespace]
  • 1
  • 2
  • 3
  • 4
  • 5
  • 6
  • 7
  • 8
  • 9
  • 10
  • 11
  • 12
  • 13
  • 14
  • 15
  • 16
  • 17
  • 18
  • 19
  • 20
  • 21
  • 22
  • 23
  • 24
  • 25
Tips

通过实验得到:向主表插入数据时,数据会被自动存放至相应的分区表。 
也可以直接向分区子表插入符合条件的数据, 
当向分区子表插入不符合条件的额数据时,会提示: 
[Err] ERROR: Trying to insert row into wrong partition (seg1 hadoop3:40000 pid=6679) 
DETAIL: Expected partition: test_partition_range_1_prt_p20111231, provided partition: test_partition_range_1_prt_p20111230

删除主表是会自动删除关联的分区表

Examples

按时间分区
create table public.test_partition_range(
  id numeric,
  name character varying(32),
  dw_end_date date,
) distributed by(id)
PARTITION BY range(dw_end_date)
(
    PARTITION p20111230 START ('2011-12-30'::date) END ('2011-12-31'::date),
    --...
);
  • 1
  • 2
  • 3
  • 4
  • 5
  • 6
  • 7
  • 8
  • 9
  • 10
使用Every分区
create table test.test_partition_every(
  id numeric,
  name character varying(32),
  dw_end_date date
) distributed by(id)
partition by range(dw_end_Date)
(
  partition p201112 start('2011-12-1'::date) end ('2011-12-31'::date)
  every ('1 days'::interval)
);
  • 1
  • 2
  • 3
  • 4
  • 5
  • 6
  • 7
  • 8
  • 9
  • 10
使用list分区
create table test.test_partition_list(
  member_id numeric,
  city character varying(32)
)distributed by (member_id)
partition by list(city)
(
  partition guangzhou values('guangzhou'),
  partition hangzhou values('hangzhou'),
  default partition other_city
);
  • 1
  • 2
  • 3
  • 4
  • 5
  • 6
  • 7
  • 8
  • 9
  • 10

修改分区表

ALTER DEFAULT PARTITION
DROP DEFAULT PARTITION [IF EXISTS]
DROP PARTITION [IF EXISTS] {
  partition_name
  | FOR (RANK(number))
  | FOR (value)
}
[CASCADE]
TRUNCATE DEFAULT PARTITION
TRUNCATE PARTITION {
  partition_name
  | FOR (RANK(number))
  | FOR (value)
}
RENAME DEFAULT PARTITION TO new_partition_name
RENAME PARTITION {
  partition_name
  | FOR (RANK(number))
  | FOR (value)
}
TO new_partition_name
ADD DEFAULT PARTITION NAME [(subpartition_spec)]
ADD PARTITION [name] partition_element
  [(subpartition_spec)]
EXCHANGE PARTITION {
  partition_name
  | FOR (RANK(number))
  | FOR (value)
} WITH TABLE TABLE_NAME
  [WITH|WITHOUT VALIDATION]
EXCHANGE EFAULT PARTITION WITH TABLE TABLE_NAME
  [WITH|WITHOUT VALIDATION]
SET SUBPARTITION TEMPLATE (subpartition_spec)
SPLIT DEFAULT PARTITION {
    AT (list_value)
  |START([datatype] range_value) [INCLUSIVE|EXCLUSIVE]
   END ([datatype]) range_value) [INCLUSIVE|EXCLUSIVE]
}
[INTO (PARTITION new_partition_name,
       PARTITION default_partition_name)]
SPLIT DPARTITION {
  partition_name
  | FOR (RANK(number))
  | FOR (value)
} AT(value)
[INTO (PARTITION partition_name, PARTITION partition_name]
  • 1
  • 2
  • 3
  • 4
  • 5
  • 6
  • 7
  • 8
  • 9
  • 10
  • 11
  • 12
  • 13
  • 14
  • 15
  • 16
  • 17
  • 18
  • 19
  • 20
  • 21
  • 22
  • 23
  • 24
  • 25
  • 26
  • 27
  • 28
  • 29
  • 30
  • 31
  • 32
  • 33
  • 34
  • 35
  • 36
  • 37
  • 38
  • 39
  • 40
  • 41
  • 42
  • 43
  • 44
  • 45
  • 46

Examples

新增分区
alter table test.test_partition_every add partition p20120105_6
start ('2012-01-05'::date) END ('2012-01-07'::date);
  • 1
  • 2
drop/truncate分区
alter table test.test_partition_every drop partition p20120105_6;

alter table test.test_partition_every truncate partition p20120105_6;
  • 1
  • 2
  • 3
拆分分区
alter table test.test_partition_every split partition p20120105_6
at(('2012-01-06'::date)) into (partition p20120105,partition p20120106);
  • 1
  • 2
交换分区
alter table test.test_partition_every exchange partition p20120102 with table test.test_on_partition;
  • 1

外部表

Greenplum在数据加载上有一个明显的优势,就是支持数据并发加载,gpfdist就是并发加载的工具,在数据库中对应的就是外部表。

外部表就是一张表的数据是指向数据库之外的数据文件的。在Greenplum中,可以对一个外部表执行正常的DML操作,当读取数据的时候,数据库就从数据文件中加载数据。外部表支持在Segment上并发的告诉从gpfdist导入数据,由于是直接从Segment上导入数据,所以效率非常高。

创建外部表

CREATE [READABLE] EXTERNAL TABLE TABLE_NAME
(column_name data_type [,...] | LIKE other_table)
LOCATION ('file://seghost[:port]/path/file' [,...])
  | ('gpfdist://filehost[:port]/file_pateern' [,...])
  | ('gphdfs://hdfs_host[:port]/path/file')
FORMAT 'TEXT'
[( [HEADER]
   [DELIMITER [AS] 'delimeter' | 'OFF']
   [NULL [AS] 'null string']
   [ESCAPTE [AS] 'escape'|'OFF']
   [NEWLINE [AS] 'LF'|'CR'|'CRLF']
   [FILL MISSING FIELDS] )]
| 'CSV'
[( [HEADER]
   [QUOTE [AS] 'quote']
  • 1
  • 2
  • 3
  • 4
  • 5
  • 6
  • 7
  • 8
  • 9
  • 10
  • 11
  • 12
  • 13
  • 14
  • 15

外部表需要指定gpfdist的IP和端口,详细目录地址。其中文件名支持通配符匹配。 
可以编写多个gpfdist的地址,但是不能超过总的Segment数,否则会报错。在创建外部表的时候可以指定分隔符、err表、指定允许出错的数据条数,以及源文件的字符编码等。

外部表还支持本地文本文件的导入,效率较低,不建议使用。 
外部表还支持HDFS的文件操作。

启动gpfdist及创建外部表

1.

首先在文件服务器上启动gpfdist服务,指定文件目录及端口

nohup $GPHOME/bin/gpfdist -d /home/admin -p 8888 > /tmp/gpfdist.log 2>&1 &
  • 1

nohup保证程序在Server端执行,当前会话关闭后,程序仍然正常运行

nohup是Unix/Linux中的一个命令,普通进程通过&符号放到后台运行,如果启动该程序的额控制台退出,则该进程终止。nohup命令启动程序,则在控制台退出后,进程仍然继续运行,起到守护进程额作用。

2.

准备好需要加载的数据文件,将其放在外部表文件及其的、home/admin/目录或该目录的子目录下,在Greenplum中创建对应的外部表

create external table test.test001_ext(
  id integer,
  name varchar(128)
)
location (
  'gpfdist://10.20.151.11:8888/gpextdata/test001.txt'
)
format 'TEXT' (delimiter as E'|' null as '' escape 'OFF')
encoding 'gb18030' log errors into test.test001_err segment reject limit 10rows;
  • 1
  • 2
  • 3
  • 4
  • 5
  • 6
  • 7
  • 8
  • 9

3.外部表查询及数据加载

testDB=# select * from public.test001_ext
  • 1

COPY命令

使用COPY命令可以实现将文件导出和导入,但是要通过Master,效率没有外部表高,但是在数据量比较小的情况下,COPY命令比外部表要方面很多。

COPY table [(colum [, ...]) ] FROM {'file'|STDIN}
[ [WITH]
  [OIDS]
  [HEADER]
  [DELIMITER [AS] 'delimeter']
  [NULL [AS] 'null string']
  [ESCAPE [AS] 'escape' | 'OFF']
    [NEWLINE [AS] 'LF'|'CR'|'CRLF']
  [CSV [QUOTE [AS] 'quote']
    [FORCE NOT NULL column [,...]]
  [FILL MISSING FIELDS]
  [ [LOG ERRORS INTO error_table] [KEEP]
     SEGMENT REJECT LIMIT count [ROWS|PERCENT]]
COPY {table [(column [,...])] |(query) } TO {'file'|STDOUT}
  [ [WITH]
    [OIDS]
    [HEADER]
    [DELIMIETER [AS] 'delimeter']
    [NULL [AS] 'null string']
    [ESCAPE [AS] 'escape'|'OFF']
    [CSV [QUOTE [AS] 'quote']
         [FORCE QUOTE column [,...]]]
  • 1
  • 2
  • 3
  • 4
  • 5
  • 6
  • 7
  • 8
  • 9
  • 10
  • 11
  • 12
  • 13
  • 14
  • 15
  • 16
  • 17
  • 18
  • 19
  • 20
  • 21
  • 22

Greenplum 4.x中引入了可写外部表,在导出数据的时候可以用可写外部表并发导出,性能很好。但在Greeplum3.x版本中,导出数据只能通过COPY命令实现,数据在Master上汇总导出。

如果需要将数据远程导出到其他机器上,可以使用copy to stdout,远程执行psql连接到数据库上,然后通过管道将数据重定向成文件。

Greenplum入门——基础知识、安装、常用函数的更多相关文章

  1. 1)Linux程序设计入门--基础知识

    )Linux程序设计入门--基础知识 Linux下C语言编程基础知识 前言: 这篇文章介绍在LINUX下进行C语言编程所需要的基础知识.在这篇文章当中,我们将 会学到以下内容: 源程序编译 Makef ...

  2. USB入门基础知识(转)

    源:USB入门基础知识 相关名词: 主机(Host) 设备(Device) 接口(Interface) 管道(Pipe) 管道是主机与设备端点数据传输的连接通道,代表了主机的数据缓冲区与设备端点之间交 ...

  3. Linux入门基础知识

    注:内容系兄弟连Linux教程(百度传课:史上最牛的Linux视频教程)的学习笔记. Linux入门基础知识 1. Unix和Linux发展历史 二者就像父子关系,当然Unix是老爹.1965年,MI ...

  4. React Native 入门基础知识总结

    中秋在家闲得无事,想着做点啥,后来想想,为啥不学学 react native.在学习 React Native 时, 需要对前端(HTML,CSS,JavaScript)知识有所了解.对于JS,可以看 ...

  5. CodeMix入门基础知识

    CodeMix在线订购年终抄底促销!火爆开抢>> CodeMix入门 CodeMix是一个Eclipse插件,可以直接从Eclipse访问VS Code和为Code OSS构建的附加扩展的 ...

  6. PHP基础入门(二)---入门基础知识必备

    前言 在上一章中,我们初步了解了PHP的网页基础和PHP的入门基础,今天继续给大家分享更多有关PHP的知识. 理论知识看起来可能比较枯燥一些,但是我们的实践(敲代码)毕竟离不开它. 只有理论与实践相结 ...

  7. [转] linux操作系统下c语言编程入门--基础知识

    点击阅读原文 这篇文章介绍在LINUX下进行C语言编程所需要的基础知识.在这篇文章当中,我们将会学到以下内容: 1. 源程序编译        2. Makefile的编写        3. 程序库 ...

  8. 【值得收藏】C语言入门基础知识大全!从C语言程序结构到删库跑路!

    01 C语言程序的结构认识 用一个简单的c程序例子,介绍c语言的基本构成.格式.以及良好的书写风格,使小伙伴对c语言有个初步认识. 例1:计算两个整数之和的c程序: #include main() { ...

  9. React入门---基础知识-大纲-1

    -----------------在慕课网学习react入门笔记-------------- ---------博主边学边记录,手把手进行学习及记录---------- --------------- ...

随机推荐

  1. date命令使用文档

    date命令的帮助信息 [root@localhost source]# date --help用法:date [选项]... [+格式] 或:date [-u|--utc|--universal] ...

  2. grep 详解

    grep 是一种强大的文本搜索工具,它能使用正则表达式搜索文本,并把匹配的行打印出来.(global search regular expression(RE) and print out the l ...

  3. html5 利用谷歌地图显示当前位置

    目前,google在国内需要FQ才能上,翻不了墙的话,只能获取到经纬度信息. *调用navigator.geolocation对象时,首先要获取用户同意. navigator.geolocation. ...

  4. iOS 一句话获取日期和星期几

    UILabel *dateLabel = [[UILabel alloc]initWithFrame:CGRectMake(, , self.view.frame.size.width, )]; da ...

  5. 网页图表Highcharts实践教程之标签组与载入动画

    网页图表Highcharts实践教程之标签组与载入动画 Highcharts标签组 在图表的大部分元素都提供了标签功能.但很多时候,我们需要额外说明一些信息.这个时候借助原有的图表元素的标签功能就不是 ...

  6. 【BZOJ-2063】我爸是李刚 数位dp 好题

    2063: 我爸是李刚 Time Limit: 10 Sec  Memory Limit: 64 MBSubmit: 139  Solved: 72[Submit][Status][Discuss] ...

  7. 2010-2011 ACM-ICPC, NEERC, Moscow Subregional Contest Problem J. Joke 水题

    Problem J. Joke 题目连接: http://codeforces.com/gym/100714 Description The problem is to cut the largest ...

  8. Mac下配置Apache服务器

    有的时候,我们需要在内网工作组中分享一些文件或是后台接口没有及时给出,你又想要模拟真实数据,直接在项目里创建plist也可以做到这种需求,但难免让工程变得冗余且看起来比较Low.这个时候就看出配置本地 ...

  9. MikroTik RouterOS电子克隆盘原理收集

    终于搞定RouteROS8位电子盘克隆,发个讯息出来分享一下. 不需要付费的免费分享,也没要刻意挡人财路:只是让信息流通一下. 也请看到的人不要用这个方式去赚钱,不然MikroTik还是会再反制的. ...

  10. SimpleUpdater.NET

    本类库+工具用于快速实现一个简单的自动更新程序,旨在快速简单地为现有的.Net应用程序添加上比较简单的自动更新功能. 本页包含以下内容 概述 整个自动升级工作的流程 更新包生成工具 发布更新包 为应用 ...