使用一种自定协议

Greenplum提供了诸如gpfdist、http以及file等协议来通过网络访问数据,或者用户可以创作一个自定义协议。用户可以为自定义协议使用标准的数据格式TEXT和CSV,或者使用一种自定义数据格式。

只要可用的内建协议无法满足一种特定需要,用户就可以创建一种自定义的协议。例如,如果用户需要并行地把Greenplum数据库直接连接到另一个系统,并且在两者之间发送数据流而无需在磁盘上物化系统数据或者使用gpfdist这样的中间进程。用户必须是超级用户才能创建和注册自定义协议。

  1. 用C语言和预定义的API创作发送、接受以及(可选的)验证器函数。这些函数会被编译并且注册在Greenplum数据库中。自定义协议的例子可见自定义数据访问协议实例
  2. 在编写并且编译读写函数到一个共享对象(.so)中之后,声明一个数据库函数指向该.so文件和函数名。

    下面的例子使用了编译好的导入和导出代码。

    1. CREATE FUNCTION myread() RETURNS integer
    2. as '$libdir/gpextprotocol.so', 'myprot_import'
    3. LANGUAGE C STABLE;
    4. CREATE FUNCTION mywrite() RETURNS integer
    5. as '$libdir/gpextprotocol.so', 'myprot_export'
    6. LANGUAGE C STABLE;

    可选函数的格式是:

    1. CREATE OR REPLACE FUNCTION myvalidate() RETURNS void
    2. AS '$libdir/gpextprotocol.so', 'myprot_validate'
    3. LANGUAGE C STABLE;
  3. 创建一个访问这些函数的协议。Validatorfunc是可选的。

    1. CREATE TRUSTED PROTOCOL myprot(
    2. writefunc='mywrite',
    3. readfunc='myread',
    4. validatorfunc='myvalidate');
  4. 必要时,把访问权限授予给任何其他用户。

    1. GRANT ALL ON PROTOCOL myprot TO otheruser;
  5. 在可读或可写外部表中使用该协议。

    1. CREATE WRITABLE EXTERNAL TABLE ext_sales(LIKE sales)
    2. LOCATION ('myprot://<meta>/<meta>/…')
    3. FORMAT 'TEXT';
    4. CREATE READABLE EXTERNAL TABLE ext_sales(LIKE sales)
    5. LOCATION('myprot://<meta>/<meta>/…')
    6. FORMAT 'TEXT';

用SQL命令CREATE TRUSTED PROTOCOL声明自定义协议,然后使用GRANT命令把访问权限授予给用户。例如:

  • 允许一个用户使用一种受信的协议创建一个可读的外部表

    1. GRANT SELECT ON PROTOCOL <protocol name> TO <user name>;
  • 允许一个用户使用一种受信的协议创建一个可写的外部表

    1. GRANT INSERT ON PROTOCOL <protocol name> TO <user name>;
  • 允许一个用户使用一种受信的协议创建一个可读写的外部表

    1. GRANT ALL ON PROTOCOL <protocol name> TO <user name>;

Parent topic: 装载和写入非HDFS自定义数据