プライマリ・コンテンツに移動
Oracle® R Enterpriseユーザーズ・ガイド
リリース1.5
E67082-02
目次へ移動
目次
索引へ移動
索引

前
前へ
次
次へ

A.6 rqRowEval関数

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関数のパラメータ

パラメータ 説明

INP_CUR

EXP_NAMEパラメータで指定されているR関数に渡すデータを指定するカーソル。

PAR_CUR

R関数に渡す引数値を含むカーソル。

OUT_QRY

次のうちの1つ。

  • NULL。データ・オブジェクトとイメージ・オブジェクトの両方を含む可能性のあるシリアライズ・オブジェクトを返します。

  • rqEvalにより返された表の列名およびデータ型を指定するSQL SELECT文。イメージ・データは破棄されます。デュアル・ダミー表を使用してプロトタイプ行を指定することも、既存の表またはビューに基づいてSELECT文を作成することもできます。R関数はdata.frameを返す必要があります。

  • 文字列'XML'。返される表にXML文字列であるCLOBが含まれることを指定します。XMLには構造化データとイメージの両方が含まれる可能性があり、最初に構造化Rオブジェクトまたは半構造化Rオブジェクトが返され、次にR関数により生成されたイメージが続きます。イメージはPNG表示のbase 64エンコーディングとして返されます。

  • 文字列'PNG'。返される表に、R関数により生成されたPNG形式のイメージを持つBLOBが含まれることを指定します。

ROW_NUM

R関数の各呼出しに含める行数。

EXP_NAM

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