GREENPLUM使用技巧(一)- 使用外部表实现DBLINK功能

很多使用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 编辑 ]

作者: LEE_CHAO   发布时间: 2011-05-12

dblink固然有他的好处,对于数据仓库来讲,源数据库和目标数据库的数据出和入本来就是一个很大的压力(瓶颈),可考虑跨数据库平台化、通用性更好。不建议采用这种方式,会给源数据库很大压力。

作者: jawen515811   发布时间: 2011-05-26