rqRowEval
関数は、EXP_NAM
パラメータで指定されているスクリプト内のR関数を実行します。INP_CUR
パラメータを使用して、データをR関数に渡します。PAR_CUR
パラメータを使用して、引数をR関数に渡すことができます。ROW_NUM
パラメータは、R関数の各呼出しに渡す必要のある行数を指定します。最後のチャンクの行数は、指定した数より少なくなる可能性があります。
rqRowEval
関数ではデータ・パラレル実行がサポートされており、1つ以上のRエンジンにより同じR関数(タスク)が個々の独立したデータ・チャンクで実行されます。Oracle Databaseは、データベース・サーバー・マシンで実行されるRエンジン(複数の場合もある)の管理および制御を処理し、自動的にデータをチャンク化して、パラレルで実行されるRエンジンに渡します。Oracle Databaseでは行のすべてのチャンクに対するR関数の実行完了が保証されており、完了しない場合はrqRowEval
関数によってエラーが返されます。
R関数は、データベース内にSQL表として表示されるR data.frame
オブジェクトを返します。OUT_QRY
パラメータを使用して、返される値の形式を定義します。
構文
rqRowEval
(
INP_CUR REF CURSOR IN
PAR_CUR REF CURSOR IN
OUT_QRY VARCHAR2 IN
ROW_NUM NUMBER IN
EXP_NAM VARCHAR2 IN)
パラメータ
表A-1 rqRowEval関数のパラメータ
パラメータ | 説明 |
---|---|
|
|
|
R関数に渡す引数値を含むカーソル。 |
|
次のうちの1つ。
|
|
R関数の各呼出しに含める行数。 |
|
Oracle DatabaseのRスクリプト・リポジトリ内のスクリプトの名前。 |
戻り値
関数rqRowEval
は、OUT_QRY
パラメータ値で指定されている構造を持つ表を返します。
例
例A-8では、C50パッケージを使用し、C5.0ディシジョン・ツリー・モデルを使用してチャーン・データをスコアリングします(つまり、解約傾向が高い顧客を予測します)。この例では、指定された状態からの顧客を並行してスコアリングします。この例では、例6-16の関数ore.rowApply
を呼び出した場合と同じ結果になります。
ヒント:
例A-8では、例6-16で作成したCHURN_TEST表およびmyXLevels
データストアを使用するため、例A-8を実行する前に、例6-16で表を作成する関数、xlevels
オブジェクトを取得する関数、およびそれをmyXLevels
データストアに保存する関数をRで呼び出す必要があります。
例A-8では、例A-6と同様にユーザー定義関数を作成し、その関数をOracle DatabaseのRスクリプト・リポジトリに保存します。このユーザー定義関数は状態のC5.0モデルを作成し、そのモデルをデータストアに保存します。ただし、例A-8のユーザー定義関数myC5.0FunctionForLevels
は、例A-6の関数myC5.0Function
のようにas.factor
関数を使用してレベルを計算するのではなく、例6-16で作成されたレベルのリストを使用します。関数myC5.0FunctionForLevels
は、値TRUE
を返します。
例A-8では、例A-6と同様にPL/SQLパッケージchurnPkg
および関数churnGroupEval
を作成します。例A-6では、文字列myC5.0modelFL
を含むデータストアの名前を取得するためのカーソルを宣言した後、それらのデータストアを削除するPL/SQLブロックを実行します。次に、churnGroupEval
関数を呼び出すSELECT
文を実行します。churnGroupEval
関数はmyC5.0FunctionForLevels
関数を呼び出してC5.0モデルを生成し、それをデータストアに保存します。
例A-8では次に、myScoringFunction
関数を作成し、それをRスクリプト・リポジトリに保存します。この関数は、状態のレベルでC5.0モデルをスコアリングし、結果をdata.frame
で返します。
例A-8では最後に、rqRowEval
関数を呼び出すSELECT
文を実行します。rqRowEval
関数への入力カーソルはPARALLEL
ヒントを使用して、使用する並列度レベルを指定します。カーソルはデータソースとしてCHURN_TEST表を指定し、マサチューセッツの行のみが含まれるように行をフィルタ処理します。処理される行はすべて同じ予測モデルを使用します。
パラメータ・カーソルはore.connect
制御引数を指定して、データベース・サーバー上のOracle R Enterpriseに接続し、myScoringFunction
関数へのdatastorePrefix
引数とxlevelsDatastore
引数の値を指定します。
OUT_QRY
パラメータのSELECT
文は、出力形式を指定します。ROW_NUM
パラメータでは、各パラレルRエンジンで一度に処理する行数として200を指定します。EXP_NAME
パラメータでは、呼び出すR関数としてRスクリプト・リポジトリ内のmyScoringFunction
を指定します。
例A-8 rqRowEval関数の使用方法
BEGIN sys.rqScriptDrop('myC5.0FunctionForLevels'); sys.rqScriptCreate('myC5.0FunctionForLevels', 'function(dat, xlevelsDatastore, datastorePrefix) { library(C50) state <- dat[1,"state"] datastoreName <- paste(datastorePrefix, dat[1, "state"], sep = "_") dat$state <- NULL ore.load(name = xlevelsDatastore) # To get the xlevels object. for (j in names(xlevels)) dat[[j]] <- factor(dat[[j]], levels = xlevels[[j]]) c5mod <- C5.0(churn ~ ., data = dat, rules = TRUE) ore.save(c5mod, name = datastoreName) TRUE }'); END; / CREATE OR REPLACE PACKAGE churnPkg AS TYPE cur IS REF CURSOR RETURN CHURN_TEST%ROWTYPE; END churnPkg; / CREATE OR REPLACE FUNCTION churnGroupEval( inp_cur churnPkg.cur, par_cur SYS_REFCURSOR, out_qry VARCHAR2, grp_col VARCHAR2, exp_txt CLOB) RETURN SYS.AnyDataSet PIPELINED PARALLEL_ENABLE (PARTITION inp_cur BY HASH ("state")) CLUSTER inp_cur BY ("state") USING rqGroupEvalImpl; / DECLARE CURSOR c1 IS SELECT dsname FROM rquser_DataStoreList WHERE dsname like 'myC5.0modelFL%'; BEGIN FOR dsname_st IN c1 LOOP rqDropDataStore(dsname_st.dsname); END LOOP; END; SELECT * FROM table(churnGroupEval( cursor(SELECT * /*+ parallel(t,4) */ FROM CHURN_TEST t), cursor(SELECT 1 AS "ore.connect", 'myXLevels' as "xlevelsDatastore", 'myC5.0modelFL' AS "datastorePrefix" FROM dual), 'XML', 'state', 'myC5.0FunctionForLevels')); BEGIN sys.rqScriptDrop('myScoringFunction'); sys.rqScriptCreate('myScoringFunction', 'function(dat, xlevelsDatastore, datastorePrefix) { library(C50) state <- dat[1, "state"] datastoreName <- paste(datastorePrefix, state, sep = "_") dat$state <- NULL ore.load(name = xlevelsDatastore) # To get the xlevels object. for (j in names(xlevels)) dat[[j]] <- factor(dat[[j]], levels = xlevels[[j]]) ore.load(name = datastoreName) res <- data.frame(pred = predict(c5mod, dat, type = "class"), actual= dat$churn, state = state) res }'); END; / SELECT * FROM table(rqRowEval( cursor(select /*+ parallel(t, 4) */ * FROM CHURN_TEST t WHERE "state" = 'MA'), cursor(SELECT 1 as "ore.connect", 'myC5.0modelFL' as "datastorePrefix", 'myXLevels' as "xlevelsDatastore" FROM dual), 'SELECT ''aaa'' "pred",''aaa'' "actual" , ''aa'' "state" FROM dual', 200, 'myScoringFunction'));
Oracle SQL Developerでの最後のSELECT
文の結果は次のようになります。
pred actual state ---- ------ ----- no no MA no no MA no no MA no no MA no no MA no no MA no no MA no yes MA yes yes MA yes yes MA no no MA no no MA no no MA no no MA no no MA no no MA yes yes MA no no MA no no MA no no MA no no MA no no MA no no MA no no MA no no MA no no MA no no MA no no MA no no MA no no MA no yes MA no no MA no no MA no no MA yes yes MA no no MA no no MA no no MA 38 rows selected