1、需求说明
GreenPlum数据库支持PL/Java语言扩展,用户可以通过Java方法编写自定义函数来实现特定功能。
2、环境准备
GreenPlum数据库
用户名密码:root以及gpadmin
3、实施步骤
3.1、下载pl/Java的扩展包
网址:Download VMware Greenplum® — VMware Tanzu Network
注意相应的gp以及Linux版本。
3.2、上传并安装扩展包
#安装扩展包 [gpadmin@mdw ~]$ gppkg -i pljava-2.0.4-gp6-rhel7_x86_64.gppkg #重启数据库 [gpadmin@mdw ~]$ gpstop -r
3.3、root用户执行命令
#root账号分别执行这两条命令,每台机器都要执行,注意将jdk的版本修改成机器实际的版本。 [gpadmin@mdw ~]$ echo "$JAVA_HOME/jre/lib/amd64/server" > /etc/ld.so.conf.d/libjdk1.8.0_311.conf [gpadmin@mdw ~]$ ldconfig
3.4、对database安装实例
#demo为实际database [gpadmin@mdw ~]$ psql -d demo -c 'CREATE EXTENSION pljava;'
备注:执行下面这条应该也可以
[gpadmin@mdw ~]$ psql -d demo -f $GPHOME/share/postgresql/pljava/install.sql
3.5、测试使用
3.5.1、项目打包
主要是生成jar包
package com.example.pl;
import com.alibaba.fastjson2.JSON;
import com.alibaba.fastjson2.JSONObject;
import java.util.Map;
public class ShineUtils {
public static String replaceAll(String source, String regex) {
if (source == null || "".equals(source)) {
return source;
}
JSONObject regexJson = JSON.parseObject(regex);
for (Map.Entry<String, Object> entry : regexJson.entrySet()) {
source = source.replaceAll(entry.getKey(), (String) entry.getValue());
}
return source;
}
}
3.5.2、包上传并分发到其他节点
# gpscp类似于Linux中scp功能,seg_hosts是集群节点信息 [gpadmin@mdw ~]$ gpscp -f /home/gpadmin/conf/seg_hosts /usr/local/greenplum/greenplum-db-6.21.1/lib/postgresql/java/pldemo-1.0-jar-with-dependencies.jar =:$GPHOME/lib/postgresql/java/
3.5.3、设置Greenplum pljava_classpath服务器配置参数
[gpadmin@mdw ~]$ gpconfig -c pljava_classpath -v 'pldemo-1.0-jar-with-dependencies.jar'
3.5.4、重新加载配置文件
[gpadmin@mdw ~]$ gpstop -u
3.5.5、进入Greenplum并创建测试表
[gpadmin@mdw ~]$ psql demo psql (9.4.26) Type "help" for help. demo=# create table temp (a varchar) distributed randomly; demo=# insert into temp values ('my string'); demo=# insert into temp values ('my string'); demo=# insert into temp values ('no string'); demo=#
3.5.6、创建自定义函数
demo=# demo=# CREATE function replaceAll(varchar, varchar) RETURNS varchar as 'com.example.pl.ShineUtils.replaceAll' LANGUAGE java; CREATE FUNCTION demo=#
3.5.7、使用函数
原数据以及使用函数后:
demo=# demo=# select a from temp; a ----------- my string my string no string (3 rows) demo=# demo=# select replaceAll(a, '{"my":"you"}') from temp; replaceall ------------ you string you string no string (3 rows) demo=#
3.5.8、函数删除及修改
函数删除:
demo=# demo=# Drop function replaceAll(varchar, varchar); DROP FUNCTION demo=#
函数修改:
demo=# create or replace function replaceAll(varchar, varchar) RETURNS varchar as 'com.example.pl.ShineUtils.replaceAll' LANGUAGE java;