数据基础---postgresql和greenplum的使用

PostgreSQL连接和登录

PostgreSQL登录及修改密码
PostgreSQL 连接问题 FATAL: no pg_hba.conf entry for host
命令行方式登录PostgreSQL
理解PostgreSQL中的权限

postgresql 的database、schema、table

PostgreSQL学习—模式schema

PostgreSQL 9.3.1 中文手册

postgresql中的数据类型

PostgreSQL中布尔类型(boolean)

postgresql建表

postgresql建表示例

PostgreSQL 临时表

PostgreSQL 临时表

PostgreSQL 之 with查询


create temp table countsXXX with (appendonly=true,compresstype=quicklz) on commit drop as
	select XXX,YYY,count(*) as countXXX from temp.table_Z group by XXX,YYY
distributed by (XXX);
select * from countsXXX where countXXX>1;

修改表

ALTER TABLE的用法 增加列、删除列、改列名、改列约束、改表名
greenplum创建表,修改表语句

gp中添加一列

ALTER TABLE report.AAA
ADD COLUMN DFLAG boolean DEFAULT FALSE

gp中修改列

修改默认值

ALTER TABLE report.AAA
    ALTER COLUMN DFLAG SET DEFAULT FALSE

修改列的数据类型

alter table temp.tty 
alter column  AAA type bigint

gp中更新列值

Greenplum update语法

update report.AAA t
  set dflag = TRUE
  from (
	select CCC 
	from cnp_wip.CCC 
	where status_bo ='BBB:'||site||',407' and date(MODIFIED_DATE_TIME)=current_date
	) t1
 where t.CCC = t1.CCC

或者

create temp table CCC_tmp with(appendonly=true,compresstype=quicklz) on commit drop as
	select CCC 
	from cnp_wip.CCC 
	where status_bo ='BBB:'||site||',407' and date(MODIFIED_DATE_TIME)=current_date
distributed by (CCC);

update report.AAA t
  set dflag = TRUE
  from (
	select * 
	from CCC_tmp
	) t1
 where t.CCC = t1.CCC

postgreSQL时间

postgreSQL格式化时间的函数详解

PostgreSQL: 浅谈 PostgreSQL 的 timestamp 类型

PostgreSQL的时间/日期函数使用

now()
current_timestamp
current_date
current_time
两年后
now() + interval ‘2 years’
一个月后
now() + interval ‘1 month’
三周前
now() - interval ‘3 week’
十分钟后
now() + ‘10 min’

计算两个时间差
select age(now(), timestamp ‘1989-02-05’);
select age(timestamp ‘2007-09-15’);
时间字段的截取
EXTRACT(field FROM source)
extract(year from now())
extract(month from now());
extract(day from timestamp ‘2013-04-13’);
EXTRACT(DAY FROM INTERVAL ‘40 days 1 minute’);

PostgreSQL中的时区转换

方法一:

(to_timestamp(XX_DATE_TIME,'YYYY-MM-DD HH24:MI:SS')::timestamp without time zone  + interval '8 hour') AS XX_DATE

方法二:
来源
时区没有时间戳并说它是UTC,那么我会把它打印成我当地的时区

SELECT ((timestamp '2015-10-24 16:38:46') AT TIME ZONE 'UTC');
        timezone        
------------------------
 2015-10-24 17:38:46+01

你想要的“EST”似乎在美洲的某个地方,从返回的值来判断。如果需要,可以将表达式包装在一个小SQL函数中。

 SELECT ((timestamp '2015-10-24 16:38:46') AT TIME ZONE 'UTC') AT TIME ZONE 'EST';
      timezone       
---------------------
 2015-10-24 11:38:46
(1 row)

在查询中执行类似操作

SELECT ((stored_timestamp AT TIME ZONE 'UTC') AT TIME ZONE 'EST') AS local_timestamp
FROM my_table;

其实就是把本地时间转成UTC,再把UTC转成目标时区

PostgreSQL-join多表连接查询和子查询

Postgresql查询每组的前N条记录

Postgresql查询每组的前N条记录
postgres 分组排序获取前几条
PostgreSQL雕虫小技,分组TOP性能提升44倍

row_number() over(partition by XX,yy,ZZ,mm order by SUM(nn) desc) as mm_order

PostgreSQL 正则表达式

postgreSQL字符串操作

postgresql----字符串函数与操作符
postgreSQL中的array_to_string函数和如何实现group_concat
postgresql如何实现group_concat功能
PostgreSQL数据库切割和组合字段函数
postgresql字符转义

Postgresql行转列

Postgresql 条件表达式

postgres-#	 SELECT num,
postgres-#   CASE num WHEN 1 THEN 'one'
postgres-#            WHEN 2 THEN 'two'
postgres-#            WHEN 3 THEN 'three'
postgres-#            ELSE 'other'
postgres-#   END 
postgres-#   FROM t_1 
postgres-#   ORDER BY 1, 2;

PostgreSQL 分区

Postgresql 10 HASH分区实现
PostgreSQL PARTITION 分区表
不到一定数据量没必要分区,数据按分区键分布要均匀

PostgreSQL 数据库性能提升

PostgreSQL 数据库性能提升的几个方面

PostgreSql中的函数

PostgreSQL学习手册(SQL语言函数)
PostgreSQL学习手册(五) 函数和操作符

postgresql数据库的数据导出

postgresql数据库的数据导出

将greenplum 数据导入mysql 数据库工具

数据库工具

Welcome to Withdata Software!

利用DBeaver将postgresql数据导入

测试有效
导数据的时候主要是主外键容易出问题,同时DBeaver导数据也存在一定bug,但可以用。
为了数据转换更顺利,可以先在mysql中建立没有主外键的表,然后再从postgrresql中导出数据,完成后再补上主外键信息。

postgresql中笔记

su -postgresql
psql
\c ambri
\l


pg -dump -u postgre hive > hive.sql





查看pg的相关设置
select * from pg_settings
例如
select * from pg_settings where name='statement_timeout' --查看语句执行时长,statement_timeout = 0  表示可以一直执行下去
select * from pg_settings where name='client_encoding' --查看客户端编码格式




postgresql中字符串需要用单引号包裹,如果使用双引号,系统将认为那是变量.所以最常见的转义就是对单引号的转义,postgresql对单引号的转义有两种方式: 

一是在需要转义的单引号前面再加一个单引号:
UPDATE user SET username = 'Peter''s Name' WHERE id = 1;
 

二是在字符串前面加上E,然后使用反斜杠: 
DELETE FROM user WHERE username = E'Peter\'s Name';
 

如果你不想要每次都写E或者加上单引号就直接使用自己习惯的反斜杠,可以设置postgresql的一个参数:

SET standard_conforming_strings = on;
这样就可以不加E直接使用反斜杠转义了.想要关闭只需要: 

SET standard_conforming_strings = off;



也可以对相关的值进行设置,比如。
SET statement_timeout = 0;
SET client_encoding = 'UTF8';
SET standard_conforming_strings = on;
SET check_function_bodies = false;
SET client_min_messages = warning;


从外部导入数据的时候可能要做一些设置,但是本身系统如果很多人在用,又不能影响别人。可以把原来的设置保存下来。临时改过去,导完数据后,再改回来。当然最好不要这么操作。


psql
\l
\c ambari;
\dp+ ambari.
\dS ambari.admin

Greenplum运维

Greenplum运维脚本编写方式

Greenplum优化–SQL调优篇

GreenPlum高效去除表重复数据


--查找重复数据并合并,通过计数知道哪些是重复的
CREATE TEMP TABLE ZT_duplicate_jr with(appendonly=true,compresstype=quicklz) ON COMMIT DROP AS 
	select 
		aaa
		,bbb
		,ccc
		,count(*) 
	from 
		report.tbltabl
	where 
		aaa > i_begintime 
	group by bbb,ccc
	having count(*)>1
distributed by (bbb);



--删除重复数据
delete from 
	report.tbltabl  as a
	using ZT_duplicate_jr as b
where 
	coalesce(a.bbb ,'infd')=coalesce(b.bbb ,'infd')
	AND coalesce(a.ccc,'infd')=coalesce(b.ccc,'infd');
	
	
----将之前合并好的重复数据插回结果表
insert into report.tbltabl
	select  
		A.aaa,A.bbb,A.ccc
	from ZT_duplicate_jr as A ;

