2012/10/23

自分のための「PL/Rを使ってる」(1)

今日の話は、データベースを扱ったことのある人向け。
スプレッドシートデータベースの区別が付かない人や、
データベースDBMSの区別が出来ない人には無理。

自分で言うの何であるが、今回の話、「親切さ」に欠ける。

以前、私が作っている別の技術系のサイトで、海外の方から色々と問い合わせがあった。
問い合わせ内容は、GRASS GIS 環境設定に関するものであったが、
この人物、面白い人で「PL/R 」と「 PL/Python 」というのを使っているとか。

それから、半月ほど、この人物とメールで技術交換をしたのだが、
結果として、むしろ、私の方が色々と刺激を受けたのである。海外の人は実に面白い。
面倒で面白くもない仕事に追われるあまり、時間を割けなかったが、ようやくやる気に。

まぁ、愚痴を言っていても仕方無い。

要するに、これらの機能を使うと、PostgreSQLというDBMS内に、関数が定義できる。
一般的に、ユーザ定義関数UDF:User-Defined Function)と言われるものであろう。
名前は知っていたのであるが、煩雑そうであったので、深くは入りこまなかった。

ところが、最近、このUDFとやらに手を付ける必要が出てきた。っで、やる気に。
本来は、C言語で書くのであるが、RPythonのコードが使えれば、
これまでの資源が無駄にならない...かもしれないし、無駄になるかもしれない。

やってみないと解らない。何せ、この記事を書きながら実験をしているので、
本当に、想像通りに扱えるのか、扱えないのかさえ、今日の記事を書き終えるまで不明。
最後の一行に「ダメだった」っと書く可能性もあるのだが...まぁ、とにかく始める。

ということで、少しずつ、これらの技術を学んでみる。まずは、初期設定から。
完全に素人なので、エレガンスに欠けるが...まぁ、良いことにする。
もう少し、全体像を理解できるようになれば、書きなおそう。

オープンソース系の技術を使うのであれば、やはり、Linuxが使いやすい。
この辺りの話は、「文系のための情報管理」の話で書いておいた。
ということで、MacWindows の動作確認はしない。各自、自力で。

Ubuntu の場合、手を抜いてSynaptic 経由でPL/R をインストールすると、
PL/R を有効化するためのSQLファイルは以下の場所に置かれる。
インストールの方法によっては、contrib の下に置かれる。

'/usr/share/postgresql/9.1/extension/plr.sql'

PL/Rを有効化するためには、このSQLファイルを実行する必要がある。
まずは、実験用のサンプルデータベースを作ってみる。
PostgreSQL にログインする。細かい話は省略。いずれ別のところで。

psql -U postgres -h localhost -W

ログインしたら、とにかく、以下をコピペ。
このサンプルデータは、某国某地域の古墳の前方幅。

CREATE DATABASE dbname;
CREATE TABLE sample(col float);
INSERT INTO sample values(27);
INSERT INTO sample values(19.6);
INSERT INTO sample values(18);
INSERT INTO sample values(15);
INSERT INTO sample values(19);
INSERT INTO sample values(47);
INSERT INTO sample values(24);
INSERT INTO sample values(22);
INSERT INTO sample values(27);
INSERT INTO sample values(14);
INSERT INTO sample values(20);
INSERT INTO sample values(36);
INSERT INTO sample values(23);
INSERT INTO sample values(20);
INSERT INTO sample values(12);
INSERT INTO sample values(24);
INSERT INTO sample values(46);
INSERT INTO sample values(38);
INSERT INTO sample values(27);
INSERT INTO sample values(21);
INSERT INTO sample values(30);
INSERT INTO sample values(24);
INSERT INTO sample values(19.3);
INSERT INTO sample values(25.7);
COMMIT();
\q

データベースが無事に出来上がったら、次に、PL/R の有効化を行う。
Terminal から実行するならば、以下のようになる。
要するに、既存のデータベースを構築してから有効化を行うのがポイント。

psql -U postgres -h localhost -W dbname < "/usr/share/postgresql/9.1/extension/plr.sql"

再び、構築したデータベースにログインし、PL/Rの動作確認。
とりあえず、標準偏差でも計算してみる。ここからが重要。

psql -U postgres -h localhost -W dbname

ログインしたら、次は、関数の定義を行う。ここでは、関数名を「r_sd」としておく。
関数の中身は、AS'〜' LANGUAGE の間に書く。この部分は、Rスクリプトそのもの。
中身のコードは...言わなくても大丈夫であろう。単に、標準偏差を求めているだけ。

CREATE OR REPLACE FUNCTION r_sd(_float8) RETURNS float AS'
  res <- sd(arg1)
  return(res)
' LANGUAGE 'plr';

次に、定義した関数の動作を確認する。定義した関数は、SELECT文で呼び出す。
何か、奇妙な感じがするであるが...まぁ、ここは「えいや!」で...。
なお、col列の値配列で返すためにARRAY() 関数でデータを整形しておく。

SELECT r_sd(ARRAY(SELECT col FROM sample));

以下が、このスクリプトの実行結果。

dbname=# SELECT r_sd(ARRAY(SELECT col FROM sample));
       r_sd      
------------------
 9.01944357035624
(1 row)

よし、上手くいった。どうやら、引数はデータ型のみを指定し
スクリプト内の変数は、引数順に arg1, arg2, ..., argn となるらしい。
色々と解らないことも多いが、とりあえず、この方法で何とかなる。

さてさて、私に残された時間は有限では無い。
動くことが判ったから、今度は、実際の研究で応用してみよう。

0 件のコメント:

コメントを投稿