Greenplum自定义外部表协议开发

本文介绍了在Greenplum中开发自定义外部表协议的步骤,包括实现导出、导入函数,以及可选的validator函数。通过自定义协议,可以直接在Greenplum与自己的系统间进行数据导入导出。文章详细讲解了核心代码,如初始化连接、发送数据、关闭连接等操作,并提到了如何根据业务逻辑处理导入完成的判断。
摘要由CSDN通过智能技术生成

概述

我们知道Greenplum支持gpfdist、http等多种形式的外部表协议。但如果gpfdist、http、file等协议都无法满足需求,Greenplum还支持自定义协议的外部表,用户可以自己定义一种协议访问自己的外部数据,且数据格式可以是标准的TEXT或CSV,也可以是自定义的数据格式。

      自定义协议在一些特殊场景下比较有用,例如需要在自己的系统和Greenplum之间直接导入、导出数据。下面简单介绍一下开发一个自定义协议的步骤:

主要步骤

1、按照Greenplum预定义的API格式,实现几个C接口(import、export、validate_urls)。这些接口将被编译成so的导出函数,并最终注册到GP(需要用户自己定义GP函数进行注册,后面会讲到。)

这几个接口的细节稍后再介绍,我们主要是在这些接口中,通过Greenplum提供的API,实现从Greenplum获取数据,或者向Greenplum导入数据。
2、拷贝上述so文件到gp安装目录:greenplum-db/lib/postgresql/,然后定义一系列数据库函数对so中的接口进行封装:
CREATE FUNCTION myread() RETURNS integer
as '$libdir/gpextprotocol.so', 'demoprot_import'
LANGUAGE C STABLE;

CREATE FUNCTION mywrite() RETURNS integer
as '$libdir/gpextprotocol.so', 'demoprot_export'
LANGUAGE C STABLE;

#可选函数
CREATE OR REPLACE FUNCTION myvalidate() RETURNS void
AS '$libdir/gpextprotocol.so', 'demoprot_validate_urls'
LANGUAGE C STABLE;

3、基于上面定义这些数据库函数,定义自定义协议myprot。 其中myvalidatorfunc 是可选的。

CREATE TRUSTED PROTOCOL myprot(
writefunc='mywrite',
readfunc='myread',
validatorfunc='myvalidate');
4. 授权用户使用上述协议
GRANT ALL ON PROTOCOL myprot TO otheruser

5、基于上述协议,创建可读或可写的外部表。

PS:自定义协议的外部表对异常数据处理和标准协议外部表相同。

CREATE WRITABLE EXTERNAL TABLE ext_sales(LIKE sales)
LOCATION ('myprot://<meta>/<meta>/…')
FORMAT 'TEXT';
CREATE READABLE EXTERNAL TABLE ext_sales(LIKE sales)
LOCATION('myprot://<meta>/<meta>/…')
FORMAT 'TEXT';

自定义协议核心代码

导出函数

      实现将数据从Greenplum导出到外部表的过程。

      Greenplum 外部表调用框架代码会根据sql语句,将查询到的数据组织成指定格式(如TEXT或CSV)放到一个buffer中,用户调用API获取该buffer的地址,从中读取数据,并按照自己的业务逻辑将其发送到自定义外部表。

       其处理流程大概如下:

           初始化外部连接->向外部系统发数据->关闭外部系统连接。

       export函数会被GP外部表框架多次调用(取决于数据量的多少),需要我们结合GP提供的API自己判断连接是否初始化(初始化成功后将连接信息保存到自定义数据区)、数据是否发送完成。

初始化连接

      当export函数被调用时,首先调用 EXTPROTOCOL_GET_USER_CTX 获取自定义信息(可用于保存外部表连接的描述信息),如果为NULL,则需要执行初始化连接的动作,并调用 EXTPROTOCOL_SET_USER_CTX 保存上述信息。

发送数据

Datum  
myprot_export(PG_FUNCTION_ARGS) 
{
……
  /* 
评论 4
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值