PL/Rの公式サイトに最新版8.13.0.6がUpdate for PostgreSQL 9.5dev compatibilityとあったので、9.5devとともに仮想環境に入れてみました。テスト用ストアド関数による出力です。↓
準備とPostgreSQL 9.5devインストールまで
↓ 使ったもの一覧です。仮想化に、これまでのVMware PlayerからVirtualBoxのポータブル版に変えてみました(最新版4.3.26より前のバージョン。理由はWindows絡みで、今回は関係ないためいずれ別記事で)。PostgreSQLは5月26日時点のソースコード、Rはyum経由なので表では省略。
PostgreSQL 9.5devのインストールは、次の二つにならって簡単にできました。その下の画像はホストOSのWindowsからSSHで接続しているところ。
»PostgreSQL 9.4.0文書:第15章 ソースコードからインストール»Qiita : junsukeさん: postgresインストール(ソースから)
今回、仮想マシンのネットワーク設定はNAT&ポートフォワーディングで、ホスト側のSSHとPostgreSQLへのリクエストを仮想側に転送しています。SSHは特に設定不要でつながった一方、PostgreSQLは、VirtualBoxのホスト機のアドレス10.0.2.2をpg_hba.confへ追加することが必要らしく、気付くまで少し手間取りました。この経過もそのうち別記事にします。
Rインストール
前のブログで書いた(CentOS 6.5にRを入れPostgreSQLへ接続)のと同様、最初にリポジトリ追加が必要でした。下の画像が起動時の様子で、バージョンは3.1.3。
rpm -ivh http://dl.fedoraproject.org/pub/epel/6/x86_64/epel-release-6-8.noarch.rpm
yum -y install R
PL/Rインストール
PostgreSQL 9.3までのPL/Rならyumでインストールできますが、今回はソースコードから。PostgreSQL本体と同様、ドキュメントに手順が整理されており ↓ その通りで済みました。その下が今回実行したコマンドで、postgresql-9.5develというのはスナップショットを解凍したディレクトリ。make installまで無事終わると/usr/local/pgsql/lib/に共有ライブラリplr.soが、同じくpgsql/share/extension/にEXTENSIONインストール用ファイルができています。[追記6月13日]下のコマンドのうちpostgresql-のeが抜けていたのを修正しました
»PL/R User's Guide - Chaper2. Installation
wget https://github.com/jconway/plr/archive/master.zip
unzip master.zip # extracted into plr-master
mv plr-master plr
mv plr/ postgresql-9.5devel/contrib/
cd postgresql-9.5devel/contrib/plr
make
make install
Windowsではこの後に環境変数の設定とPostgreSQLサーバの再起動が必要でしたが、こちらでは不要でそのままCREATE EXTENSION plr;を実行できました。下は結果を確認した様子。
pgAdminでの接続と、テスト
先ほど書いたように今回はVirtualBoxのNATとポートフォワーディングを使い、具体的に言うとホストOSでの5436ポート → ゲストOSの5432という設定です。pgAdminへのサーバ追加はローカルホスト:5436として行い、下が接続した様子。pgAdminはポータブル版1.20で、PostgreSQLの方が新しいので警告ダイアログが出ます(二つ目の画像)。
↓ テスト用にランダムな模様をプロットしてPNGファイルに出力するストアド関数。本体にRのコードをそのまま書きます。出力先の指定(png関数の引数)をファイル名だけにすると、PostgreSQLのデータディレトリ/usr/local/pgsql/data下にPNGができます。コードの下は出力結果の再掲。
CREATE OR REPLACE FUNCTION test.plot()
RETURNS void LANGUAGE plr IMMUTABLE AS
$$
# e.g.
# SELECT test.plot();
lab = paste(collapse='\n', c(
'PostgreSQL 9.5dev',
'and PL/R 8.13.0.6',
'',
'on CentOS 6.6'))
png('Rplots.png')
par(lheight=1.4)
n = 100
plot(
cex=runif(n) * 10,
col=adjustcolor(topo.colors(n), 0.15),
pch=16,
x=runif(n), y=runif(n),
xlim=0:1, ylim=0:1)
text(
cex=2,
font=2,
label=lab,
x=0.5, y=0.5)
graphics.off()
$$;
SELECT test.plot();
実際のテストでは、あらかじめホストOSとの共有フォルダをVirbualBoxで設定し、そこへの書き込み権限をユーザpostgresに与え、共有フォルダへのシンボリックリンクを/usr/local/pgsql/data下に置いて出力先ディレクトリにしました。これで、ゲストOS上でPL/Rストアド関数を実行すると、結果のファイルがホストOS上に出来ます。詳細は、VirtualBoxのネットワーク設定の経過を別記事にする中で書きます。