10.6.2.7 rqGroupEval2関数

関数rqGroupEval2は、Oracle Autonomous Databaseで使用すると、データを1つ以上の列でグループ化し、各グループに対してユーザー定義R関数を実行します。

関数rqGroupEval2は、scr_nameパラメータで指定されたユーザー定義R関数を実行します。inp_namパラメータを使用してユーザー定義R関数にデータを渡し、par_lstパラメータを使用してユーザー定義R関数に引数を渡します。grp_colパラメータを使用して、1つ以上のグループ化列を指定します。out_fmtパラメータを使用して、戻り値の形式を定義します。

構文

rqGroupEval2 (
    INP_NAM VARCHAR2,
    PAR_LST VARCHAR2,
    OUT_FMT VARCHAR2,
    GRP_COL VARCHAR2,
    SCR_NAME VARCHAR2,
    SCR_OWNER VARCHAR2 DEFAULT NULL,
    ENV_NAME  VARCHAR2 DEFAULT NULL
    )

パラメータ

パラメータ 説明

INP_NAM

SCR_NAMEパラメータで指定されたR関数に渡すデータを指定する表またはビューの名前。別のユーザーが所有する表またはビューを使用する場合は、次の形式を使用します:

<owner name>.<table/view name>

指定された表またはビューに対する読取りアクセス権が必要です。

PAR_LST

scr_nameパラメータで指定されたユーザー定義R関数に渡す追加パラメータが含まれるJSON文字列。oreで始まる特殊な制御引数は、scr_nameで指定された関数に渡されるのではなく、関数の呼出し前後の動作を制御します。

たとえば、データ・パラレル処理でR関数を実行するには、次を使用します。

'{"ore_parallel_flag":true}'

関連項目: 特殊な制御引数

OUT_FMT

ファンクションによって返される出力の形式。次のいずれかになります。

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

関連項目: 出力形式

GRP_COL

データのパーティション化に使用するグループ化列の名前。複数の列を区切るには、カンマを使用します。たとえば、GENDERおよびYEARでグループ化する場合:

"GENDER,YEAR"

SCR_NAME

OML4Rスクリプト・リポジトリ内のユーザー定義R関数の名前。

SCR_OWNER

登録済Rスクリプトの所有者。デフォルト値はNULLです。NULLの場合、ユーザーのスクリプト・リポジトリでRスクリプトを検索します。

ENV_NAME

指定されたユーザー定義R関数の実行時に使用されるconda環境の名前。

戻り値

ユーザー定義のrqGroupEval2関数は、OUT_FMTパラメータ値で指定された構造を持つ表を返します。

例10-45 rqGroupEval2関数の使用方法

この例では、rqTableEval2関数(Autonomous Database)で示した例で作成されたIRIS表を使用します。R関数を定義し、groupCountという名前でスクリプト・リポジトリに格納します。

%script
BEGIN
    sys.rqScriptCreate('groupCount',
        'function(dat){
            x <- data.frame(table(dat$Species))
            names(x) <- c("Species", "Count")
            x}',
        FALSE, TRUE); -- V_GLOBAL, V_OVERWRITE
END;
/

出力は、次のようなものです。

PL/SQL procedure successfully completed. 

---------------------------

例10-46 JSON出力

rqGroupEval2関数をコールして、ユーザー定義関数groupCountを実行します。この関数では、INP_NAM引数は、関数に渡すIRIS表内のデータを指定します。PAR_LST引数は、特殊な制御引数ore_input_typeを指定します。OUT_FMT引数で、文字列'JSON'は、返される表にJSON文字列であるCLOBが含まれることを指定します。GRP_COLパラメータは、グループ化する列を指定します。SCR_NAMEパラメータは、groupCountという名前でスクリプト・リポジトリに格納されているユーザー定義R関数を指定します。

