您的位置:首页 > 其它

greenplum交互分区用于数据增量和数据压缩变更

2014-11-13 23:37 176 查看

greenplum属于MPP数据库的一种,也是建立数据仓库的常用MPP database。greenplum
对于分区表的数据是采用单个表,即分区表是独立的一个逻辑表和物理表,则每个分区有单独的自己的索引等信息,非常适合大数据增量流程的构建。

分区表:

支持rang和list以及两者混合的分区选项,无限制子分区层级数量;rang分区键只能有一个,适用于时间、数字范围的分区,list可以有多个分区键,适用于字符值的分区。

使用时间分区的时候建议采用最细粒度的平面分区而不是多层级的分区,平面分区有更佳的查询速度,多级分区有更好的查询计划分析时间。

分区表使用限制,分区键必须包含主键或者唯一键;

RAND范围分区:

partiton by range(date) (start (date '2014-01-01') inclusive end (date '2015-01-01') exclusive,every(interval '1 month'))

LIST列表分区:

partiton by list(region) (partition prtusa values('usa'),partition prtchina values('china'),default prtother other)

分区的选择性,查询计划只能对稳定的比较运算符执行选择性扫描:= < <= > >= <>,不能选择不稳定的函数,比如时间,但是可以对日期选择比较

1、交互分区方式可以替换分区表中的某个分区,典型地,当前分区为非压缩表,可以构建相同数据的压缩表替换掉这个分区。

-1.创建分区转换临时表

CREATE TABLE my_schema.for_exchange

with (APPENDONLY=true, COMPRESSLEVEL=9)

as (select * from my_schema.current_partition)

DISTRIBUTED BY (day_id, fst_agc_offc_cd, carr_cd, flt_nbr);

--3.比较数据内容

select 'org',count(*) from my_schema.current_partition group by 1

union

select 'new',count(*) from my_schema.for_exchange group by 1

===============================================================

"new";35375423

"org";35375423

===========================================================

--4.交换分区

alter table my_schema.schl_pnrd_daily exchange partition month201303 with table my_schema.for_exchange


--5.检验交换无问题

select 'org',count(*) from my_schema.current_partition group by 1

union

select 'new',count(*) from my_schema.for_exchange group by 1

"new";35375423

"org";35375423

-- 6.删除交换出去的分区

drop table my_schema.for_exchange

2、增量数据更新

CREATE TABLE dw1.t_m_user_ugc_playvideo_details

(

f_platform INTEGER,

f_uid CHARACTER VARYING,

f_day INTEGER,

f_hour INTEGER,

f_vid BIGINT,

f_catecode INTEGER,

f_userid CHARACTER VARYING,

f_videolength BIGINT,

f_site SMALLINT,

f_speed INTEGER,

f_suspend INTEGER,

f_backward INTEGER,

f_slide INTEGER,

f_playtime INTEGER

)

DISTRIBUTED BY (f_uid) PARTITION BY LIST (f_day)(

PARTITION p20141109 VALUES (20141109),

PARTITION p20141110 VALUES (20141110)

);

CREATE TABLE tempschema.t_m_user_ugc_playvideo_details

(

f_platform INTEGER,

f_uid CHARACTER VARYING,

f_day INTEGER,

f_hour INTEGER,

f_vid BIGINT,

f_catecode INTEGER,

f_userid CHARACTER VARYING,

f_videolength BIGINT,

f_site SMALLINT,

f_speed INTEGER,

f_suspend INTEGER,

f_backward INTEGER,

f_slide INTEGER,

f_playtime INTEGER

)

DISTRIBUTED BY (f_uid);

alter table dw1.t_m_user_ugc_playvideo_details

add partition p20141109 VALUES(20141109);

alter table dw1.t_m_user_ugc_playvideo_details drop partition if exists 20141109;

增量数据放到一个临时表里面:tempschema.t_m_user_ugc_playvideo_details,用该表的数据提供目的表:dw1.t_m_user_ugc_playvideo_detailsde 的分区如p20141109

alter table dw1.t_m_user_ugc_playvideo_details exchange partition p20141109

with table tempschema.t_m_user_ugc_playvideo_details ;
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: