GREENPLUM使用技巧(一)- 使用外部表实现DBLINK功能
时间:2011-05-12
来源:互联网
很多使用GP的用户都希望GP提供类似ORACLE DBLINK的功能,实现跨数据库的数据查询。其实虽然GP没有直接提供该功能,但是我们可以通过WEB EXTERNAL TABLE实现类似功能,在GP内部进行跨数据库查询。其实现步骤比较简单,下面以ORACLE为例,通过GREENPLUM的外部表直接查询ORACLE中的数据。
1.首先要在MASTER上安装ORACLE客户端
2.修改参数gp_external_enable_exec = on
3.定义一个访问ORACLE数据的SHELL脚本 vi sales.sh
#!/bin/bash
sqlplus -S sh/sh <<EOF
set arraysize 5000;
set linesize 32767;
set pagesize 0;
set heading off;
set feedback off;
alter session set nls_date_format='YYYY-MM-DD';
select '"'||prod_id||'","'||CUST_ID||'","'||TIME_ID||'","'||CHANNEL_ID||'","'||PROMO_ID||'","'||QUANTITY_SOLD||'","'||AMOUNT_SOLD||'"' as text from sales where rownum<10;
set feedback on;
set heading on;
quit;
EOF
exit
chmod 777 sales.sh
4 定义web external table调用sales.sh
CREATE EXTERNAL WEB TABLE ora_sales
(PROD_ID numeric,
CUST_ID numeric ,
TIME_ID DATE ,
CHANNEL_ID numeric ,
PROMO_ID numeric ,
QUANTITY_SOLD numeric(10,2) ,
AMOUNT_SOLD numeric(10,2) )
EXECUTE '/home/oracle/sales.sh'
ON MASTER
FORMAT 'CSV' ;
5 在greenplum中发布SQL,访问oracle中的数据
sales_history=# select * from ora_sales;
prod_id | cust_id | time_id | channel_id | promo_id | quantity_sold | amount_sold
---------+---------+---------------------+------------+----------+---------------+-------------
13 | 987 | 1998-01-10 00:00:00 | 3 | 999 | 1 | 1232.16
13 | 1660 | 1998-01-10 00:00:00 | 3 | 999 | 1 | 1232.16
13 | 1762 | 1998-01-10 00:00:00 | 3 | 999 | 1 | 1232.16
13 | 1843 | 1998-01-10 00:00:00 | 3 | 999 | 1 | 1232.16
13 | 1948 | 1998-01-10 00:00:00 | 3 | 999 | 1 | 1232.16
13 | 2273 | 1998-01-10 00:00:00 | 3 | 999 | 1 | 1232.16
13 | 2380 | 1998-01-10 00:00:00 | 3 | 999 | 1 | 1232.16
13 | 2683 | 1998-01-10 00:00:00 | 3 | 999 | 1 | 1232.16
13 | 2865 | 1998-01-10 00:00:00 | 3 | 999 | 1 | 1232.16
(9 rows)
通过灵活定义shell脚本,还可以通过GP的外部表实现更多更强大的功能
[ 本帖最后由 LEE_CHAO 于 2011-5-12 16:24 编辑 ]
1.首先要在MASTER上安装ORACLE客户端
2.修改参数gp_external_enable_exec = on
3.定义一个访问ORACLE数据的SHELL脚本 vi sales.sh
#!/bin/bash
sqlplus -S sh/sh <<EOF
set arraysize 5000;
set linesize 32767;
set pagesize 0;
set heading off;
set feedback off;
alter session set nls_date_format='YYYY-MM-DD';
select '"'||prod_id||'","'||CUST_ID||'","'||TIME_ID||'","'||CHANNEL_ID||'","'||PROMO_ID||'","'||QUANTITY_SOLD||'","'||AMOUNT_SOLD||'"' as text from sales where rownum<10;
set feedback on;
set heading on;
quit;
EOF
exit
chmod 777 sales.sh
4 定义web external table调用sales.sh
CREATE EXTERNAL WEB TABLE ora_sales
(PROD_ID numeric,
CUST_ID numeric ,
TIME_ID DATE ,
CHANNEL_ID numeric ,
PROMO_ID numeric ,
QUANTITY_SOLD numeric(10,2) ,
AMOUNT_SOLD numeric(10,2) )
EXECUTE '/home/oracle/sales.sh'
ON MASTER
FORMAT 'CSV' ;
5 在greenplum中发布SQL,访问oracle中的数据
sales_history=# select * from ora_sales;
prod_id | cust_id | time_id | channel_id | promo_id | quantity_sold | amount_sold
---------+---------+---------------------+------------+----------+---------------+-------------
13 | 987 | 1998-01-10 00:00:00 | 3 | 999 | 1 | 1232.16
13 | 1660 | 1998-01-10 00:00:00 | 3 | 999 | 1 | 1232.16
13 | 1762 | 1998-01-10 00:00:00 | 3 | 999 | 1 | 1232.16
13 | 1843 | 1998-01-10 00:00:00 | 3 | 999 | 1 | 1232.16
13 | 1948 | 1998-01-10 00:00:00 | 3 | 999 | 1 | 1232.16
13 | 2273 | 1998-01-10 00:00:00 | 3 | 999 | 1 | 1232.16
13 | 2380 | 1998-01-10 00:00:00 | 3 | 999 | 1 | 1232.16
13 | 2683 | 1998-01-10 00:00:00 | 3 | 999 | 1 | 1232.16
13 | 2865 | 1998-01-10 00:00:00 | 3 | 999 | 1 | 1232.16
(9 rows)
通过灵活定义shell脚本,还可以通过GP的外部表实现更多更强大的功能
[ 本帖最后由 LEE_CHAO 于 2011-5-12 16:24 编辑 ]
作者: LEE_CHAO 发布时间: 2011-05-12
dblink固然有他的好处,对于数据仓库来讲,源数据库和目标数据库的数据出和入本来就是一个很大的压力(瓶颈),可考虑跨数据库平台化、通用性更好。不建议采用这种方式,会给源数据库很大压力。
作者: jawen515811 发布时间: 2011-05-26
相关阅读 更多
热门阅读
-
office 2019专业增强版最新2021版激活秘钥/序列号/激活码推荐 附激活工具
阅读:74
-
如何安装mysql8.0
阅读:31
-
Word快速设置标题样式步骤详解
阅读:28
-
20+道必知必会的Vue面试题(附答案解析)
阅读:37
-
HTML如何制作表单
阅读:22
-
百词斩可以改天数吗?当然可以,4个步骤轻松修改天数!
阅读:31
-
ET文件格式和XLS格式文件之间如何转化?
阅读:24
-
react和vue的区别及优缺点是什么
阅读:121
-
支付宝人脸识别如何关闭?
阅读:21
-
腾讯微云怎么修改照片或视频备份路径?
阅读:28