%script
set long 500
SELECT * FROM table(rqGroupEval2(
            inp_nam => 'IRIS',
            par_lst => '{"ore_service_level":"MEDIUM", "ore_parallel_flag":true}',
            out_fmt => 'JSON',
            grp_col => 'Species',
            scr_name => 'groupCount'));

出力は、次のようなものです。

NAME VALUE 
[{"Count":50,"Species":"setosa"},{"Count":50,"Species":"versicolor"},{"Count":50,"Species":"virginica"}]

例10-47 XML出力

rqGroupEval2関数をコールして、ユーザー定義関数groupCountを実行します。この関数では、INP_NAM引数は、関数に渡すIRIS表内のデータを指定します。PAR_LST引数は、特殊な制御引数ore_service_levelMEDIUMサービス・レベルを使用することを指定し、特殊な制御引数ore_parallel_flagtrueに設定します。OUT_FMTパラメータは、値をXML形式で返すことを指定します。GRP_COLパラメータでは、グループ化する列を指定します。SCR_NAMEパラメータは、groupCountという名前でスクリプト・リポジトリに格納されているユーザー定義R関数を指定します。

%script
set long 500
SELECT * FROM table(rqGroupEval2(
            inp_nam => 'IRIS',
            par_lst => '{ore_service_level":"MEDIUM", "ore_parallel_flag":true}',
            out_fmt => 'XML',
            grp_col => 'Species',
            scr_name => 'groupCount'));

出力は、次のようなものです。

NAME VALUE
       <root><frame_obj><ROW-frame_obj><Species>setosa</Species><Count>50</Count></ROW-frame_obj><ROW-frame_obj><Species>versicolor</Species><Count>50</Count></ROW-frame_obj><ROW-frame_obj><Species>virginica</Species><Count>50</Count></ROW-frame_obj></frame_obj></root>

例10-48 リレーショナル出力

Select文を実行して、リレーショナル出力を取得します。

%script
SELECT * FROM table(rqGroupEval2(
            inp_nam => 'IRIS',
            par_lst => '{"ore_service_level":"MEDIUM", "ore_parallel_flag":true}',
            out_fmt => '{"Species":"VARCHAR2(10)", "Count":"NUMBER"}',
            grp_col => 'Species',
            scr_name => 'groupCount'));
Species Count 
setosa 50 
versicolor 50 
virginica 50

次のコードでは、SQL問合せを実行して、rqGroupEval2関数コールの結果からすべての列を取得します。これにより、指定したスクリプトおよび環境に基づいてPNG出力が生成されます。

select *
from table(rqGroupEval2(
inp_nam => 'IRIS',
par_lst => '{"ore_graphics_flag":true}',
out_fmt => 'PNG',
grp_col => 'Species',
scr_name => 'test_ggplot2_inp',
scr_owner => NULL,
env_name => 'myrenv'));

出力が次のように表示されます。

NAME ID       VALUE               IMAGE
---------- ---------- -------------------- ------------------------------
GROUP_seto    1        "hello world"         89504E470D0A1A0A0000000D494844
sa                                           52000001E0000001E008060000007D
                                             D4BE950000200049444154789CEDDD
                                             777C14D5FEC6F1676B7A42E8BD480B
                                             C58BB41F57A504040554044150B180
                                             8A624541B1
GROUP_vers     1       "hello world"         89504E470D0A1A0A0000000D494844
icolor                                       52000001E0000001E008060000007D
                                             D4BE950000200049444154789CEDDD
                                             777414E5E2C6F16753482F90D0420B
NAME       ID         VALUE                IMAGE
---------- ---------- -------------------- ------------------------------
                                           3D34E9971F0AA10852548A20551154
                                           C48E342BD7
GROUP_virg  1        "hello world"         89504E470D0A1A0A0000000D494844
inica                                      52000001E0000001E008060000007D
                                           D4BE950000200049444154789CEDDD
                                           777C1475E2C6F1674B7A0112A49720
                                           2D1405293F0EA50404292A45101014
                                           4145ACA020