问题

PostgreSQ 连接问题 FATAL: no pg_hba.conf entry for host

数据同步

/*需要在写集群各步步骤都做完之后再进行同步*/
/*第一次增量同步前需要全量同步*/
/*copy_table_between_cluster是将数据从源表搬到目标表(或中间表作为目标表,mid标示中间表)的自定义函数,1=1表示全量,true表示有分区,false表示没有分区;exec_sql_on_remote_master是执行analyse的函数*/

1、同步脚本:
select public.copy_table_between_cluster(
'report.taltbltabl',
'mdp',
'w_r_diff.taltbltabl_mid',
'111.222.333.444',
'5432',
'START_TIME >= ''$begin'' AND start_time < ''$end''',
'true' );
假设从写同步到读
参数1:源表
参数2:目标数据库
参数3:目标数据库的IP
参数4:目标数据库的端口
参数5where添加(全量1=1)
参数6truetruncate 目标表,false:不做truncate操作


2、发sql到远程数据库执行
参数1:执行的sql
参数2:目标数据库
参数3:端口号
select public.exec_sql_on_remote_master
('delete from report.taltbltabl
  where START_TIME >= ''$begin'' AND start_time < ''$end'';
  insert into report.taltbltabl
  select * from w_r_diff.taltbltabl_mid;
  analyse report.taltbltabl',
'mdp',
'111.222.333.444',
'5432'
);

注意点:
1、分区表不可以直接同步,需要借助中间表:

1.1、需要在目标数据库建一个和源数据库分区表结构一样的非分区表,名字统一是源表名_mid,放在 w_r_diff 这个schemas
1.2、将源表数据同步到目标数据库的mid表
1.3、在目标数据库将mid表插入到目标数据库对应的分区表

2、增量同步时,同步前需要对目标表也执行增量删除后,再增量同步。

3、每次同步后要对表做analyse。如果有truncate也可以在analyse后加 vacuum full

4、为了不影响写集群的写入操作,将同步脚本写在原脚本begin end后面。

4、如果写集群数据异常,需要带参数重跑数据时,也要对读集群的数据维护,保证两边数据一致。

5、如果写集群表结构有改动,读集群的表结构也要做相应调整


同步例子:

/*一:分区表全量同步,从写集群到读集群*/
/*
步骤1:全量将写集群的表同步到读集群的mid表中(对mid表有做truncate)
*/
select public.copy_table_between_cluster(
'report.taltbltabl',
'mdp',
'w_r_diff.taltbltabl_mid',
'111.222.333.444',
'5432',
'1=1',
'true' );
/*
步骤2:在读集群将目标分区表truncate掉,再将mid表数据插入到目标表
*/
select public.exec_sql_on_remote_master
('truncate report.taltbltabl;
  insert into report.taltbltabl
  select * from w_r_diff.taltbltabl_mid',
'mdp',
'111.222.333.444',
'5432'
);
/*
步骤3:对目标表做analyse
*/
select public.exec_sql_on_remote_master
('analyse report.taltbltabl',
'mdp',
'111.222.333.444',
'5432'
);

/*二:非分区表全量同步,从写集群到读集群*/
/*
步骤1:全量将写集群的表同步到读集群目标表中(对目标表有做truncate)
*/
select public.copy_table_between_cluster(
'report.taltbltabl',
'mdp',
'report.taltbltabl',
'111.222.333.444',
'5432',
'1=1',
'true' );

/*步骤2:对目标表做analyse
*/
select public.exec_sql_on_remote_master
('analyse report.taltbltabl',
'mdp',
'111.222.333.444',
'5432'
);

/*步骤3:对目标表做 vacuum full
*/
select public.exec_sql_on_remote_master
('vacuum full report.taltbltabl',
'mdp',
'111.222.333.444',
'5432'
);


/*三:分区表增量同步,从写集群到读集群*/
/*步骤1:增量将写集群的表同步到读集群的mid表中(对mid表有做truncate)
*/
select public.copy_table_between_cluster(
'report.taltbltabl',
'mdp',
'w_r_diff.taltbltabl_mid',
'111.222.333.444',
'5432',
'START_TIME >= ''$begin'' AND start_time < ''$end''',
'true' );
/*步骤2:在读集群将目标分区表按增量条件delete掉,再将mid表数据插入到目标表
*/
select public.exec_sql_on_remote_master
('delete from report.taltbltabl
  where START_TIME >= ''$begin'' AND start_time < ''$end''';
  insert into report.taltbltabl
  select * from w_r_diff.taltbltabl_mid',
'mdp',
'111.222.333.444',
'5432'
);

/*步骤3:对目标表做analyse
*/
select public.exec_sql_on_remote_master
('analyse report.taltbltabl',
'mdp',
'111.222.333.444',
'5432'
);

/*四:非分区表增量同步,从写集群到读集群*/
/*步骤1:读集群将目标分区表按增量条件delete掉
*/
select public.exec_sql_on_remote_master
('delete from report.taltbltabl
  where START_TIME >= ''$begin'' AND start_time < ''$end''',
'mdp',
'111.222.333.444',
'5432'
);

/*步骤2:增量同步,注意:非分区表增量,不带truncate:参数4设置成false
*/
select public.copy_table_between_cluster(
'report.taltbltabl',
'mdp',
'report.taltbltabl',
'111.222.333.444',
'5432',
'START_TIME >= ''$begin'' AND start_time < ''$end''',
'false' );

/*步骤3:对目标表做analyse
*/
select public.exec_sql_on_remote_master
('analyse report.taltbltabl',
'mdp',
'111.222.333.444',
'5432'
);

postgresql和greenplum中的递归操作

准备试验数据

create table report.test_hlq_190514(id varchar(3) , pid varchar(3) , name varchar(10)); 

insert into report.test_hlq_190514 values('002' , 0 , '浙江省'); 
insert into report.test_hlq_190514 values('001' , 0 , '广东省'); 
insert into report.test_hlq_190514 values('003' , '002' , '衢州市');  
insert into report.test_hlq_190514 values('004' , '002' , '杭州市') ; 
insert into report.test_hlq_190514 values('005' , '002' , '湖州市');  
insert into report.test_hlq_190514 values('006' , '002' , '嘉兴市') ; 
insert into report.test_hlq_190514 values('007' , '002' , '宁波市');  
insert into report.test_hlq_190514 values('008' , '002' , '绍兴市') ; 
insert into report.test_hlq_190514 values('009' , '002' , '台州市');  
insert into report.test_hlq_190514 values('010' , '002' , '温州市') ; 
insert into report.test_hlq_190514 values('011' , '002' , '丽水市');  
insert into report.test_hlq_190514 values('012' , '002' , '金华市') ; 
insert into report.test_hlq_190514 values('013' , '002' , '舟山市');  
insert into report.test_hlq_190514 values('014' , '004' , '上城区') ; 
insert into report.test_hlq_190514 values('015' , '004' , '下城区');  
insert into report.test_hlq_190514 values('016' , '004' , '拱墅区') ; 
insert into report.test_hlq_190514 values('017' , '004' , '余杭区') ; 
insert into report.test_hlq_190514 values('018' , '011' , '金东区') ; 
insert into report.test_hlq_190514 values('019' , '001' , '广州市') ; 
insert into report.test_hlq_190514 values('020' , '001' , '深圳市') ;

–上面的sql运行之后,表report.test_hlq_190514中的记录如下,

select * from report.test_hlq_190514 order by pid
id,pid,name
"001";"0";"广东省"
"002";"0";"浙江省"
"020";"001";"深圳市"
"019";"001";"广州市"
"004";"002";"杭州市"
"006";"002";"嘉兴市"
"003";"002";"衢州市"
"008";"002";"绍兴市"
"013";"002";"舟山市"
"005";"002";"湖州市"
"009";"002";"台州市"
"012";"002";"金华市"
"011";"002";"丽水市"
"007";"002";"宁波市"
"010";"002";"温州市"
"016";"004";"拱墅区"
"014";"004";"上城区"
"015";"004";"下城区"
"017";"004";"余杭区"
"018";"011";"金东区"
set gp_recursive_cte_prototype =on;

如果是

with RECURSIVE cte as
(
select a.id,cast(a.name as varchar(100)) from report.test_hlq_190514 a 
where id in ('002','001')
union all 
select k.id,cast(c.name||'>'||k.name as varchar(100)) as name  from report.test_hlq_190514 k inner join cte c on c.id = k.pid
)select * from cte order by id

结果如下:

id,name
"001";"广东省"
"002";"浙江省"
"003";"浙江省>衢州市"
"004";"浙江省>杭州市"
"005";"浙江省>湖州市"
"006";"浙江省>嘉兴市"
"007";"浙江省>宁波市"
"008";"浙江省>绍兴市"
"009";"浙江省>台州市"
"010";"浙江省>温州市"
"011";"浙江省>丽水市"
"012";"浙江省>金华市"
"013";"浙江省>舟山市"
"014";"浙江省>杭州市>上城区"
"015";"浙江省>杭州市>下城区"
"016";"浙江省>杭州市>拱墅区"
"017";"浙江省>杭州市>余杭区"
"018";"浙江省>丽水市>金东区"
"019";"广东省>广州市"
"020";"广东省>深圳市"

而其中

select a.id,cast(a.name as varchar(100)) from report.test_hlq_190514 a 
where id in ('002','001')

的结果如下:

id,name
"001";"广东省"
"002";"浙江省"

这就是初始化递归的结果,因为之前cte并没值;
第一次递归便是上面的结果与原表report.test_hlq_190514 的inner join ,得到

"003";"浙江省>衢州市"
"004";"浙江省>杭州市"
"005";"浙江省>湖州市"
"006";"浙江省>嘉兴市"
"007";"浙江省>宁波市"
"008";"浙江省>绍兴市"
"009";"浙江省>台州市"
"010";"浙江省>温州市"
"011";"浙江省>丽水市"
"012";"浙江省>金华市"
"013";"浙江省>舟山市"
"019";"广东省>广州市"
"020";"广东省>深圳市"

第二次递归是上面的结果与report.test_hlq_190514 的inner join ,得到

"014";"浙江省>杭州市>上城区"
"015";"浙江省>杭州市>下城区"
"016";"浙江省>杭州市>拱墅区"
"017";"浙江省>杭州市>余杭区"
"018";"浙江省>丽水市>金东区"

下面的sql只是在上面得到的cte基础上

with RECURSIVE cte as
(
select a.id,cast(a.name as varchar(100)) from report.test_hlq_190514 a 
where id in ('002','001')
union all 
select k.id,cast(c.name||'>'||k.name as varchar(100)) as name  from report.test_hlq_190514 k inner join cte c on c.id = k.pid
)select id,name,split_part(name,'>',1),split_part(name,'>',num+1) ,num from (select id,name,case when length(name)-length(replace(name,'>',''))=0 then 1 else length(name)-length(replace(name,'>','')) end num from cte)  a;
id,name,split_part,split_part,num
"001";"广东省";"广东省";"";1
"019";"广东省>广州市";"广东省";"广州市";1
"020";"广东省>深圳市";"广东省";"深圳市";1
"002";"浙江省";"浙江省";"";1
"013";"浙江省>舟山市";"浙江省";"舟山市";1
"012";"浙江省>金华市";"浙江省";"金华市";1
"011";"浙江省>丽水市";"浙江省";"丽水市";1
"010";"浙江省>温州市";"浙江省";"温州市";1
"008";"浙江省>绍兴市";"浙江省";"绍兴市";1
"009";"浙江省>台州市";"浙江省";"台州市";1
"003";"浙江省>衢州市";"浙江省";"衢州市";1
"004";"浙江省>杭州市";"浙江省";"杭州市";1
"005";"浙江省>湖州市";"浙江省";"湖州市";1
"006";"浙江省>嘉兴市";"浙江省";"嘉兴市";1
"007";"浙江省>宁波市";"浙江省";"宁波市";1
"018";"浙江省>丽水市>金东区";"浙江省";"金东区";2
"017";"浙江省>杭州市>余杭区";"浙江省";"余杭区";2
"016";"浙江省>杭州市>拱墅区";"浙江省";"拱墅区";2
"015";"浙江省>杭州市>下城区";"浙江省";"下城区";2
"014";"浙江省>杭州市>上城区";"浙江省";"上城区";2

你可能感兴趣的:(数据基础)