10 Embedded R Execution

OML4RのEmbedded R Executionを使用すると、データベース環境で実行されるRセッションでユーザー定義R関数(スクリプトとも呼ばれる)を実行できます。

次の各トピックでは、Embedded R Executionについて説明します。

10.1 Embedded R Executionについて

OML4Rでは、Embedded R Executionにより、データベース環境によって動的に生成および管理されるRエンジンでRスクリプトを実行できます。

RスクリプトをOML4Rスクリプト・リポジトリに格納し、Embedded R関数を使用してこのようなスクリプトをコールできます。スクリプトをコールすると、そのスクリプトは、データベース・サーバーで稼働する1つ以上のRエンジンで実行されます。OML4Rには、Autonomous Database上のOracle Database、R、SQLおよびRESTインタフェースでのEmbedded R Execution用のRインタフェースとSQLインタフェースの両方があります。同じRスクリプトから、構造化データ、RオブジェクトおよびイメージのXML表現、さらにはデータベース表のBLOB列を介してPNGイメージを取得できます。

次の各トピックでは、埋込みRの実行について説明します。

10.1.1 埋込みRの実行の利点

Embedded R Executionには次の利点があります。

  • Oracle DatabaseサーバーからローカルのRセッションへデータを移動する必要がありません。

    セキュリティを向上するでなく、Oracle Databaseと内部Rエンジン間のデータベース・データの転送は、別個のクライアントRエンジンよりはるかに高速です。

  • データベース・サーバーを使用して、サーバーで稼働するRエンジンでRスクリプトの実行を開始、管理および制御します。

  • Rエンジンの実行に、データベース・サーバー・マシンのメモリーおよび処理能力を活用することで、より優れたスケーラビリティおよびパフォーマンスを提供します。

  • ユーザー定義R関数のデータ・パラレル実行およびタスク・パラレル実行を可能にします。

  • パラレル・シミュレーション機能が装備されています。

  • データベース環境のデータベース・サーバーで稼働するRスクリプトで、オープン・ソースのCRANパッケージを使用できます。

  • R環境を終了することなく、分析アプリケーション用の包括的なスクリプトを1つのステップで開発および操作できるようにする機能が装備されています。

    探索的分析で使用されるRスクリプトをアプリケーション・タスクに直接統合できます。また、移植を排除し、アプリケーション・コードに対する変更の即時更新を可能にすることにより、本番でRスクリプトをすぐに実行して市場投入までの時間を大幅に短縮することもできます。

  • SQLからRスクリプトを実行することで、Rスクリプトの結果をOracle Analytics Server、Oracle Analytics Cloud、Oracle APEXおよび構造化データ、Rオブジェクトおよびイメージ用のその他のSQL対応のツールと統合できます。

10.1.2 埋込みRの実行用のAPI

Oracle Machine Learning for Rには、Embedded R Execution用のR、SQLおよびRESTインタフェースがあります。

次の表は、Embedded R ExecutionおよびOML4Rスクリプト・リポジトリの管理用のR関数とそれに対応するSQL関数およびプロシージャのリストです。関数fは、OML4Rスクリプト・リポジトリ内のスクリプトで定義されている名前付きR関数またはR関数を表します。

表10-1 Embedded R Execution用のRおよびSQLのAPI

RのAPI SQLのAPI 説明

ore.doEval

rqEval2

データ入力なしでfを実行します。

ore.tableApply

rqTableEval2

fの最初の引数として指定された入力ore.frameのすべての行を渡すことでfを実行します。fの最初の引数をdata.frameとして指定します。

ore.groupApply

rqGroupEval2

この関数は、ユーザーが明示的に定義する必要があります。

グループ化列の値に応じてデータをパーティショニングすることでfを実行します。各データ・パーティションをfの最初の引数にdata.frameとして指定します。データベースのサーバー側Rエンジンのプールで、各fコールのパラレル実行をサポートします。

ore.rowApply

rqRowEval2

指定された入力ore.frameの指定された行数(チャンク)を渡すことでfを実行します。各チャンクをfの最初の引数にdata.frameとして指定します。データベースのサーバー側Rエンジンのプールで、各fコールのパラレル実行をサポートします。

ore.indexApply

該当するものはありません。

データの自動転送なしでfを実行しますが、1からnまで(nは関数を実行する回数)の呼出しの索引を指定します。データベースのサーバー側Rエンジンのプールで、各fコールのパラレル実行をサポートします。

ore.grant rqGrant データストアまたはスクリプトへの読取りアクセス権を付与します。
ore.revoke rqRevoke データストアまたはスクリプトへの読取りアクセス権を取り消します。

ore.scriptCreate

sys.rqScriptCreate

指定されたR関数を、指定された名前でOML4Rスクリプト・リポジトリに追加します。

ore.scriptDrop

sys.rqScriptDrop

指定されたR関数をOML4Rスクリプト・リポジトリから削除します。

ore.scriptList ALL_RQ_SCRIPTS

USER_RQ_SCRIPTS

スクリプトに関する情報をリストします。
ore.scriptLoad 該当するものはありません。 スクリプトのR関数をR環境にロードします。

10.1.3 パラレル実行のサポート

Oracle Machine Learning for RのEmbedded R Execution関数の一部では、データベースでのパラレル実行の使用がサポートされています。

関数ore.groupApplyore.rowApplyrqGroupEval2およびrqRowEval2はデータ・パラレル実行をサポートし、ore.indexApplyはタスク・パラレル実行をサポートします。このパラレル実行機能によって、Oracle Exadataデータベース・マシンなどの高パフォーマンスのコンピューティング・ハードウェアをスクリプトで利用できます。

関数ore.groupApplyore.rowApplyおよびore.indexApplyparallel引数には、Embedded R Executionで使用する並列度を指定します。引数の値には、次のいずれかを指定できます。

  • 特定の並列度では、2以上の正の整数

  • パラレル化しない場合は、FALSEまたは1

  • data引数のデフォルトのパラレル化の場合はTRUE

  • 操作に対するデータベースのデフォルトはNULL

この引数のデフォルト値は、グローバル・オプションore.parallelの値、またはore.parallelが設定されていない場合はFALSEです。

ore.doEvalまたはore.tableApplyを使用して呼び出したユーザー定義のR関数は、並行して実行されません。このような関数は1つのRエンジンで実行されます。

rqGroupEval2関数およびrqRowEval2関数の場合、並列度は入力カーソル引数のPARALLELヒントによって指定します。

ore.groupApply関数およびrqGroupEval2関数のデータ・パラレル実行では、1つ以上のRエンジンが同じR関数(タスク)を別のデータ・パーティションで実行します。この機能によって、たとえば何万または何十万もの予測モデルを顧客に1モデルずつ構築するなどの、多数のモデルの構築が可能です。

ore.rowApply関数およびrqRowEval2関数のデータ・パラレル実行では、1つ以上のRエンジンが同じR関数をデータの非結合チャンクで実行します。この機能によって、大規模なデータセットでのスケーラブルなモデルのスコアリングおよび予測が可能です。

ore.indexApply関数のタスク・パラレル実行では、1つ以上のRエンジンが同じまたは異なる計算(タスク)を実行します。実行の索引に関連付けられている数字が、関数に提供されます。この機能は、シミュレーションの実行などの各種の操作で重要です。

Oracle Databaseは、複合的である可能性のあるRエンジンの管理および制御をデータベース・サーバーで処理し、自動的にパーティショニングしてデータをRエンジンに渡して並行して実行します。すべてのパーティションですべてのR関数の実行が完了することが保証されますが、そうでない場合はOML4Rの関数はエラーを返します。各ユーザー定義の埋込みR関数の実行結果は、ore.listに収集されます。このリストは、ユーザーが結果を要求するまでデータベースに保持されます。

埋込みRの実行では、Comprehensive R Archive Network (CRAN)のオープン・ソースのRパッケージまたは他のサード・パーティのRパッケージの関数を使用する可能性のあるユーザー定義のR関数のデータ・パラレル実行も可能です。ただし、サード・パーティのパッケージは、インデータベース並列性を活用しないため、Rの並列性制約の対象となります。サード・パーティのパッケージは、Embedded R Executionでサポートされているデータ・パラレル実行およびタスク・パラレル実行を利用できます。

10.2 Embedded R Executionをサポートするデータストアおよびスクリプト・リポジトリ・ビュー

OML4Rには、データストアに関する情報と、データストア内のスクリプトおよびユーザー定義関数に関する情報が含まれるデータベース・ビューが多数組み込まれています。これらのビューをEmbedded R Execution APIとともに使用して、データストアおよびそのコンテンツを操作できます。

ビュー 説明
ALL_RQ_DATASTORES

現行のユーザーが使用可能なデータストアを示します。

ALL_RQ_SCRIPTS

現行のユーザーが使用可能な、OML4Rスクリプト・リポジトリ内のスクリプトを示します

RQUSER_DATASTORECONTENTS

Oracle Machine Learning for Rのデータストアの内容に関する情報が格納されます。

RQUSER_DATASTORELIST

Oracle Machine Learning for Rのデータストアに関する情報が格納されます。

USER_RQ_DATASTORE_PRIVS データストア、および現行のユーザーが読取りアクセス権を付与したユーザーを示します。
USER_RQ_DATASTORES 現行のユーザーが作成したデータストアを示します。
USER_RQ_SCRIPT_PRIVS 現行のユーザーが読取りアクセス権を付与したOML4Rスクリプト・リポジトリ内のスクリプトおよびアクセス権が付与されたユーザーを示します。
USER_RQ_SCRIPTS 現行のユーザーが所有している、OML4Rスクリプト・リポジトリ内のスクリプトを示します。

10.2.1 ALL_RQ_DATASTORES

ALL_RQ_DATASTORESは、現行のユーザーが使用可能なデータストアを示します。

データ型 Null 説明
DSOWNER VARCHAR2(256) NOT NULL データストアの所有者。
DSNAME VARCHAR2(128) NOT NULL データストアの名前。
NOBJ NUMBER NOT NULL データストア内のオブジェクトの数。
DSSIZE NUMBER NOT NULL データストアのサイズ。
CDATE DATE NOT NULL データストアの作成日。
DESCRIPTION VARCHAR2(2000) NULL許可 データストアの説明。
GRANTABLE VARCHAR2(1) NOT NULL データストアへの読取りアクセス権を所有者が別のユーザーに付与できるかどうか。

10.2.2 ALL_RQ_SCRIPTS

ALL_RQ_SCRIPTSは、現行のユーザーが使用可能な、OML4Rスクリプト・リポジトリ内のスクリプトを示します。

データ型 Null 説明
OWNER VARCHAR2(256) NOT NULL スクリプトの所有者。
NAME VARCHAR2(128) NOT NULL スクリプトの名前。
SCRIPT CLOB NOT NULL スクリプトのR関数。

10.2.3 RQUSER_DATASTORECONTENTS

RQUSER_DATASTORECONTENTSには、Oracle Machine Learning for Rのデータストアの内容に関する情報が格納されます。

データ型 Null 説明
DSNAME VARCHAR2(128) NOT NULL データストアの名前。
OBJNAME VARCHAR2(128) NOT NULL データストア内のオブジェクトの名前。
CLASS VARCHAR2(128) NOT NULL オブジェクトのRクラス。
DSSIZE NUMBER NOT NULL オブジェクトのサイズ。
LENGTH NUMBER NOT NULL オブジェクトのサイズ。
NROW NUMBER NULL許可 オブジェクト内の行数。
NCOL NUMBER NULL許可 オブジェクト内の列数。

関連トピック

10.2.4 RQUSER_DATASTORELIST

RQUSER_DATASTORELISTには、Oracle Machine Learning for Rのデータストアに関する情報が格納されます。

データ型 Null 説明
DSNAME VARCHAR2(128) NOT NULL データストアの名前。
NOBJ NUMBER NOT NULL データストア内のオブジェクトの数。
DSSIZE NUMBER NOT NULL データストアのサイズ。
CDATE DATE NOT NULL データストアが作成された日付。
DESCRIPTION VARCHAR2(2000) NULL許可 データストアの説明。

10.2.5 USER_RQ_DATASTORE_PRIVS

USER_RQ_DATASTORE_PRIVSは、データストア、および現行のユーザーが読取りアクセス権を付与したユーザーを示します。

データ型 Null 説明
DSNAME VARCHAR2(128) NOT NULL データストアの名前。
GRANTEE VARCHAR2(30) NOT NULL 読取りアクセス権が付与されたユーザー。

10.2.6 USER_RQ_DATASTORES

USER_RQ_DATASTORESは、現行のユーザーが作成したデータストアを示します。

データ型 Null 説明
DSNAME VARCHAR2(128) NOT NULL データストアの名前。
NOBJ NUMBER NOT NULL データストア内のオブジェクトの数。
DSSIZE NUMBER NOT NULL データストアのサイズ。
CDATE DATE NOT NULL データストアの作成日。
DESCRIPTION VARCHAR2(2000) NULL許可 データストアの説明。
GRANTABLE VARCHAR2(1) NOT NULL データストアへの読取りアクセス権を所有者が別のユーザーに付与できるかどうか。

10.2.7 USER_RQ_SCRIPT_PRIVS

USER_RQ_SCRIPT_PRIVSは、現行のユーザーが読取りアクセス権を付与したOML4Rスクリプト・リポジトリ内のスクリプトおよびアクセス権が付与されたユーザーを示します。

データ型 Null 説明
NAME VARCHAR2(128) NOT NULL 読取りアクセス権が付与されたスクリプトの名前。
GRANTEE VARCHAR2(128) NOT NULL 読取りアクセス権が付与されたユーザー。

関連トピック

10.2.8 USER_RQ_SCRIPTS

USER_RQ_SCRIPTSは、現行のユーザーが所有している、OML4Rスクリプト・リポジトリ内のスクリプトを示します。

データ型 Null 説明
NAME VARCHAR2(128) NOT NULL スクリプトの名前。
SCRIPT CLOB NOT NULL スクリプトのR関数。

10.3 埋込みRの実行用のRインタフェース

Oracle Machine Learning for Rには、Oracle Databaseに埋め込まれている1つ以上のRエンジンで実行されるRスクリプトをコールする関数があります。

他には、R関数の作成およびスクリプトとしてのOML4Rスクリプト・リポジトリへの格納、スクリプトへの読取りアクセス権の付与または取消し、使用可能なスクリプトのリスト、R環境へのスクリプト関数のロード、またはリポジトリからのスクリプトの削除を行う関数があります。この項では、次の各トピックでこれらの関数について説明します。

10.3.1 スクリプトを実行する関数の引数

Oracle Machine Learning for RのEmbedded R Execution関数であるore.doEvalore.tableApplyore.groupApplyore.rowApplyおよびore.indexApplyには、これらの関数の一部または全部に共通の引数があります。

一部の関数には、その関数に固有の引数もあります。次の各トピックでは、これらの引数について説明します。

10.3.1.1 実行するための入力関数

すべてのEmbedded R Execution関数には、スクリプトの実行時に適用するR関数が必要です。

次の相互に排他的な引数のどちらかを使用して入力関数を指定します。

  • FUN

  • FUN.NAME (およびオプションのFUN.OWNER)

FUN引数は、関数オブジェクトを直接指定された関数としてまたはR変数に割り当てられた関数として使用します。RQADMINロールを持つユーザーのみが、埋込みR関数の呼出し時にFUN引数を使用できます。

FUN.NAME引数は、OML4RのRスクリプト・リポジトリに格納されているスクリプトを指定します。格納されたスクリプトには、スクリプトの実行時に適用する関数が含まれます。すべてのOML4Rユーザーが、埋込みR関数の呼出し時にFUN.NAME引数を使用できます。

オプションの引数FUN.OWNERには、Rスクリプト・リポジトリ内のスクリプトの所有者を指定します。所有者は、スクリプトを作成したユーザーです。この引数は、FUN.NAME引数とともにのみ使用します。FUN.NAMEが、読取りアクセス権を付与されているプライベート・スクリプトである場合は、FUN.OWNNERを使用して、プライベート・スクリプトの所有者を指定してください。

RQSYSスキーマは、パブリック・スクリプトおよび事前定義済のOML4Rスクリプトの所有者です。事前定義済スクリプトのリストは、help("ore.doEval")を実行し、FUN.NAME引数の説明を参照してください。FUN.OWNNERが指定されていないか、NULLである場合、OML4Rによって、現行のセッションのユーザー、RQSYSの順に所有者が検索されます。スクリプトの所有者が現行のユーザーまたはRQSYSでない場合は、エラーが発生します。

ノート:

OREmodelsパッケージのOML4R関数であるore.glmore.lmore.neuralおよびore.randomForestは、Embedded R Executionフレームワークを内部で使用し、Embedded R Execution関数では使用できません。

10.3.1.2 オプションの制御引数

すべてのEmbedded R Execution関数は、指定が可能または不可能なオプションの引数を取ります。

Oracle Machine Learning for Rは、ユーザー定義のオプションの引数を入力関数に渡します。モデルなどの複合Rオブジェクトを含む入力関数に、任意の数のオプションの引数を渡すことができます。

ore.で始まる引数は、特殊な制御引数です。OML4Rはそれらを入力関数に渡しませんが、かわりに、それらを使用して入力関数の実行前後の動作を制御します。次の制御引数がサポートされます。

  • ore.connectは、Embedded R Execution関数内でOML4Rに自動的に接続するかどうかを制御します。これは、クライアント・セッションと同じ資格証明を指定してore.connectをコールすることと同等です。デフォルト値はFALSEです。

    自動接続を有効にすると、次の機能を実現できます。

    • 埋込みRスクリプトがデータベースに接続されます。

    • 接続は、埋込みR SQL関数をコールするセッションと同じ資格証明を持っています。

    • このスクリプトは自律型トランザクション内で実行されます。

    • ROracle問合せは自動接続と連携できます。

    • OML4Rの透過層の機能が埋込みスクリプトで使用可能になります。

  • ore.dropは入力データを制御します。オプション値がTRUEの場合、1列のdata.framevectorに変換されます。デフォルト値はTRUEです。

  • ore.envAsEmptyenvは、シリアライズ中にオブジェクト内の参照される環境を空の環境で置き換えるかどうかを制御します。一部のタイプの入力パラメータおよび戻りオブジェクト(listformulaなど)は、データベースに保存される前にシリアライズされます。制御引数の値がTRUEの場合、オブジェクト内の参照される環境は親が.GlobalEnvである空の環境で置き換えられ、参照される元の環境内のオブジェクトはシリアライズされません。これにより、シリアライズされるオブジェクトのサイズを大幅に削減できる場合があります。制御引数の値がFALSEの場合、参照される環境内のすべてのオブジェクトがシリアライズされますが、後からシリアライズ解除してリカバリすることができます。デフォルト値は、グローバル・オプションore.envAsEmptyenvによって決定されます。

  • ore.na.omit入力データの欠損値の処理を制御します。ore.na.omit = TRUEを指定した場合、欠損値を含む行またはベクター要素(ore.drop設定に応じて)が入力データから削除されます。チャンクのすべての行に欠損値がある場合、そのチャンクの入力データは空のdata.frameまたはvectorになります。デフォルト値はFALSEです。

  • ore.graphicsは、グラフィカル・ドライバを起動して画像を検索するかどうかを制御します。デフォルト値はTRUEです。

  • ore.png.*には、ore.graphicsTRUEの場合に、pngグラフィック・ドライバの追加引数を指定します。これらの引数のネーミング規則では、png関数の引数にore.png.接頭辞を追加します。たとえば、ore.png.heightを指定すると、引数heightpng関数に渡されます。設定しない場合は、png関数に標準のデフォルト値が使用されます。

関連項目:

制御引数の詳細は、help(ore.doEval)を呼び出すことで表示されるオンライン・ヘルプを参照してください。

10.3.1.3 戻り値の構造

すべてのEmbedded R Execution関数に適用されるもう1つの引数にFUN.VALUEがあります。

FUN.VALUE引数がNULLの場合、ore.doEval関数およびore.tableApply関数はore.objectクラス・オブジェクトとしてシリアライズRオブジェクトを返し、ore.groupApplyore.indexApplyおよびore.rowApplyの各関数はore.listオブジェクトを返します。ただし、data.frameまたはore.frameFUN.VALUE引数を指定した場合、この関数は、指定したdata.frameオブジェクトまたはore.frameオブジェクトの構造を持つore.frameを返します。

ore.frameの対応する出力列がCLOBまたはBLOBデータベース・データ型を持つように指定するには、FUN.VALUE data.frameの列に属性ora.typeを適用できます。

10.3.1.4 入力データ

ore.doEval関数およびore.indexApply関数は、データベースから自動的にデータを受け取りません。

FUN引数またはFUN.NAME引数で指定された関数を単純に実行します。入力関数で必要なすべてのデータは、その関数内で生成されるか、Oracle Database、その他のデータベースまたはフラット・ファイルなどのデータ・ソースから明示的に取得するかのいずれかです。入力関数は、ore.pull関数またはその他の透過層関数を使用して、ファイルまたは表からデータをロードできます。

ore.tableApplyore.groupApplyおよびore.rowApplyの各関数には、入力データとしてデータベース表が必要です。この表はore.frameで表されます。このデータに、X引数(Embedded R Execution関数の最初の引数)で指定するore.frameオブジェクトを指定します。Embedded R Execution関数は、ore.frameオブジェクトを最初の引数としてユーザー定義の入力関数に渡します。

ノート:

ユーザー定義のR関数に渡されたore.frameオブジェクトによって表されるデータは、Oracle Databaseからデータベース・サーバーのRエンジンにコピーされます。Rメモリーの制限が適用されます。データベース・サーバー・マシンに32GBのRAMがあり、データ表が64GBの場合、Oracle R EnterpriseはデータをRエンジンのメモリーにロードできません。

10.3.1.5 パラレル実行

parallel引数は、入力関数のEmbedded R Executionで使用する並列レベルを指定します。

ore.groupApplyore.indexApplyおよびore.rowApplyの各関数は、parallel引数を取ります。

10.3.1.6 固有の引数

関数ore.groupApplyore.indexApplyおよびore.rowApplyは、それぞれの関数に固有の引数を取ります。

ore.groupApply関数はINDEX引数を取り、これには、入力データの行が入力関数での処理のためにパーティショニングされる列の名前を指定します。

ore.indexApply関数はtimes引数を取り、これには、入力関数を実行する回数を指定します。

ore.rowApply関数はrows引数を取り、これには、入力関数の各呼出しに渡す行の数を指定します。

10.3.2 Rでのスクリプトの管理

Embedded R Execution関数で、OML4Rスクリプト・リポジトリにスクリプトとして格納されているR関数をコールできます。このトピックで説明するR関数を使用すると、スクリプトを作成および管理できます。

Embedded R Execution関数はFUN.NAME引数を取ることができ、これには、OML4Rスクリプト・リポジトリ内のスクリプトの名前を指定します。Rスクリプト・リポジトリ内のスクリプトは、Embedded R Execution用のSQL APIで使用することもできます。

スクリプトを管理するためのR関数は次のとおりです。

  • ore.grant

  • ore.revoke

  • ore.scriptCreate

  • ore.scriptList

  • ore.scriptLoad

  • ore.scriptDrop

これらの関数については、次の各項で説明します。

これらの関数の使用例は、例10-1を参照してください。

スクリプトの追加

OML4Rスクリプト・リポジトリにスクリプトとしてR関数を追加するには、ore.createScript関数を使用します。この関数を呼び出すには、RQADMINロールを持っている必要があります。ore.createScript関数の構文は次のとおりです。

ore.scriptCreate(name, FUN, global, overwrite)

引数について、次に説明します。

引数 説明
name OML4Rスクリプト・リポジトリ内のスクリプトの名前。
fun R関数。
global スクリプトがパブリック(グローバル)であるか、プライベートであるかを示す論理値。FALSE (デフォルト)は、スクリプトがパブリックではなく、所有者または所有者が読取りアクセス権を付与したユーザーにのみ表示されることを示します。TRUEは、スクリプトがパブリックであるため、すべてのユーザーに表示されることを示します。
overwrite スクリプトのR関数を、fun引数で指定した関数に置き換えるかどうかを示す論理値。TRUEは、関数を置き換えることを示します(存在する場合)。FALSE (デフォルト)は、既存の内容を置き換えることができないことを示します。

overwrite = FALSEであるときに、同じ名前のスクリプトがOML4Rスクリプト・リポジトリにすでに存在する場合、エラー条件が発生します。それ以外の場合、ore.scriptCreateNULLを返します。

スクリプトへの読取りアクセス権の付与または取消し

スクリプトの作成者は、ore.grant関数を使用してスクリプトへの読取りアクセス権を付与したり、ore.revoke関数を使用してそのアクセス権を取り消すことができます。これらの関数の構文は次のとおりです。

ore.grant(name, type = "rqscript", user)
ore.revoke(name, type = "rqscript", user)

引数について、次に説明します。

引数 説明
name OML4Rスクリプト・リポジトリ内のスクリプトの名前。
type スクリプトの場合、タイプはrqscriptです。
user 読取りアクセス権を付与する、または取り消すユーザー。

nameおよびtype引数は必須です。引数userを指定しなかった場合、読取りアクセス権がすべてのユーザーに付与されるか、すべてのユーザーから取り消されます。

次のいずれかに該当する場合、エラーが発生します。

  • 指定したスクリプトがOML4Rスクリプト・リポジトリ内にありません。

  • type引数が指定されていません。

  • ユーザーが見つかりません。

  • 読取り権限がすでにユーザーに付与されているか、ユーザーから取り消されています。

  • 指定したスクリプトがパブリックです。

使用可能なスクリプトのリスト

自分が使用できるスクリプトをリストするには、ore.scriptListを使用します。名前、パターンまたはタイプに基づいてスクリプトをリストできます。関数の構文は次のとおりです。

ore.scriptList(name, pattern, type)

引数について、次に説明します。

引数 説明
name OML4Rスクリプト・リポジトリ内のスクリプトの名前。引数patternを指定する場合は使用できません。
pattern 正規表現パターン。パターンと一致するスクリプトがリストされます。引数nameを指定する場合は使用できません。
type スクリプトのタイプとして、次のいずれかを指定できます。
  • user: 現行のユーザーが所有しているスクリプトがリストされます。

  • global: すべてのユーザーに表示されるパブリック・スクリプトがリストされます。

  • grant: 現行のユーザーが他のユーザーに読取りアクセス権を付与したスクリプトがリストされます。

  • granted: 現行のユーザーが別のユーザーによって読取りアクセス権を付与されたスクリプトがリストされます。

  • all: ユーザーのスクリプト、パブリック・スクリプトおよびアクセス権を付与されたスクリプトがすべてリストされます。

ore.scriptList関数は、OML4Rスクリプト・リポジトリ内のスクリプトおよびスクリプト内の関数の名前を含むdata.frameを返します。

R環境へのスクリプトのロード

R環境にスクリプトのR関数をロードするには、ore.scriptLoadを使用し、その構文は次のとおりです。

ore.scriptLoad(name, owner, newname, envir)

引数について、次に説明します。

引数 説明
name OML4Rスクリプト・リポジトリ内のスクリプトの名前。
owner スクリプトの所有者。
newname スクリプトをロードする新しい関数名。
envir スクリプトをロードするR環境。

ore.scriptLoadを呼び出すユーザーにスクリプトへのアクセス権が付与されている場合、スクリプトの所有者を指定すると便利です。

OML4Rスクリプト・リポジトリ内のスクリプトの名前が有効なR関数名でない場合、新しい関数名を指定すると便利です。

次のいずれかに該当する場合、エラーが発生します。

  • スクリプトがOML4Rスクリプト・リポジトリ内にありません。

  • 現行のユーザーにスクリプトへの読取りアクセス権がありません。

  • name引数で指定した関数が有効なR関数名ではありません。

  • newname引数が有効なR関数名ではありません。

スクリプトの削除

OML4Rスクリプト・リポジトリからスクリプトを削除するには、ore.scriptDrop関数を使用します。この関数をコールするには、RQADMINロールが必要です。ore.scriptDrop関数の構文は次のとおりです。

ore.scriptDrop(name, global, silent)

引数について、次に説明します。

引数 説明
name OML4Rスクリプト・リポジトリ内のスクリプトの名前。
global スクリプトがグローバル(パブリック)であるか、プライベートであるかを示す論理値。TRUEは、グローバル・スクリプトを削除することを示します。FALSE (デフォルト)は、現行のユーザーが所有しているスクリプトを削除することを示します。
silent ore.scriptDropでエラー条件が検出された場合にエラー・メッセージを表示するかどうかを示す論理値。TRUEは、エラー・メッセージを表示することを示します。FALSE (デフォルト)は、表示しないことを示します。

次のいずれかに該当する場合、エラー条件が発生します。

  • スクリプトがOML4Rスクリプト・リポジトリ内にありません。

  • global = TRUEの場合に、スクリプトがプライベート・スクリプトです。

  • global = FALSEの場合に、スクリプトがパブリック・スクリプトです。

成功すると、ore.scriptDropNULLを返します。

例10-1 Rスクリプト管理関数の使用方法

# Create a temporary R data.frame proxy object for the iris data.frame. Overwrite the script another script with the same name already exists.
IRIS <- ore.push(iris)

# Create a private R script for the current user.
ore.scriptCreate("myRandomRedDots", function(divisor = 100){
                 id <- 1:10
                 plot(1:100, rnorm(100), pch = 21, bg = "red", cex = 2 )
                 data.frame(id = id, val = id / divisor)
                 }, overwrite=TRUE)

# Create another private R script.
ore.scriptCreate("MYLM",
                 function(data, formula, ...) lm(formula, data, ...), overwrite=TRUE)

# Create a public script, available to any user.
ore.scriptCreate("GLBGLM",
                 function(data, formula, ...) 
                 glm(formula = formula, data = data, ...),
                 global = TRUE,
                 overwrite=TRUE)

# List only my private scripts.
ore.scriptList()                

# List my private scripts and the public scripts. 
ore.scriptList(type = "all")    

# List my private scripts that have the specified pattern.
ore.scriptList(pattern = "MY")  

# Grant read access to a private script to all users.
ore.grant("MYLM", type = "rqscript")

# Grant read access to a private script to a specific user.
ore.grant("myRandomRedDots", user = "OMLUSER",  type = "rqscript")

# List the granted scripts.
ore.scriptList(type = "grant")

# Use the MYLM script in an Embedded R Execution function.
ore.tableApply(IRIS[1:4], FUN.NAME = "MYLM",
               formula = Sepal.Length ~ .)
# Use the GLBGLM script in an Embedded R Execution function.
ore.tableApply(IRIS[1:4], FUN.NAME = "GLBGLM",
               formula = Sepal.Length ~ .)

# Load an R script to an R function object
ore.scriptLoad(name = "MYLM")

# Invoke the function.
MYLM(iris, formula = Sepal.Length ~ .)

# Load another R script to an R function object
ore.scriptLoad(name = "GLBGLM", newname = "MYGLM")

# Invoke the function.
MYGLM(iris, formula = Sepal.Length ~ .)

# Drop some scripts.
ore.scriptDrop("MYLM")
ore.scriptDrop("GLBGLM", global = TRUE)

# List all scripts.
ore.scriptList(type = "all")

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

表10-2 data.frame: 7 x 2

NAME SCRIPT
<chr> <chr>
MYLM function (data, formula, ...) lm(formula, data, ...)
build.lm function (dat) { mod <- lm(Petal.Length ~ Petal.Width + Sepal.Width + Sepal.Length, dat) x <- dat[["Petal.Width"]] y <- dat[["Petal.Length"]] return(mod) }
build.lm.1 function (dat) { regr <- lm(Petal.Length ~ Petal.Width + Sepal.Width + Sepal.Length, dat) x <- dat[["Petal.Width"]] y <- dat[["Petal.Length"]] return(regr) }
buildLM.group function (dat) { mod <- lm(Petal.Length ~ Petal.Width, dat) return(mod) }
buildLM.group.1 function (dat) { mod <- lm(mpg ~ hp + vs, dat) return(mod) }
myRandomRedDots function (divisor = 100) { id <- 1:10 plot(1:100, rnorm(100), pch = 21, bg = "red", cex = 2) data.frame(id = id, val = id/divisor) }
scoreLM.1 function (dat, dsname) { ore.load(dsname) dat$Petal.Length_prediction <- predict(mod, newdata = dat) dat[, c("Petal.Length_prediction", "Petal.Length", "Species")] }

表10-3 data.frame: 20 x 3

OWNER NAME SCRIPT
<chr> <chr> <chr>
RQSYS GLBGLM function (data, formula, ...) glm(formula = formula, data = data, ...)
RQSYS RQ$R.Version function() { v <- as.character(R.Version()) v[v == ""] <- NA_character_ data.frame(name=names(R.Version()), value=unname(v), stringsAsFactors=FALSE) }
RQSYS RQ$getRversion function() { data.frame(Version=as.character(getRversion()), stringsAsFactors=FALSE) }
RQSYS RQ$installed.packages function() { data.frame(installed.packages()[,c(1L,3L,2L),drop=FALSE], stringsAsFactors=FALSE) }
RQSYS RQ$packageVersion function(pkg) { data.frame(Version=as.character(packageVersion(pkg=pkg)), stringsAsFactors=FALSE) }
RQSYS RQG$boxplot function(x, ...) { boxplot(x, ...) invisible(NULL) }
RQSYS RQG$cdplot function(x, ...) { if (NCOL(x) < 2L) stop("script RQG$cdplot requires 2 columns to produce graphic") x[[2L]] <- as.factor(x[[2L]]) cdplot(x[[1L]], x[[2L]], ...) invisible(NULL) }
RQSYS RQG$hist function(x, ...) { if (is.data.frame(x)) x <- x[[1L]] hist(x, ...) invisible(NULL) }
RQSYS RQG$matplot function(x, ...) { matplot(x, ...) invisible(NULL) }
RQSYS RQG$pairs function(x, ...) { if (NCOL(x) < 2L) stop("script RQG$pairs requires at least 2 columns to produce graphic") pairs(x, ...) invisible(NULL) }
RQSYS RQG$plot1d function(x, ...) { if (is.data.frame(x)) x <- x[[1L]] if (is.character(x)) x <- as.factor(x) plot(x, ...) invisible(NULL) }
RQSYS RQG$plot2d function(x, ...) { if (NCOL(x) < 2L) stop("script RQG$plot2d requires 2 columns to produce graphic") x <- x[1:2] if (is.character(x[[1L]])) x[[1L]] <- as.factor(x[[1L]]) if (is.character(x[[2L]])) x[[2L]] <- as.factor(x[[2L]]) plot(x[1:2], ...) invisible(NULL) }
RQSYS RQG$smoothScatter function(x, ...) { if (NCOL(x) < 2L) stop("script RQG$smoothScatter requires 2 columns to produce graphic") x <- x[1:2] if (is.character(x[[1L]])) x[[1L]] <- as.factor(x[[1L]]) if (is.character(x[[2L]])) x[[2L]] <- as.factor(x[[2L]]) smoothScatter(x[1:2], ...) invisible(NULL) }
SHERRY MYLM function (data, formula, ...) lm(formula, data, ...)
SHERRY build.lm function (dat) { mod <- lm(Petal.Length ~ Petal.Width + Sepal.Width + Sepal.Length, dat) x <- dat[["Petal.Width"]] y <- dat[["Petal.Length"]] return(mod) }
SHERRY build.lm.1 function (dat) { regr <- lm(Petal.Length ~ Petal.Width + Sepal.Width + Sepal.Length, dat) x <- dat[["Petal.Width"]] y <- dat[["Petal.Length"]] return(regr) }
SHERRY buildLM.group function (dat) { mod <- lm(Petal.Length ~ Petal.Width, dat) return(mod) }
SHERRY buildLM.group.1 function (dat) { mod <- lm(mpg ~ hp + vs, dat) return(mod) }
SHERRY myRandomRedDots function (divisor = 100) { id <- 1:10 plot(1:100, rnorm(100), pch = 21, bg = "red", cex = 2) data.frame(id = id, val = id/divisor) }
SHERRY scoreLM.1 function (dat, dsname) { ore.load(dsname) dat$Petal.Length_prediction <- predict(mod, newdata = dat) dat[, c("Petal.Length_prediction", "Petal.Length", "Species")]

表10-4 data.frame: 1 x 2

  SCRIPT
<chr> <chr>
MYLM function (data, formula, ...) lm(formula, data, ...)

この例のリスト

R> # Create an ore.frame object from the data.frame for the iris data set.
R> IRIS <- ore.push(iris)
R> 
R> # Create a private R script for the current user.
R> ore.scriptCreate("myRandomRedDots", function(divisor = 100){
+                   id <- 1:10
+                   plot(1:100, rnorm(100), pch = 21, bg = "red", cex = 2 )
+                   data.frame(id = id, val = id / divisor)
+                   })
R> 
R> # Create another private R script.
R> ore.scriptCreate("MYLM",
+                   function(data, formula, ...) lm(formula, data, ...))
R> 
R> # Create a public script, available to any user.
R> ore.scriptCreate("GLBGLM",
+                   function(data, formula, ...) 
+                   glm(formula = formula, data = data, ...),
+                   global = TRUE)
R> 
R> # List only my private scripts.
R> ore.scriptList()
             NAME      SCRIPT
1            MYLM      function (data, formula, ...) \nlm(formula, data, ...)
2 myRandomRedDots      function (divisor = 100) \n{\n    id & lt\n    -1:10\n
                       plot(1:100, rnorm(100), pch = 21, bg = "red", cex = 2)\n
                       data.frame(id = id, val = id/divisor)\n}
R> 
R> # List my private scripts and the public scripts. 
R> ore.scriptList(type = "all")    
   OWNER              NAME    SCRIPT
1  RQSYS            GLBGLM    function (data, formula, ...) \nglm(formula = formula, data = data, ...)
2 OML_USER            MYLM    function (data, formula, ...) \nlm(formula, data, ...)
3 OML_USER myRandomRedDots    function (divisor = 100) \n{\n    id & lt\n    -1:10\n
                              plot(1:100, rnorm(100), pch = 21, bg = "red", cex = 2)\n
                              data.frame(id = id, val = id/divisor)\n}
R> 
R> # List my private scripts that have the specified pattern.
R> ore.scriptList(pattern = "MY")
  NAME  SCRIPT
1 MYLM  function (data, formula, ...) \nlm(formula, data, ...)
R> 
R> # Grant read access to a private script to all users.
R> ore.grant("MYLM", type = "rqscript")
R> 
R> # Grant read access to a private script to a specific user.
R> ore.grant("myRandomRedDots", user = "SCOTT",  type = "rqscript")
R> 
R> # List the granted scripts.
R> ore.scriptList(type = "grant")
             NAME GRANTEE
1            MYLM  PUBLIC
2 myRandomRedDots   SCOTT
R> 
R> # Use the MYLM script in an Embedded R Execution function.
R> ore.tableApply(IRIS[1:4], FUN.NAME = "MYLM",
+                 formula = Sepal.Length ~ .)

Call:
lm(formula = formula, data = data)

Coefficients:
 (Intercept)   Sepal.Width  Petal.Length   Petal.Width  
      1.8560        0.6508        0.7091       -0.5565 
R> 
R> # Use the GLBGLM script in an Embedded R Execution function.
R> ore.tableApply(IRIS[1:4], FUN.NAME = "GLBGLM",
+                formula = Sepal.Length ~ .) 

Call:  glm(formula = formula, data = data)

Coefficients:
 (Intercept)   Sepal.Width  Petal.Length   Petal.Width  
      1.8560        0.6508        0.7091       -0.5565  

Degrees of Freedom: 149 Total (i.e. Null);  146 Residual
Null Deviance:      102.2 
Residual Deviance: 14.45        AIC: 84.64
R> 
R> # Load an R script to an R function object
R> ore.scriptLoad(name="MYLM")
R> 
R> # Invoke the function.
R> MYLM(iris, formula = Sepal.Length ~ .)
R> 
R> # Load another R script to an R function object
R> ore.scriptLoad(name = "GLBGLM", newname = "MYGLM")
R> 
R> # Invoke the function.
R> MYGLM(iris, formula = Sepal.Length ~ .)
R> 
R> # Drop some scripts.
R> ore.scriptDrop("MYLM")
R> ore.scriptDrop("GLBGLM", global = TRUE)
R> 
R> # List all scripts.
R> ore.scriptList(type = "all")
   OWNER               NAME    SCRIPT
  OML_USER  myRandomRedDots    function (divisor = 100) \n{\n    id & lt\n    -1:10\n
                               plot(1:100, rnorm(100), pch = 21, bg = "red", cex = 
                               2)\n data.frame(id = id, val = id/divisor)\n}

関連項目:

10.3.3 ore.doEval関数の使用

ore.doEval関数は、入力関数によって生成されたデータを使用して指定された入力関数を実行します。

ore.frameオブジェクトまたはシリアライズRオブジェクトをore.objectオブジェクトとして返します。

ore.doEval関数の構文は次のとおりです。

ore.doEval(FUN, ..., FUN.VALUE = NULL, FUN.NAME = NULL, FUN.OWNER = NULL)

例10-2 ore.doEval関数の使用方法

この例では、RandomRedDotsによって、1つの引数を取り、2つの列を持つdata.frameオブジェクトを返し、50個のランダム標準値を表示する関数を取得します。次に、ore.doEval関数をコールして、RandomRedDots functionオブジェクトを渡します。イメージがクライアントに表示されますが、これはRandomRedDots関数を実行したデータベース・サーバーのRエンジンによって生成されます。

%r

res <- ore.doEval(FUN.NAME="myRandomRedDots", divisor = 50,
                     FUN.VALUE= data.frame(id = 1, val = 1), ore.graphics=FALSE)
class(res)

結果は次のとおりです。

'ore.frame'

この例のリスト

R> RandomRedDots <- function(divisor = 100){
+   id<- 1:10
+   plot(1:100, rnorm(100), pch = 21, bg = "red", cex = 2 )
+   data.frame(id=id, val=id / divisor)
+ }
R> ore.doEval(RandomRedDots)
   id  val
1   1 0.01
2   2 0.02
3   3 0.03
4   4 0.04
5   5 0.05
6   6 0.06
7   7 0.07
8   8 0.08
9   9 0.09
10 10 0.10

図10-1 ランダムな赤い点の表示

図10-1の説明が続きます
「図10-1ランダムな赤い点の表示」の説明

例10-3 オプションの引数を指定したore.doEval関数の使用方法

doEval関数のオプションの引数として入力関数に引数を指定できます。この例では、RandomRedDots関数のdivisor引数をオーバーライドするオプションの引数を指定してdoEval関数をコールします。

ore.doEval(RandomRedDots, divisor = 50)

この例のリスト

R> ore.doEval(RandomRedDots, divisor = 50)
   id  val
1   1 0.02
2   2 0.04
3   3 0.06
4   4 0.08
5   5 0.10
6   6 0.12
7   7 0.14
8   8 0.16
9   9 0.18
10 10 0.20
# The graph displayed by the plot function is not shown.

例10-4 FUN.NAME引数を指定したore.doEval関数の使用方法

入力関数がOML4Rスクリプト・リポジトリに格納されている場合は、ore.doEval関数をFUN.NAME引数を指定して呼び出すことができます。この例ではまず、myRandomRedDotsという名前のスクリプトがスクリプト・リポジトリに含まれないようにするために、ore.scriptDropをコールします。この例では、例10-2RandomRedDots関数をmyRandomRedDotsという名前でリポジトリに追加します。この例では、ore.doEval関数をコールし、myRandomRedDotsを指定します。結果は変数resに割り当てられます。

RandomRedDots関数の戻り値はdata.frameですが、この例では、ore.doEval関数はore.objectオブジェクトを返します。data.frameオブジェクトを取得するために、ore.pullをコールして結果をクライアントのRセッションにプルします。

ore.scriptDrop("myRandomRedDots")
ore.scriptCreate("myRandomRedDots", RandomRedDots)
res <- ore.doEval(FUN.NAME = "myRandomRedDots", divisor = 50)
class(res)
res.local <- ore.pull(res)
class(res.local)

この例のリスト

R> ore.scriptDrop("myRandomRedDots")
R> ore.scriptCreate("myRandomRedDots", RandomRedDots)
R> res <- ore.doEval(FUN.NAME = "myRandomRedDots", divisor = 50)
R> class(res)
[1] "ore.object"
attr(,"package")
[1] "OREembed"
R> res.local <- ore.pull(res)
R> class(res.local)
[1] "data.frame"

例10-5 FUN.VALUE引数を指定したore.doEval関数の使用方法

doEval関数でore.objectではなくore.frameオブジェクトが返されるようにするには、この例に示すように、引数FUN.VALUEを使用して結果の構造を指定します。

%r

res <- ore.doEval(FUN.NAME="myRandomRedDots", divisor = 50,
                     FUN.VALUE= data.frame(id = 1, val = 1), ore.graphics=FALSE)
class(res)

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

'ore.frame'
例10-5のリスト
R> res.of <- ore.doEval(FUN.NAME="myRandomRedDots", divisor = 50,
+                        FUN.VALUE= data.frame(id = 1, val = 1), ore.graphics=FALSE)
R> class(res.of)
[1] "ore.frame"
attr(,"package")
[1] "OREbase"

例10-6 ore.connect引数を指定したdoEval関数の使用方法

この例では、特殊なオプションの引数ore.connectを使用して埋込みR関数でデータベースに接続することにより、データストアに格納されているオブジェクトを使用できるようにする方法を示します。この例では、RandomRedDots2関数オブジェクト(例10-2RandomRedDots関数と似ているが、RandomRedDots2関数はデータストア名を指定する引数を取る)を作成します。この例では、myVar変数を作成して、datastore_1という名前のデータストアに保存します。次に、doEval関数をコールしてデータストア名を渡し、TRUEに設定したore.connect制御引数を渡します。

%r

RandomRedDots2 <- function(divisor = 100, dsname = "ds-1"){
  id <- 1:10
  plot(1:100, rnorm(100), pch = 21, bg = "red", cex = 2 )
  ore.load(dsname) # Contains the numeric variable myVar.
  data.frame(id = id, val = id / divisor, num = myVar)
}

myVar <- 5
ore.save(myVar, name = "ds-1", overwrite=TRUE)
ore.doEval(RandomRedDots2, dsname="ds-1", ore.connect=TRUE)

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


   id  val num
1   1 0.01   5
2   2 0.02   5
3   3 0.03   5
4   4 0.04   5
5   5 0.05   5
6   6 0.06   5
7   7 0.07   5
8   8 0.08   5
9   9 0.09   5
10 10 0.10   5

この例のリスト

R> RandomRedDots2 <- function(divisor = 100, datastore.name = "myDatastore"){
+   id <- 1:10
+   plot(1:100, rnorm(100), pch = 21, bg = "red", cex = 2 )
+   ore.load(datastore.name) # Contains the numeric variable myVar.
+   data.frame(id = id, val = id / divisor, num = myVar)
+ }

R>myVar <- 5
R>ore.save(myVar, name = "ds-1", overwrite=TRUE)
R> ore.doEval(RandomRedDots2, datastore.name = "datastore_1", ore.connect = TRUE)
   id  val num
1   1 0.01   5
2   2 0.02   5
3   3 0.03   5
4   4 0.04   5
5   5 0.05   5
6   6 0.06   5
7   7 0.07   5
8   8 0.08   5
9   9 0.09   5
10 10 0.10   5
# The graph displayed by the plot function is not shown.

例10-7 ora.type属性の使用方法

この例では、ora.type属性を使用して、FUN.VALUE引数で指定されたdata.frameオブジェクト内の列にデータベース・データ型のCLOBおよびBLOBを指定する方法を示します。

%r

# NOTE FROM SL: I added spaces between each example

eval1 <- ore.doEval

eval2 <-
  ore.doEval(function()
	           data.frame(x = "Hello, world", stringsAsFactors = FALSE))
	           
eval3 <-
  ore.doEval(function()
	           data.frame(x = "Hello, world", stringsAsFactors = FALSE),
	           FUN.VALUE = data.frame(x = character(), stringsAsFactors = FALSE))
	           
out.df <- data.frame(x = character(), y = raw(), stringsAsFactors = FALSE)
attr(out.df$x, "ora.type") <- "clob"
attr(out.df$y, "ora.type") <- "blob"

eval4 <- 
  ore.doEval(function() {
	           res <- data.frame(x = "Hello, world",stringsAsFactors = FALSE)
	           res$y[[1L]] <- charToRaw("Hello, world")
	           res},
	           FUN.VALUE = out.df)
	           
eval1
class(eval1)  # ore.object
eval2
class(eval2)  # ore.object
eval3
class(eval3)  # ore.frame
eval4$x
rawToChar(ore.pull(eval4$y))

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

'function'

表10-5 data.frame: 1 x 1

x
<chr>
Hello, world
'data.frame'

表10-6 data.frame: 1 x 1

x
<chr>
Hello, world
'ore.frame'[1] "Hello, world"'Hello, world'

この例のリスト

R> eval1 <- ore.doEval(function() "Hello, world")
R> eval2 <- 
+    ore.doEval(function()
+               data.frame(x = "Hello, world", stringsAsFactors = FALSE))
R> eval3 <-
+    ore.doEval(function()
+               data.frame(x = "Hello, world", stringsAsFactors = FALSE),
+               FUN.VALUE =
+               data.frame(x = character(), stringsAsFactors = FALSE))
R> out.df <- data.frame(x = character(), y = raw(), stringsAsFactors = FALSE)
R> attr(out.df$x, "ora.type") <- "clob"
R> attr(out.df$y, "ora.type") <- "blob"
R> eval4 <- 
+    ore.doEval(function() {
+               res <- data.frame(x = "Hello, world",stringsAsFactors = FALSE)
+               res$y[[1L]] <- charToRaw("Hello, world")
+               res},
+               FUN.VALUE = out.df)
R> eval1
[1] "Hello, world"
R> class(eval1)
[1] "ore.object"
attr(,"package")
[1] "OREembed"
R> eval2
             x
1 Hello, world
R> class(eval2)
[1] "ore.object"
attr(,"package")
[1] "OREembed"
R> eval3
             x
1 Hello, world
Warning message:
ORE object has no unique key - using random order 
R> class(eval3)
[1] "ore.frame"
attr(,"package")
[1] "OREbase"
R> eval4$x                              
[1] "Hello, world"
Warning message:
ORE object has no unique key - using random order 
R> rawToChar(ore.pull(eval4$y))
[1] "Hello, world"
Warning message:
ORE object has no unique key - using random order 

10.3.4 ore.tableApply関数の使用

ore.tableApply関数は、入力データとしてore.frameを指定してRスクリプトをコールします。

ore.tableApply関数は、ore.frameを最初の引数としてユーザー定義の入力関数に渡します。ore.tableApply関数は、ore.frameオブジェクトまたはシリアライズRオブジェクトをore.objectオブジェクトとして返します。

ore.tableApply関数の構文は次のとおりです。

ore.tableApply(X, FUN, ..., FUN.VALUE = NULL, FUN.NAME = NULL, FUN.OWNER = NULL)

例10-8 ore.tableApply関数の使用方法

この例では、ore.tableApply関数を使用して、irisデータセットに基づいて線形回帰モデルを構築します。linear regression関数はe1071パッケージにあり、クライアントとデータベース・サーバー・マシンの両方のRエンジンにインストールする必要があります。ore.tableApply関数の最初の引数として、ore.push(iris)の呼出しでは一時データベース表およびその表のプロキシであるore.frameが作成されます。2番目の引数は入力関数で、これには引数datがあります。ore.tableApply関数は、ore.frame表プロキシをdat引数として入力関数に渡します。この入力関数は、ore.tableApply関数がore.objectオブジェクトとして返すモデルを作成します。

%r

# Create a user-defined function that builds and returns a model using R's lm() function
build.lm <- function(dat){
  mod <- lm(Petal.Length~Petal.Width+Sepal.Width+Sepal.Length, dat)

  x <- dat[['Petal.Width']]
  y <- dat[['Petal.Length']]
    
  return(mod)
}

# Run the user-defined function on the local iris data.frame

res1 <- build.lm(iris)
res1

# Create a temporary R data.frame proxy object IRIS and run the user-defined function using ore.tableApply. The function name is passed to the FUN argument.

IRIS <- ore.push(iris)

res2 <- ore.tableApply(IRIS, FUN=build.lm)
res2     

# Save the user-defined function to the R script repository with the same name. Run the function stored in the script repository using ore.tableApply.
# The script name is passed to the FUN.NAME argument. Overwrite any script with the same name if it exits.

ore.scriptCreate("build.lm", build.lm, overwrite=TRUE)
ore.scriptList()

res3 <- ore.tableApply(IRIS, FUN.NAME="build.lm")
res3  

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

Call:
lm(formula = Petal.Length ~ Petal.Width + Sepal.Width + Sepal.Length, 
    data = dat)

Coefficients:
 (Intercept)   Petal.Width   Sepal.Width  Sepal.Length  
     -0.2627        1.4468       -0.6460        0.7291  

Call:
lm(formula = Petal.Length ~ Petal.Width + Sepal.Width + Sepal.Length, 
    data = dat)

Coefficients:
 (Intercept)   Petal.Width   Sepal.Width  Sepal.Length  
     -0.2627        1.4468       -0.6460        0.7291  

表10-7 data.frame: 6 x 2

NAME SCRIPT
<chr> <chr>
build.lm function (dat) { mod <- lm(Petal.Length ~ Petal.Width + Sepal.Width + Sepal.Length, dat) x <- dat[["Petal.Width"]] y <- dat[["Petal.Length"]] return(mod) }
build.lm.1 function (dat) { regr <- lm(Petal.Length ~ Petal.Width + Sepal.Width + Sepal.Length, dat) x <- dat[["Petal.Width"]] y <- dat[["Petal.Length"]] return(regr) }
buildLM.group function (dat) { mod <- lm(Petal.Length ~ Petal.Width, dat) return(mod) }
buildLM.group.1 function (dat) { mod <- lm(mpg ~ hp + vs, dat) return(mod) }
myRandomRedDots function (divisor = 100) { id <- 1:10 plot(1:100, rnorm(100), pch = 21, bg = "red", cex = 2) data.frame(id = id, val = id/divisor) }
scoreLM.1 function (dat, dsname) { ore.load(dsname) dat$Petal.Length_prediction <- predict(mod, newdata = dat) dat[, c("Petal.Length_prediction", "Petal.Length", "Species")] }
Call: lm(formula = Petal.Length ~ Petal.Width + Sepal.Width + Sepal.Length, data = dat) Coefficients: (Intercept) Petal.Width Sepal.Width Sepal.Length -0.2627 1.4468 -0.6460 0.7291

この例のリスト

R> nbmod <- ore.tableApply(
+   ore.push(iris),
+   function(dat) {
+     library(e1071)
+     dat$Species <- as.factor(dat$Species)
+     naiveBayes(Species ~ ., dat)
+ })
R> class(nbmod)
[1] "ore.object"
attr(,"package")
[1] "OREembed"
R> nbmod
 
Naive Bayes Classifier for Discrete Predictors
 
Call:
naiveBayes.default(x = X, y = Y, laplace = laplace)
 
A-priori probabilities:
Y
    setosa versicolor  virginica 
 0.3333333  0.3333333  0.3333333 
 
Conditional probabilities:
            Sepal.Length
Y             [,1]      [,2]
  setosa     5.006 0.3524897
  versicolor 5.936 0.5161711
  virginica  6.588 0.6358796
 
            Sepal.Width
Y             [,1]      [,2]
  setosa     3.428 0.3790644
  versicolor 2.770 0.3137983
  virginica  2.974 0.3224966
 
            Petal.Length
Y             [,1]      [,2]
  setosa     1.462 0.1736640
  versicolor 4.260 0.4699110
  virginica  5.552 0.5518947
 
            Petal.Width
Y             [,1]      [,2]
  setosa     0.246 0.1053856
  versicolor 1.326 0.1977527
  virginica  2.026 0.2746501

10.3.5 ore.groupApply関数の使用

ore.groupApply関数は、入力データとしてore.frameを指定してRスクリプトをコールします。

ore.groupApply関数は、ore.frameを最初の引数としてユーザー定義の入力関数に渡します。ore.groupApply関数のINDEX引数は、ore.frameの列の名前を指定しますが、これによってOracle Databaseはユーザー定義のR関数による処理のために行をパーティショニングします。ore.groupApply関数は、1つ以上のRエンジンが同じR関数(タスク)をデータの別のパーティションで実行するデータ・パラレル実行を使用できます。

ore.groupApply関数の構文は次のとおりです。

ore.groupApply(X, INDEX, FUN, ..., FUN.VALUE = NULL, FUN.NAME = NULL, FUN.OWNER = NULL,
               parallel = getOption("ore.parallel", NULL))

ore.groupApply関数は、ore.listオブジェクトまたはore.frameオブジェクトを返します。

ore.groupApply関数の使用例は、次の各項で説明します。

10.3.5.1 単一列へのパーティション化

この例では、ore.groupApply関数を使用して、データを単一列にパーティション化します。

例10-9 ore.groupApply関数の使用方法

Rのlm()関数を使用してモデルを構築して返すユーザー定義関数を作成します。

%r

buildLM.group <- function(dat){
  mod <- lm(Petal.Length~Petal.Width, dat)
  return(mod)
}

# Run the user-defined function on the local iris data.frame

res1 <- buildLM.group(iris)
res1

# Create a temporary R data.frame proxy object IRIS and run the user-defined function using ore.tableApply. The function name is passed to the FUN argument.

IRIS <- ore.push(iris)

# Use ore.groupApply to build one model for each of the three categories in the Species variable as well as specifying the desired number of parallel R engines using the parallel argument.
# We build three models and return them.

res2 <- ore.groupApply(IRIS[,c("Petal.Length","Petal.Width","Species")], 
                      INDEX = IRIS$Species, 
                      buildLM.group,
                      parallel = 3)
res2                      
                                           
# Save the user-defined function to the R script repository with the same name. Run the function stored in the script repository using ore.tableApply.
# The script name is passed to the FUN.NAME argument. Overwrite any script with the same name if it exits.

ore.scriptCreate(name = 'buildLM.group', 
                 FUN  =  buildLM.group,     
                 overwrite = TRUE)


res3 <- ore.groupApply(IRIS[,c("Petal.Length","Petal.Width","Species")], 
                      INDEX = IRIS$Species, 
                      buildLM.group,
                      parallel = 3)
res3

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

Call:
lm(formula = Petal.Length ~ Petal.Width, data = dat)

Coefficients:
(Intercept)  Petal.Width  
      1.084        2.230  
Warning message:
“Parallelism exceeds the DOP limit 2 (reverting to parallel=2)”
$setosa

Call:
lm(formula = Petal.Length ~ Petal.Width, data = dat)

Coefficients:
(Intercept)  Petal.Width  
     1.3276       0.5465  


$versicolor

Call:
lm(formula = Petal.Length ~ Petal.Width, data = dat)

Coefficients:
(Intercept)  Petal.Width  
      1.781        1.869  


$virginica

Call:
lm(formula = Petal.Length ~ Petal.Width, data = dat)

Coefficients:
(Intercept)  Petal.Width  
     4.2407       0.6473  

Warning message:
“Parallelism exceeds the DOP limit 2 (reverting to parallel=2)”
$setosa

Call:
lm(formula = Petal.Length ~ Petal.Width, data = dat)

Coefficients:
(Intercept)  Petal.Width  
     1.3276       0.5465  


$versicolor

Call:
lm(formula = Petal.Length ~ Petal.Width, data = dat)

Coefficients:
(Intercept)  Petal.Width  
      1.781        1.869  


$virginica

Call:
lm(formula = Petal.Length ~ Petal.Width, data = dat)

Coefficients:
(Intercept)  Petal.Width  
     4.2407       0.6473  
10.3.5.2 複数列へのパーティション化

この例では、ore.groupApply関数を使用して、データを複数列にパーティション化します。

ore.groupApply関数は、INDEX引数として1つの列または複数の列を取ります。次の例は、CHURN_TRAINデータセットのデータを使用して、指定したデータのパーティション(voice_mail_plan列およびinternational_plan列)に対するルールを作成するrpartモデルを構築します。この例では、Rのtable関数を使用して各パーティションで予測される行の数を示します。

この例では、指定された名前のスクリプトがOML4Rスクリプト・リポジトリに存在しないようにするために、ore.scriptDrop関数をコールします。その後、ore.scriptCreate関数を使用してmy_rpartFunctionという名前のスクリプトを定義し、それをリポジトリに格納します。格納されたスクリプトでは、OML4Rのデータストア・オブジェクトの命名に使用されるデータ・ソースおよび接頭辞を使用する関数を定義します。関数my_rpartFunctionの各呼出しは、voice_mail_planおよびinternational_plan列の値によって特定されたパーティションのいずれかからデータを受け取ります。ソース・パーティションの列は定数のため、この関数はそれらをNULLに設定します。文字列ベクターをファクタに変換し、流動を予測するためのモデルを構築し、そこに適切に命名されたデータストアを保存します。この関数は、特定のパーティション列値、流動値の分布およびモデル自身を返すためのリストを作成します。

次にrpartライブラリをロードし、データストアの接頭辞を設定し、INDEX引数としてvoice_mail_plan列およびinternational_plan列の値を、スクリプト・リポジトリに格納されているユーザー定義関数を呼び出すためのFUN.NAME引数の値としてmy_rpartFunctionを使用して、ore.groupApplyをコールします。ore.groupApply関数は、オプションの引数を使用してdatastorePrefix変数をユーザー定義の関数に渡します。この関数は、ユーザー定義の関数の実行時に、オプションの引数ore.connectを使用してデータベースに接続します。ore.groupApply関数は、変数resとしてore.listオブジェクトを返します。

この例では、返されるリストの最初のエントリを表示します。次に、ore.load関数をコールして、顧客がボイス・メール・プランと国際プランの両方を持つ場合のモデルをロードします。

例10-10 ore.groupApplyを使用した複数列でのデータのパーティション

%r

MTCARS <- ore.push(mtcars)

# Create a user-defined function that builds and returns a model using R's lm() function.

buildLM.group.1 <- function(dat){
  mod <- lm(mpg ~ hp + vs, dat)
  return(mod)
}

# Run the user-defined function on the local mtcars data.frame

res1 <- buildLM.group.1(mtcars)
res1

# Create a temporary R data.frame proxy object MTCARS and run the user-defined function using ore.groupApply. The function name is passed to the FUN argument.

MTCARS <- ore.push(mtcars)

# Use ore.groupApply to build one model for each of the categories in the cyl and am variables as well as specifying the desired number of parallel R engines using the parallel argument.

res2 <- ore.groupApply(MTCARS, 
                      INDEX = MTCARS[ , c("cyl", "am")],
                      buildLM.group.1,
                      parallel = 2)
res2                      
                                           
# Save the user-defined function to the R script repository with the same name. Run the function stored in the script repository using ore.tableApply.
# The script name is passed to the FUN.NAME argument. Overwrite any script with the same name if it exits.

ore.scriptCreate(name = 'buildLM.group.1', 
                 FUN  =  buildLM.group.1,     
                 overwrite = TRUE)


res3 <- ore.groupApply(MTCARS, 
                      INDEX = MTCARS[, c("cyl", "am")],
                      FUN.NAME="buildLM.group.1",
                      parallel = 2)
res3

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

Call:
lm(formula = mpg ~ hp + vs, data = dat)

Coefficients:
(Intercept)           hp           vs  
   26.96300     -0.05453      2.57622  
$`80`

Call:
lm(formula = mpg ~ hp + vs, data = dat)

Coefficients:
(Intercept)           hp           vs  
   23.23434     -0.04215           NA  


$`41`

Call:
lm(formula = mpg ~ hp + vs, data = dat)

Coefficients:
(Intercept)           hp           vs  
    36.1150      -0.1112       1.2122  


$`61`

Call:
lm(formula = mpg ~ hp + vs, data = dat)

Coefficients:
(Intercept)           hp           vs  
      23.20        -0.02           NA  


$`81`

Call:
lm(formula = mpg ~ hp + vs, data = dat)

Coefficients:
(Intercept)           hp           vs  
   18.77465     -0.01127           NA  


$`60`

Call:
lm(formula = mpg ~ hp + vs, data = dat)

Coefficients:
(Intercept)           hp           vs  
   24.19782     -0.04402           NA  


$`40`

Call:
lm(formula = mpg ~ hp + vs, data = dat)

Coefficients:
(Intercept)           hp           vs  
   28.63089     -0.06769           NA  

$`80`

Call:
lm(formula = mpg ~ hp + vs, data = dat)

Coefficients:
(Intercept)           hp           vs  
   23.23434     -0.04215           NA  


$`41`

Call:
lm(formula = mpg ~ hp + vs, data = dat)

Coefficients:
(Intercept)           hp           vs  
    36.1150      -0.1112       1.2122  


$`61`

Call:
lm(formula = mpg ~ hp + vs, data = dat)

Coefficients:
(Intercept)           hp           vs  
      23.20        -0.02           NA  


$`81`

Call:
lm(formula = mpg ~ hp + vs, data = dat)

Coefficients:
(Intercept)           hp           vs  
   18.77465     -0.01127           NA  


$`60`

Call:
lm(formula = mpg ~ hp + vs, data = dat)

Coefficients:
(Intercept)           hp           vs  
   24.19782     -0.04402           NA  


$`40`

Call:
lm(formula = mpg ~ hp + vs, data = dat)

Coefficients:
(Intercept)           hp           vs  
   28.63089     -0.06769           NA  

この例のリスト

R> library(C50)
R> data(churn)
R> ore.drop("CHURN_TRAIN") 
R> ore.create(churnTrain, "CHURN_TRAIN")
R>  
R> table(CHURN_TRAIN$international_plan, CHURN_TRAIN$voice_mail_plan)
     
        no  yes
  no  2180  830
  yes  231   92
R>
R> options(width = 80)
R> head(CHURN_TRAIN, 3)
  state account_length     area_code international_plan voice_mail_plan
1    KS            128 area_code_415                 no             yes
2    OH            107 area_code_415                 no             yes
3    NJ            137 area_code_415                 no              no
  number_vmail_messages total_day_minutes total_day_calls total_day_charge
1                    25             265.1             110            45.07
2                    26             161.6             123            27.47
3                     0             243.4             114            41.38
  total_eve_minutes total_eve_calls total_eve_charge total_night_minutes
1             197.4              99            16.78               244.7
2             195.5             103            16.62               254.4
3             121.2             110            10.30               162.6
  total_night_calls total_night_charge total_intl_minutes total_intl_calls
1                91              11.01               10.0                3
2               103              11.45               13.7                3
3               104               7.32               12.2                5
  total_intl_charge number_customer_service_calls churn
1              2.70                             1    no
2              3.70                             1    no
3              3.29                             0    no
Warning messages:
1: ORE object has no unique key - using random order
2: ORE object has no unique key - using random order
R> 
R> ore.scriptDrop("my_rpartFunction")
R> ore.scriptCreate("my_rpartFunction",
+   function(dat, datastorePrefix) {
+     library(rpart)
+     vmp <- dat[1, "voice_mail_plan"]
+     ip <- dat[1, "international_plan"]
+     datastoreName <- paste(datastorePrefix, vmp, ip, sep = "_")
+     dat$voice_mail_plan <- NULL
+     dat$international_plan <- NULL
+     dat$state <- as.factor(dat$state)
+     dat$churn <- as.factor(dat$churn)
+     dat$area_code <- as.factor(dat$area_code)
+     mod <- rpart(churn ~ ., data = dat)
+     ore.save(mod, name = datastoreName, overwrite = TRUE)
+     list(voice_mail_plan = vmp,
+         international_plan = ip,
+         churn.table = table(dat$churn),
+         rpart.model = mod)
+   })
R> 
R> library(rpart)
R> datastorePrefix = "my.rpartModel"
R> 
R> res <- ore.groupApply(CHURN_TRAIN,
+       INDEX = CHURN_TRAIN[, c("voice_mail_plan", "international_plan")],
+       FUN.NAME = "my_rpartFunction",
+       datastorePrefix = datastorePrefix,
+       ore.connect = TRUE)
R> res[[1]]
$voice_mail_plan
[1] "no"
 
$international_plan
[1] "no"
 
$churn.table
 
  no  yes 
1878  302 
 
$rpart.model
n= 2180 
 
node), split, n, loss, yval, (yprob)
      * denotes terminal node
 
 1) root 2180 302 no (0.86146789 0.13853211)  
   2) total_day_minutes< 263.55 2040 192 no (0.90588235 0.09411765)  
     4) number_customer_service_calls< 3.5 1876 108 no (0.94243070 0.05756930)  
       8) total_day_minutes< 223.25 1599  44 no (0.97248280 0.02751720) *
       9) total_day_minutes>=223.25 277  64 no (0.76895307 0.23104693)  
        18) total_eve_minutes< 242.35 210  18 no (0.91428571 0.08571429) *
        19) total_eve_minutes>=242.35 67  21 yes (0.31343284 0.68656716)  
          38) total_night_minutes< 174.2 17   4 no (0.76470588 0.23529412) *
          39) total_night_minutes>=174.2 50   8 yes (0.16000000 0.84000000) *
     5) number_customer_service_calls>=3.5 164  80 yes (0.48780488 0.51219512)  
      10) total_day_minutes>=160.2 95  22 no (0.76842105 0.23157895)  
        20) state=AL,AZ,CA,CO,DC,DE,FL,HI,KS,KY,MA,MD,ME,MI,NC,ND,NE,NH,NM,OK,OR,SC,TN,VA,VT,WY 56   2 no (0.96428571 0.03571429) *
        21) state=AK,AR,CT,GA,IA,ID,MN,MO,NJ,NV,NY,OH,RI,TX,UT,WA,WV 39  19 yes (0.48717949 0.51282051)  
          42) total_day_minutes>=182.3 21   5 no (0.76190476 0.23809524) *
          43) total_day_minutes< 182.3 18   3 yes (0.16666667 0.83333333) *
      11) total_day_minutes< 160.2 69   7 yes (0.10144928 0.89855072) *
   3) total_day_minutes>=263.55 140  30 yes (0.21428571 0.78571429)  
     6) total_eve_minutes< 167.3 29   7 no (0.75862069 0.24137931)  
      12) state=AK,AR,AZ,CO,CT,FL,HI,IN,KS,LA,MD,ND,NM,NY,OH,UT,WA,WV 21   0 no (1.00000000 0.00000000) *
      13) state=IA,MA,MN,PA,SD,TX,WI 8   1 yes (0.12500000 0.87500000) *
     7) total_eve_minutes>=167.3 111   8 yes (0.07207207 0.92792793) *
 
R> ore.load(name = paste(datastorePrefix, "yes", "yes", sep = "_"))
[1] "mod"
R> mod
n= 92 
 
node), split, n, loss, yval, (yprob)
      * denotes terminal node
 
1) root 92 36 no (0.60869565 0.39130435)  
  2) total_intl_minutes< 13.1 71 15 no (0.78873239 0.21126761)  
    4) total_intl_calls>=2.5 60  4 no (0.93333333 0.06666667)  
      8) state=AK,AR,AZ,CO,CT,DC,DE,FL,GA,HI,ID,IL,IN,KS,MD,MI,MO,MS,MT,NC,ND,NE,NH,NJ,OH,SC,SD,UT,VA,WA,WV,WY 53  0 no (1.00000000 0.00000000) *
      9) state=ME,NM,VT,WI 7  3 yes (0.42857143 0.57142857) *
    5) total_intl_calls< 2.5 11  0 yes (0.00000000 1.00000000) *
  3) total_intl_minutes>=13.1 21  0 yes (0.00000000 1.00000000) *

10.3.6 ore.rowApply関数の使用

ore.rowApply関数は、入力データとしてore.frameを指定してRスクリプトをコールします。

ore.rowApply関数は、ore.frameを最初の引数としてユーザー定義の入力関数に渡します。ore.rowApply関数に対するrows引数には、ユーザー定義のR関数の呼出しごとに渡す行の数を指定します。最後のチャンクまたは行は、指定した数より少なくなる可能性があります。ore.rowApply関数は、1つ以上のRエンジンが同じR関数(タスク)をデータの別のパーティションで実行するデータ・パラレル実行を使用できます。

ore.rowApply関数の構文は次のとおりです。

ore.rowApply(X, FUN, ..., FUN.VALUE = NULL, FUN.NAME = NULL, rows = 1, 
             FUN.OWNER = NULL, parallel = getOption("ore.parallel", NULL))

ore.rowApply関数は、ore.listオブジェクトまたはore.frameオブジェクトを返します。

例10-11 ore.rowApply関数の使用方法

この例では、事前にCRANからダウンロードしてあるe1071パッケージを使用します。この例では、次の操作を実行しています。

  • パッケージe1071をロードします。

  • irisデータセットをIRIS一時表およびore.frameオブジェクトとしてデータベースにプッシュします。

  • Naive Bayesモデルnbmodを作成します。

  • IRISIRIS_PREDとしてコピーし、予測を含めるためにPRED列をIRIS_PREDに追加します。

  • ore.rowApply関数をコールし、IRIS ore.frameをユーザー定義R関数のデータソースおよびユーザー定義R関数自体として渡します。ユーザー定義の関数は、次のことを実行します。

    • パッケージe1071を、データベース内で稼働するRエンジンまたはエンジンで使用できるようにロードします。

    • ore.frameはファクタを定義しますが、ユーザー定義の関数にロードされたときにファクタが文字列ベクターとして表示されるため、Species列をファクタに変換します。

    • predictメソッドをコールし、データセットに追加された列に予測が含まれているresオブジェクトを返します。

  • モデルをクライアントのRセッションにプルします。

  • IRIS_PREDを引数FUN.VALUEとして渡しますが、この引数にore.rowApply関数が返すオブジェクトの構造を指定します。

  • ユーザー定義関数の呼出しごとに渡す行の数を指定します。

  • resのクラスを表示し、table関数をコールしてSpecies列およびresオブジェクトのPRED列を表示します。

%r

# Create a temporary R data.frame proxy object for the iris data.frame. 
IRIS <- ore.push(iris)

# Build a model using a data.frame
mod <- lm(Petal.Length ~ Petal.Width + Sepal.Width + Sepal.Length, data=iris)

# Save the model to the datastore
ore.save(mod, "mod", name="ds-1", overwrite=TRUE)

# Create a user-defined function that loads a model residing in the datastore and scores the model on new data.
scoreLM.1 <- function(dat, dsname){
  ore.load(dsname)
  dat$Petal.Length_prediction <- predict(mod, newdata = dat)
  dat[,c("Petal.Length_prediction","Petal.Length","Species")]
}

# Save the user-defined scoring function in the R script repository.

ore.scriptCreate(name = 'scoreLM.1', 
                 FUN  = scoreLM.1,     
                 overwrite = TRUE)
                 
# Run the scoring function in the script repository as well as specifying the desired number of parallel R engines using the parallel argument.
# View the first 6 records of the result.
                 
res1 <- ore.rowApply(IRIS, 
                    scoreLM.1,
                    dsname = "ds-1", 
                    rows = 10, 
                    parallel = 2)

head(res1)

# Run the function again, this time


res2 <- ore.rowApply(IRIS, 
                    scoreLM.1,
                    dsname = "ds-1", 
                    rows = 10, 
                    parallel = 2,
                    FUN.VALUE = data.frame(Petal.Length_prediction=numeric(),             
                                           Petal.Length=numeric(),
                                           Species=character()))

class(res2)

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

表10-8 data.frame: 6 x 3

Petal.Length_prediction Petal.Length Species
<dbl> <dbl> <chr>
1 1.484210 1.4 setosa
2 1.661389 1.4 setosa
3 1.386358 1.3 setosa
4 1.378046 1.5 setosa
5 1.346695 1.4 setosa
6 1.733905 1.7 setosa
'ore.frame'

10.3.7 ore.indexApply関数の使用

ore.indexApply関数は、入力関数によって生成されたデータを使用して指定されたユーザー定義の入力関数を実行します。

この関数は、1つ以上のRエンジンが同じまたは異なる計算(タスク)を実行するタスク・パラレル実行をサポートします。ore.indexApply関数に対するtimes引数には、データベース内で入力関数を実行する回数を指定します。必要なすべてのデータは、入力関数内で明示的に生成またはロードされる必要があります。

ore.indexApply関数の構文は次のとおりです。

ore.indexApply(times, FUN, ..., FUN.VALUE = NULL, FUN.NAME = NULL, FUN.OWNER = NULL,
               parallel = getOption("ore.parallel", NULL))

ore.indexApply関数は、ore.listオブジェクトまたはore.frameオブジェクトを返します。

10.3.7.1 ore.indexApply関数の簡単な使用例

この例では、ore.indexApplyをコールし、入力関数を並行して5回実行することを指定します。

例10-12 ore.indexApply関数の使用方法

この例では、結果のクラスであるore.listを表示した後に、結果を表示します。

%r

computeMean <- function(index){
    set.seed(index)
    x <- round(runif(100,2,10),4)
    return(mean(x))
}

ore.indexApply(12, computeMean)

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

$`1`
6.142776
$`2`
5.932833
$`3`
5.872673
$`4`
6.383635
$`5`
6.147493
$`6`
6.251832
$`7`
6.07391
$`8`
5.981312
$`9`
5.927451
$`10`
5.562602
$`11`
5.320832
$`12`
5.837725

この例のリスト

R> res <- ore.indexApply(5,
+       function(index) {
+         paste("IndexApply:", index)
+       },
+       parallel = TRUE)
R> class(res)
[1] "ore.list"
attr(,"package")
[1] "OREembed"
R> res
$`1`
[1] "IndexApply: 1"
 
$`2`
[1] "IndexApply: 2"
 
$`3`
[1] "IndexApply: 3"
 
$`4`
[1] "IndexApply: 4"
 
$`5`
[1] "IndexApply: 5"
10.3.7.2 列並行の使用例

この例では、Rのsummary関数を使用して、irisデータセットの最初の4つの数値列でサマリー統計を並行して計算します。

例10-13 ore.indexApply関数の使用および結果の結合

この例では、計算を最終結果に結合します。ore.indexApply関数の最初の引数は4で、これは、並行してまとめる列の数を指定します。ユーザー定義の入力関数は1つの引数indexを取り、これは、まとめる列を指定する1から4の値です。

この例では、summary関数を指定した列でコールします。summaryの呼出しでは、列のサマリー統計が含まれている単一の行が返されます。この例では、summary呼出しの結果をdata.frameに変換し、そこに列名を追加します。

次に、ore.indexApply関数に対してFUN.VALUE引数を使用して、関数の結果の構造を定義します。結果はその後、その構造とともにore.frameオブジェクトとして返されます。

%r

res <- ore.indexApply(4,
      function(index) {
        ss <- summary(iris[, index])
        attr.names <- attr(ss, "names")
        stats <- data.frame(matrix(ss, 1, length(ss)))
        names(stats) <- attr.names
        stats$col <- names(iris)[index]
        stats
      },
      FUN.VALUE=data.frame(Min. = numeric(0),
        "1st Qu." = numeric(0),
        Median = numeric(0),
        Mean = numeric(0),
        "3rd Qu." = numeric(0),
        Max. = numeric(0),
        Col = character(0)), 
      parallel = TRUE)
res

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

表10-9 data.frame: 4 x 7

Min. X1st.Qu. Median Mean X3rd.Qu. Max. Col
<dbl> <dbl> <dbl> <dbl> <dbl> <dbl> <chr>
4.3 5.1 5.80 5.843333 6.4 7.9 Sepal.Length
2.0 2.8 3.00 3.057333 3.3 4.4 Sepal.Width
1.0 1.6 4.35 3.758000 5.1 6.9 Petal.Length
0.1 0.3 1.30 1.199333 1.8 2.5 Petal.Width

この例のリスト

R> res <- ore.indexApply(4,
+       function(index) {
+         ss <- summary(iris[, index])
+         attr.names <- attr(ss, "names")
+         stats <- data.frame(matrix(ss, 1, length(ss)))
+         names(stats) <- attr.names
+         stats$col <- names(iris)[index]
+         stats
+       },
+       FUN.VALUE=data.frame(Min. = numeric(0),
+         "1st Qu." = numeric(0),
+         Median = numeric(0),
+         Mean = numeric(0),
+         "3rd Qu." = numeric(0),
+         Max. = numeric(0),
+         Col = character(0)),
+       parallel = TRUE)
R> res
  Min. X1st.Qu. Median  Mean X3rd.Qu. Max.          Col
1  2.0      2.8   3.00 3.057      3.3  4.4  Sepal.Width
2  4.3      5.1   5.80 5.843      6.4  7.9 Sepal.Length
3  0.1      0.3   1.30 1.199      1.8  2.5  Petal.Width
4  1.0      1.6   4.35 3.758      5.1  6.9 Petal.Length
Warning message:
ORE object has no unique key - using random order
10.3.7.3 シミュレーションの使用例

ore.indexApply関数をシミュレーションで使用しすることで、Oracle Exadataデータベース・マシンなどの高パフォーマンスのコンピューティング・ハードウェアを利用できます。

例10-14 シミュレーションでのore.indexApply関数の使用

この例では、ランダムな正規分布の複数のサンプルを使用してサマリー統計の分布を比較します。各シミュレーションは、データベースの別個のRエンジンで、データベースで許可された並列度まで並列に実行されます。この例では、サンプル・サイズの変数、乱数値の平均および標準偏差および実行するシミュレーションの数を定義します。この例では、num.simulationsore.indexApply関数の最初の引数として指定します。ore.indexApply関数は、num.simulationsindex引数としてユーザー定義の関数に渡します。この入力関数はその後、各入力関数の呼出しで異なる乱数値のセットが生成されるように、索引に基づいて乱数シードを設定します。

次に、入力関数は、rnorm関数を使用してsample.sizeランダムな標準値を生成します。乱数のベクターでsummary関数をコールし、返される結果としてdata.frameを準備します。ore.indexApply関数には、シミュレーションの結合された結果を構成するore.frameを返すように、FUN.VALUE引数を指定します。res変数は、ore.indexApply関数によって返されるore.frameを取得します。

サンプルの分布を取得するために、この例では、ore.pull関数を使用した結果であるdata.frameboxplot関数をコールし、resから選択した列をクライアントに渡します。

%r

options("ore.warn.order" = FALSE)


sample.size = 1000
mean.val = 100
std.dev.val = 10
num.simulations = 10
 
res <- ore.indexApply(num.simulations,
      function(index, sample.size = 1000, mean = 0, std.dev = 1) {
        set.seed(index)
        x <- rnorm(sample.size, mean, std.dev)
        ss <- summary(x)
        attr.names <- attr(ss, "names")
        stats <- data.frame(matrix(ss, 1, length(ss)))
        names(stats) <- attr.names
        stats$index <- index
        stats
      },
      FUN.VALUE=data.frame(Min. = numeric(0),
        "1st Qu." = numeric(0),
        Median = numeric(0),
        Mean = numeric(0),
        "3rd Qu." = numeric(0),
        Max. = numeric(0),
        Index = numeric(0)),
      parallel = TRUE,
      sample.size = sample.size,
      mean = mean.val, std.dev = std.dev.val)
      

head(res, 3)
tail(res, 3)

boxplot(ore.pull(res[, 1:6]),
  main=sprintf("Boxplot of %d rnorm samples size %d, mean=%d, sd=%d",
               num.simulations, sample.size, mean.val, std.dev.val))

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

表10-10 data.frame: 3 x 7

Min. X1st.Qu. Median Mean X3rd.Qu. Max. 索引
<dbl> <dbl> <dbl> <dbl> <dbl> <dbl> <dbl>
69.91951 93.02627 99.64676 99.88352 106.8843 138.1028 1
72.78184 93.68699 100.50135 100.61999 107.7106 130.0882 2
69.43672 93.15461 100.32338 100.06397 106.7667 135.1930 3

表10-11 data.frame: 3 x 7

Min. X1st.Qu. Median Mean X3rd.Qu. Max. 索引
<dbl> <dbl> <dbl> <dbl> <dbl> <dbl> <dbl>
8 67.18068 92.73174 99.71516 99.58738 106.6340 129.7804 8
9 69.58926 93.51445 100.31074 100.05885 106.6231 127.6253 9
10 69.87836 93.22607 99.96999 100.11375 107.2746 135.4114 10

この例のリスト

R> res <- ore.indexApply(num.simulations,
+       function(index, sample.size = 1000, mean = 0, std.dev = 1) {
+         set.seed(index)
+         x <- rnorm(sample.size, mean, std.dev)
+         ss <- summary(x)
+         attr.names <- attr(ss, "names")
+         stats <- data.frame(matrix(ss, 1, length(ss)))
+         names(stats) <- attr.names
+         stats$index <- index
+         stats
+       },
+       FUN.VALUE=data.frame(Min. = numeric(0),
+         "1st Qu." = numeric(0),
+         Median = numeric(0),
+         Mean = numeric(0),
+         "3rd Qu." = numeric(0),
+         Max. = numeric(0),
+         Index = numeric(0)),
+       parallel = TRUE,
+       sample.size = sample.size,
+       mean = mean.val, std.dev = std.dev.val)
R> options("ore.warn.order" = FALSE)
R> head(res, 3)
   Min. X1st.Qu. Median   Mean X3rd.Qu.  Max. Index
1 67.56    93.11  99.42  99.30    105.8 128.0   847
2 67.73    94.19  99.86 100.10    106.3 130.7   258
3 65.58    93.15  99.78  99.82    106.2 134.3   264
R> tail(res, 3)
   Min. X1st.Qu. Median   Mean X3rd.Qu.  Max. Index
1 65.02    93.44  100.2 100.20    106.9 134.0     5
2 71.60    93.34   99.6  99.66    106.4 131.7     4
3 69.44    93.15  100.3 100.10    106.8 135.2     3
R> boxplot(ore.pull(res[, 1:6]),
+   main=sprintf("Boxplot of %d rnorm samples size %d, mean=%d, sd=%d",
+                num.simulations, sample.size, mean.val, std.dev.val))

10.4 埋込みRの実行用のSQLインタフェース

Oracle Machine Learning for RのEmbedded R Execution用のSQLインタフェースでは、本番データベースのアプリケーションでR関数を実行できます。

SQLインタフェースには、次のアクションのためのプロシージャがあります。

  • OML4Rスクリプト・リポジトリに対するスクリプトの追加および削除

  • 所有者による他のユーザーに対するスクリプトへの読取りアクセス権の付与または取消し

  • 埋込みRセッションでのRスクリプトの実行

  • OML4Rデータストアの削除

データ・ディクショナリ・ビューは、スクリプトおよびデータストアに関する情報を提供します。

このSQLインタフェースについては、次のトピックで説明しています。

10.4.1 Oracle Machine Learning for RのSQL表関数について

OML4Rでは、埋込みRの実行用のRインタフェース関数のほとんどに相当するSQL表関数が提供されています。

SELECT FROM TABLE文を実行し、いずれかの表関数を指定すると、指定されたRスクリプトが呼び出されます。このスクリプトは、Oracle Databaseサーバー上の1つ以上のRエンジンで実行されます。

埋込みRの実行用のSQL表関数は次のとおりです。

  • rqEval2

  • rqGroupEval2

  • rqRowEval2

  • rqTableEval2

表10-1に、Rインタフェース関数およびそれに相当するSQL関数を示します。

rqGroupEval2関数の場合、OML4RはSQLでのグループ適用機能の汎用実装を提供します。入力カーソルの後続を取得する表関数を記述する必要があります。

これらの関数の詳細および使用例は、各関数の参照ページを参照してください。

次の各トピックでは、SQL表関数の一般的な側面について説明します。

10.4.1.1 SQL表関数のパラメータ

SQL表関数の中には、共通のパラメータを持つものもあれば、その関数に固有のパラメータを持つものもあります。

SQL表関数のパラメータは次のとおりです。

表10-12 SQL表関数のパラメータ

パラメータ 説明

INP_NAM

SCR_NAMEパラメータで指定されたR関数に渡すデータを指定する表またはビューの名前。別のユーザーが所有するテーブルまたはビューを使用する場合は、<owner name>.<table/view name>という形式を使用します。指定された表またはビューに対する読取りアクセス権が必要です。

ノート:

この引数は、rqEval2を除くすべてのSQL表関数用です。

PAR_LST

SCR_NAMEパラメータで指定されたユーザー定義R関数に渡す追加パラメータが含まれるJSON文字列。oreで始まる特殊な制御引数は、SCR_NAMEで指定された関数に渡されず、関数の呼出し前後の動作を制御します。たとえば、欠損値が含まれる行を入力表から省略するには、{"ore.na.omit":true}を使用します。

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

OUT_FMT

出力表の定義。この引数の値は、NULLか、SCR_NAMEで指定されたR関数により返されたR data.frameの構造を定義する文字列にすることができます。文字列は、SELECT文、'XML'または'PNG'にできます。

ファンクションによって返される出力の形式。

次のいずれかになります。
  • プロトタイプとして使用する表またはビューの名前。別のユーザーが所有するテーブルまたはビューを使用する場合は、<owner name>.<table/view name>という形式を使用します。指定された表またはビューに対する読取りアクセス権が必要です。
  • ファンクションによって返された表の列名およびデータ型を指定するJSON文字列。イメージ・データは破棄されます。
  • 文字列'XML'。返される表にXML文字列であるCLOBが含まれることを指定します。XMLには構造化データとイメージの両方が含まれる可能性があり、最初に構造化Rオブジェクトまたは半構造化Rオブジェクトが返され、次にR関数により生成されたイメージが続きます。
  • 文字列'PNG'。返される表に、R関数によって生成されたイメージを格納するBLOBが含まれることを指定します。イメージはPNGバイトとして返されます。

関連項目: 出力形式

GRP_COL

rqGroupEval2関数の場合、グループ化列の名前。

ROW_NUM

rqRowEval2関数の場合、R関数の各呼出しに渡す行数。

SCR_NAME

OML4Rスクリプト・リポジトリ内のスクリプトの名前。

SCR_OWNER

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

10.4.1.2 SQL表関数の戻り値

Oracle Machine Learning for RのSQL表関数は、表を返します。

表の構造と内容は、SQL表関数に渡されたR関数の結果と、OUT_FMTパラメータによって決定されます。R関数はdata.frameオブジェクト、他のRオブジェクトおよびグラフィックを返すことができます。R関数の結果を表す表の構造は、次のいずれかのOUT_FMT値によって指定されます。

  • プロトタイプとして使用する表またはビューの名前。別のユーザーが所有するテーブルまたはビューを使用する場合は、<owner name>.<table/view name>という形式を使用します。指定された表またはビューに対する読取りアクセス権が必要です。

  • ファンクションによって返された表の列名およびデータ型を指定するJSON文字列。R関数の結果はdata.frameとなる必要があります。イメージは返されません。

  • 文字列'PNG': PNG形式のグラフ・イメージを含むBLOBを持つ表が返されます。表には、列名nameidおよびimageが含まれます。

  • 文字列'XML'。返される表にXML文字列であるCLOBが含まれることを指定します。XMLには構造化データとイメージの両方が含まれる可能性があり、最初に構造化Rオブジェクトまたは半構造化Rオブジェクトが返され、次にR関数により生成されたイメージが続きます。
10.4.1.3 埋込みRの実行でのOracle Machine Learning for Rへの接続

Embedded R Execution中にOracle Databaseサーバー上のOML4Rへの接続を確立するには、パラメータ・リストに制御引数ore.connectを指定できます。

これを行うと、埋込みR関数を呼び出したユーザーの資格証明を使用して接続が確立されます。また、自動的にOREパッケージがロードされます。オブジェクトをOML4RのRオブジェクト・データストアに保存する場合や、データストアからオブジェクトをロードする場合は、OML4Rへの接続を確立する必要があります。また、これにより、OML4Rの透過層を明示的に使用できます。

関連項目:

他の制御引数の詳細は、「オプションの制御引数」を参照してください

例10-15 Embedded R ExecutionでのOML4Rへの接続

この例では、Embedded R Execution中にOracle DatabaseサーバーのOML4Rへの接続を確立します。

select VALUE from table(rqEval2('{"ore.connect":1}', 'XML', '<script name>'));

10.4.2 SQLでのスクリプトの管理

このトピックでは、Rスクリプトを作成および管理するためのPL/SQLプロシージャとOracle Databaseデータ・ディクショナリ・ビューを紹介します。

Embedded R Execution用のSQL APIの関数は、OML4Rスクリプト・リポジトリに格納されている名前付きのスクリプトを引数として必要とします。PL/SQLプロシージャsys.rqScriptCreateおよびsys.rqScriptDropは、スクリプトを作成および削除します。スクリプトを作成する場合やスクリプト・リポジトリから削除する場合は、RQADMINロールが必要です。

sys.rqScriptCreate関数を使用する場合、スクリプトの名前と、1つのR関数定義を含むR関数スクリプトを指定する必要があります。関数sys.rqScriptCreateおよびsys.rqScriptDropのコールは、BEGIN-END PL/SQLブロックでラップする必要があります。スクリプト・リポジトリには、R関数がキャラクタ・ラージ・オブジェクト(CLOB)として格納されるため、関数定義を一重引用符で囲んで文字列として指定する必要があります。

スクリプトの所有者は、rqGrantプロシージャを使用してスクリプトへの読取りアクセス権を別のユーザーに付与したり、rqRevokeプロシージャを使用して権限を取り消すことができます。別のユーザーによってアクセス権を付与されたスクリプトを使用するには、次のように、スクリプトの名前の前に所有者の名前とピリオドを付加して、所有者を指定する必要があります。

select * from table(rqEval2(NULL, '{"x": 1}', 'owner_name.script_name'));

パブリック・スクリプトやユーザーが所有しているスクリプトには、所有者の接頭辞は必要ありません。

次の各表は、スクリプト・リポジトリ内のスクリプトを管理するためのPL/SQLプロシージャと、スクリプトに関する情報を格納するデータ・ディクショナリ・ビューのリストです。

表10-13 スクリプトを管理するためのPL/SQLプロシージャ

PL/SQLプロシージャ 説明
rqGrant データストアまたはスクリプトへの読取りアクセス権を付与します。
rqRevoke データストアまたはスクリプトへの読取りアクセス権を取り消します。
sys.rqScriptCreate 指定されたR関数を、指定された名前でスクリプト・リポジトリに追加します。
sys.rqScriptDrop 指定されたR関数をスクリプト・リポジトリから削除します。

表10-14 スクリプトのデータ・ディクショナリ・ビュー

データ・ディクショナリ・ビュー 説明
ALL_RQ_SCRIPTS 現行のユーザーが使用可能な、OML4Rスクリプト・リポジトリ内のスクリプトを示します
USER_RQ_SCRIPTS 現行のユーザーが所有している、スクリプト・リポジトリ内のスクリプトを示します。
USER_RQ_SCRIPT_PRIVS 現行のユーザーが読取りアクセス権を付与したスクリプト・リポジトリ内のスクリプトおよびアクセス権が付与されたユーザーを示します。
SYS.RQ_SCRIPTS スクリプト・リポジトリ内のシステム・スクリプトを示します。

例10-16 SQL APIによるスクリプトの作成

この例では、sys.rqScriptCreateプロシージャを使用して、Oracle Machine Learning for Rのスクリプト・リポジトリ内にスクリプトを作成します。

この例では、myRandomRedDots2という名前のユーザー定義関数を作成します。このユーザー定義関数は2つの引数を受け入れ、2つの列を持ち指定の数のランダム標準値を表示するdata.frameオブジェクトを返します。sys.rqScriptCreate関数は、ユーザー定義関数をOML4Rスクリプト・リポジトリに格納します。

-- Create a script named myRandomRedDots2 and add it to the script repository.
-- Specify that the script is private and to overwrite a script with the same name.
BEGIN
  sys.rqScriptCreate('myRandomRedDots2',
    'function(divisor = 100, numDots = 100) {
       id <- 1:10
       plot(1:numDots, rnorm(numDots), pch = 21, bg = "red", cex = 2 )
       data.frame(id = id, val = id / divisor)}',
       v_global => FALSE,
       v_overwrite => TRUE);
END;
/

-- Grant read privilege access to OMLUSER.
BEGIN
  rqGrant('myRandomRedDots2', 'rqscript', 'OMLUSER');
END;
 /

-- View the users granted read access to myRandomRedDots2.
select * from USER_RQ_SCRIPT_PRIVS;

NAME                GRANTEE
----------------    -------
myRandomRedDots       OMLUSER

-- Revoke the read privilege access from OMLUSER.
BEGIN
  rqRevoke('myRandomRedDots2', 'rqscript', 'OMLUSER');
END;
 /

-- Remove the script from the script repository.
BEGIN
  sys.rqScriptDrop('myRandomRedDots2');
 END; 
 /

10.4.3 SQLでのデータストアの管理

Oracle Machine Learning for Rには、SQLでデータストアの基本的な管理を行うためのPL/SQLプロシージャおよびOracle Databaseデータ・ディクショナリ・ビューが用意されています。

次の各表は、これらのプロシージャおよびビューのリストです。

表10-15 データストアを管理するためのPL/SQLプロシージャ

PL/SQLプロシージャ 説明
rqGrant データストアまたはスクリプトへの読取りアクセス権を付与します。
rqRevoke データストアまたはスクリプトへの読取りアクセス権を取り消します。
rqDropDataStore データストアを削除します。

表10-16 データストアのデータ・ディクショナリ・ビュー

ビュー 説明
ALL_RQ_DATASTORES データストアが付与可能かどうかを含め、現行のユーザーが使用可能なデータストアを示します。
RQUSER_DATASTORELIST Oracle Databaseスキーマ内のデータストアを示します。
RQUSER_DATASTORECONTENTS Oracle Databaseスキーマ内のデータストア内のオブジェクトを示します。
USER_RQ_DATASTORE_PRIVS データストア、および現行のユーザーが読取りアクセス権を付与したユーザーを示します。
USER_RQ_DATASTORES データストアが付与可能かどうかを含め、現行のユーザーが所有しているデータストアを示します。

10.5 オンプレミス・データベースでのEmbedded R Execution用のSQL API

OML4RのSQL APIには、OML4R Serverデータベース上の1つ以上の埋込みRセッションでR関数を実行するためのSQL表関数と、OML4Rのデータストアを管理したり、OML4Rスクリプト・リポジトリ内のスクリプトを管理するためのPL/SQLプロシージャが含まれます。

次の各トピックでは、オンプレミス・データベースでのEmbedded R Execution用のこのSQL APIについて説明します。

10.5.1 rqDropDataStoreプロシージャ

rqDropDataStoreプロシージャは、Oracle Databaseスキーマからデータストアを削除します。

構文

rqDropDataStore (
    DS_NAME     VARCHAR2     IN)

パラメータ

パラメータ 説明
DS_NAME 削除するデータストアの名前。

例10-17 データストアの削除

この例では、現行ユーザー・スキーマからデータストアdatastore_1を削除します。

rqDropDataStore('datastore_1')

10.5.2 rqEval関数

rqEval関数は、EXP_NAMパラメータで指定されているスクリプト内のR関数を実行します。

PAR_CURパラメータを使用して、引数をR関数に渡すことができます。

rqEval関数は、データベースからのデータを自動的には受信しません。R関数は、使用するデータを生成するか、Oracle Database、他のデータベース、フラット・ファイルなどのデータソースからデータを明示的に取得します。

R関数は、データベース内にSQL表として表示されるR data.frameオブジェクトを返します。OUT_QRYパラメータを使用して、返される値の形式を定義します。

構文

rqEval (
     PAR_CUR     REF CURSOR     IN
     OUT_QRY     VARCHAR2       IN)
     EXP_NAM     VARCHAR2       IN)

パラメータ

パラメータ 説明

PAR_CUR

EXP_NAMEパラメータで指定されている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が含まれることを指定します。

EXP_NAM

OML4Rスクリプト・リポジトリ内のスクリプトの名前。

戻り値

関数rqEvalは、OUT_QRYパラメータ値で指定されている構造を持つ表を返します。

例10-18 rqEvalの使用

この例では、スクリプトmyRandomRedDots2を作成します。rqEvalの最初のパラメータの値は、関数myRandomRedDots2に引数を渡さないことを指定するNULLです。2番目のパラメータの値は、rqEvalにより返されたdata.frameの列名およびデータ型を記述するSQL文を指定する文字列です。3番目のパラメータの値は、OML4Rスクリプト・リポジトリ内のスクリプトの名前です。

-- Create a script named myRandomRedDots2 and add it to the script repository.
-- Specify that the script is private and to overwrite a script with the same name.
BEGIN
  sys.rqScriptCreate('myRandomRedDots2',
    'function(divisor = 100, numDots = 100) {
       id <- 1:10
       plot(1:numDots, rnorm(numDots), pch = 21, bg = "red", cex = 2 )
       data.frame(id = id, val = id / divisor)}',
       v_global => FALSE,
       v_overwrite => TRUE);
END;
/

SELECT *
  FROM table(rqEval(NULL, 'SELECT 1 id, 1 val FROM dual', 'myRandomRedDots2'));

Oracle SQL DeveloperでのSELECT文の結果は次のようになります。

        ID        VAL
---------- ----------
         1        .01 
         2        .02 
         3        .03 
         4        .04 
         5        .05 
         6        .06 
         7        .07 
         8        .08 
         9        .09 
        10         .1 
 
 10 rows selected 

例10-19 rqEvalにより呼び出されたR関数に引数を渡す

この例では、rqEvalの最初のパラメータとしてカーソルを指定することにより、R関数に引数を渡します。カーソルは、単一行のスカラー値の中に複数の引数を指定します。

SELECT *
  FROM table(rqEval(cursor(SELECT 50 "divisor", 500 "numDots" FROM dual),
    'SELECT 1 id, 1 val FROM dual',
    'myRandomRedDots2'));

Oracle SQL DeveloperでのSELECT文の結果は次のようになります。

        ID        VAL
---------- ----------
         1        .02 
         2        .04 
         3        .06 
         4        .08 
         5         .1 
         6        .12 
         7        .14 
         8        .16 
         9        .18 
        10         .2 
 
 10 rows selected 

例10-20 出力表定義としてのPNGの指定

この例では、PNG_Exampleというスクリプトを作成し、スクリプト・リポジトリに格納します。rqEvalを呼び出すと、'PNG'OUT_QRY値が指定されます。

BEGIN
  sys.rqScriptDrop('PNG_Example');
  sys.rqScriptCreate('PNG_Example',
    'function(){
      dat <- data.frame(y = log(1:100), x = 1:100)
      plot(lm(y ~ x, dat))
      }');
END;
/
SELECT *
  FROM table(rqEval(NULL,'PNG','PNG_Example'));

Oracle SQL DeveloperでのSELECT文の結果は次のようになります。

NAME     ID  IMAGE
------ ----  ------
          1  (BLOB)
          2  (BLOB)
          3  (BLOB)
          4  (BLOB)

10.5.3 rqGrantプロシージャ

rqGrantプロシージャは、OML4RのデータストアまたはOML4Rスクリプト・リポジトリ内のスクリプトへの読取りアクセス権を付与します。

構文

rqGrant (
    V_NAME     VARCHAR2     IN
    V_TYPE     VARCHAR2     IN
    V_USER     VARCHAR2     IN     DEFAULT)
  

パラメータ

パラメータ 説明
V_NAME OML4RのデータストアまたはOML4Rスクリプト・リポジトリ内のスクリプトの名前。
V_TYPE データストアの場合、タイプはdatastoreです。スクリプトの場合、タイプはrqscriptです。
V_USER アクセス権を付与するユーザーの名前。

例10-21 スクリプトへの読取りアクセス権の付与

-- Grant read privilege access to Scott.
BEGIN
  rqGrant('myRandomRedDots2', 'rqscript', 'SCOTT');
END;
/

関連トピック

10.5.4 rqGroupEval関数

rqGroupEval関数は、グループ化列を識別するユーザー定義関数です。

ユーザーは、SQLでのグループ適用機能の汎用実装であるSQLオブジェクトrqGroupEvalImplを使用して、PL/SQLでrqGroupEval関数を定義します。この実装ではデータ・パラレル実行がサポートされており、1つ以上のRエンジンにより同じR関数(タスク)が異なるデータ・パーティションで実行されます。データは、グループ化列の値に従ってパーティショニングされます。

1つのグループ化列のみがサポートされています。複数の列がある場合、それらの列を1つの列に結合して、その新しい列をグループ化列として使用します。

rqGroupEval関数は、EXP_NAMパラメータで指定されたスクリプト内のR関数を実行します。INP_CURパラメータを使用して、データをR関数に渡します。PAR_CURパラメータを使用して、引数をR関数に渡すことができます。

R関数は、データベース内にSQL表として表示されるR data.frameオブジェクトを返します。OUT_QRYパラメータを使用して、返される値の形式を定義します。

rqGroupEval関数を作成するには、次の2つのPL/SQLオブジェクトを作成します。

  • 返される結果の型を指定するPL/SQLパッケージ。

  • パッケージの戻り値を取り、その戻り値とPIPELINED_PARALLEL_ENABLEセットを使用してデータをパーティショニングする列を示す関数。

構文

rqGroupEval (
     INP_CUR     REF CURSOR     IN
     PAR_CUR     REF CURSOR     IN
     OUT_QRY     VARCHAR2       IN
     GRP_COL     VARCHAR2       IN
     EXP_NAM     VARCHAR2       IN)

パラメータ

パラメータ 説明

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が含まれることを指定します。

GRP_COL

データのパーティショニングに使用するグループ化列の名前。

EXP_NAM

OML4Rスクリプト・リポジトリ内のスクリプトの名前。

戻り値

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

この例に示すPL/SQLブロックでは、スクリプトmyC5.0FunctionOML4Rスクリプト・リポジトリに存在しないようにするために、このスクリプトを削除します。その後、関数を作成し、それをスクリプトmyC5.0Functionとしてスクリプト・リポジトリに格納します。

このR関数は、2つの引数(操作対象のデータと、データストアの作成で使用する接頭辞)を受け入れます。この関数はC50パッケージを使用して、C50からのchurnデータセットに基づいてC5.0モデルを構築します。この関数は、状態ごとのデータに基づいて1つのチャーン・モデルを構築します。

myC5.0Function関数はC50パッケージをロードして、データベース・サーバーのRエンジンで関数が実行されるときにその関数本体がC50パッケージにアクセスできるようにします。次に、データストアの接頭辞および状態の名前を使用して、データストア名を作成します。モデルから状態名を除外するために、この関数はdata.frameから列を削除します。data.frame内のファクタはユーザー定義の埋込みR関数にロードされるときに文字列ベクターに変換されるため、myC5.0Function関数は明示的に文字ベクターをRファクタに戻します。

myC5.0Function関数は、指定された列から状態のデータを取得し、その状態のモデルを作成して、モデルをデータストアに保存します。R関数は、関数の実行結果として表示可能な単純な値を持つためにTRUEを返します。

この例では次に、PL/SQLパッケージchurnPkgおよびユーザー定義関数churnGroupEvalを作成します。rqGroupEval関数実装を定義する際、PARALLEL_ENABLE句はオプションですが、CLUSTER BY句は必須です。

最後に、churnGroupEval関数を呼び出すSELECT文を実行します。churnGroupEval関数のINP_CUR引数で、SELECT文は、R関数およびR関数に渡すデータセットのパラレル実行を使用するようにPARALLELヒントを指定します。churnGroupEval関数のINP_CUR引数は、OML4Rへの接続およびR関数に渡すデータストア接頭辞を指定します。OUT_QRY引数はXML形式の値を返すことを指定し、GRP_NAM引数は、グループ化列としてデータセットの状態列を使用することを指定し、EXP_NAM引数は、呼び出すR関数としてスクリプト・リポジトリ内のmyC5.0Functionスクリプトを指定します。

50州とワシントンD.Cのそれぞれについて、SELECT文は、churnGroupEval表関数から州の名前と値TRUEを含むXML文字列を返します。

例10-22 rqGroupEval関数の使用方法

BEGIN
  sys.rqScriptDrop('myC5.0Function');
  sys.rqScriptCreate('myC5.0Function',
    'function(dat, datastorePrefix) {
       library(C50)
       datastoreName <- paste(datastorePrefix, dat[1, "state"], sep = "_")
       dat$state <- NULL
       dat$churn <- as.factor(dat$churn)
       dat$area_code <- as.factor(dat$area_code)
       dat$international_plan <- as.factor(dat$international_plan)
       dat$voice_mail_plan <- as.factor(dat$voice_mail_plan)
       mod <- C5.0(churn ~ ., data = dat, rules = TRUE)
       ore.save(mod, name = datastoreName)
       TRUE
      }');
END;
/

CREATE OR REPLACE PACKAGE churnPkg AS
  TYPE cur IS REF CURSOR RETURN CHURN_TRAIN%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;
/
 
SELECT *
  FROM table(churnGroupEval(
    cursor(SELECT * /*+ parallel(t,4) */ FROM CHURN_TRAIN t),
    cursor(SELECT 1 AS "ore.connect",
           'myC5.0model' AS "datastorePrefix" FROM dual),
    'XML', 'state', 'myC5.0Function'));

10.5.5 rqRevokeプロシージャ

rqRevokeプロシージャは、OML4RのデータストアまたはOML4Rスクリプト・リポジトリ内のスクリプトへの読取りアクセス権を取り消します。

構文

rqGrant (
    V_NAME     VARCHAR2     IN
    V_TYPE     VARCHAR2     IN
    V_USER     VARCHAR2     IN     DEFAULT)
  

パラメータ

パラメータ 説明
V_NAME OML4RのデータストアまたはOML4Rスクリプト・リポジトリ内のスクリプトの名前。
V_TYPE データストアの場合、タイプはdatastoreです。スクリプトの場合、タイプはrqscriptです。
V_USER アクセス権を取り消すユーザーの名前。

例10-23 スクリプトへの読取りアクセス権の取消し

-- Revoke read privilege access to Scott.
BEGIN
  rqRevoke('myRandomRedDots2', 'rqscript', 'SCOTT');
END;
/

10.5.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)

パラメータ

表10-17 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

OML4Rスクリプト・リポジトリ内のスクリプトの名前。

戻り値

関数rqRowEvalは、OUT_QRYパラメータ値で指定されている構造を持つ表を返します。

この例では、C50パッケージを使用して、C5.0デシジョン・ツリー・モデルを使用してチャーン・データをスコアリングします(つまり、解約傾向が高い顧客を予測します)。この例では、指定された状態からの顧客を並行してスコアリングします。この例では、関数ore.rowApplyを呼び出した場合と同じ結果になります。

ヒント:

この例では、CHURN_TEST表とmyXLevelsデータストアを使用します。そのため、Rでは、この例を実行する前に、表を作成する関数、およびxlevelsオブジェクトを取得する関数を起動し、それをmyXLevelsデータストアに保存する必要があります。

例10-24 rqRowEval関数の使用

この例では、ユーザー定義関数を作成し、その関数をOML4Rスクリプト・リポジトリに保存します。このユーザー定義関数は状態のC5.0モデルを作成し、そのモデルをデータストアに保存します。関数myC5.0FunctionForLevelsは、値TRUEを返します

この例では、PL/SQLパッケージchurnPkgおよび関数churnGroupEvalを作成します。この例では、文字列myC5.0modelFLを含むデータストアの名前を取得するためのカーソルを宣言してから、これらのデータソースを削除するPL/SQLブロックを実行します。次に、churnGroupEval関数を呼び出すSELECT文を実行します。churnGroupEval関数はmyC5.0FunctionForLevels関数を呼び出してC5.0モデルを生成し、それをデータストアに保存します。

この例では次に、myScoringFunction関数を作成してスクリプト・リポジトリに格納します。この関数は、状態のレベルでC5.0モデルをスコアリングし、結果をdata.frameで返します。

最後に、rqRowEval関数を呼び出すSELECT文を実行します。rqRowEval関数への入力カーソルはPARALLELヒントを使用して、使用する並列度レベルを指定します。カーソルはデータソースとしてCHURN_TEST表を指定し、マサチューセッツの行のみが含まれるように行をフィルタ処理します。処理される行はすべて同じ予測モデルを使用します。

パラメータ・カーソルはore.connect制御引数を指定して、データベース・サーバー上のOML4Rに接続し、myScoringFunction関数へのdatastorePrefix引数とxlevelsDatastore引数の値を指定します。

OUT_QRYパラメータのSELECT文は、出力形式を指定します。ROW_NUMパラメータでは、各パラレルRエンジンで一度に処理する行数として200を指定します。EXP_NAMEパラメータでは、呼び出すR関数としてスクリプト・リポジトリ内のmyScoringFunctionを指定します。

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

10.5.7 rqTableEval関数

rqTableEval関数は、EXP_NAMパラメータで指定されているスクリプト内のR関数を実行します。

INP_CURパラメータを使用して、データをR関数に渡します。PAR_CURパラメータを使用して、引数をR関数に渡すことができます。

R関数は、データベース内にSQL表として表示されるR data.frameオブジェクトを返します。OUT_QRYパラメータを使用して、返される値の形式を定義します。

構文

rqTableEval (
     INP_CUR     REF CURSOR     IN
     PAR_CUR     REF CURSOR     IN
     OUT_QRY     VARCHAR2       IN
     EXP_NAM     VARCHAR2       IN)

パラメータ

表10-18 rqTableEval関数のパラメータ

パラメータ 説明

INP_CUR

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

PAR_CUR

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

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が含まれることを指定します。

EXP_NAM

OML4Rスクリプト・リポジトリ内のスクリプトの名前。

戻り値

関数rqTableEvalは、OUT_QRYパラメータ値で指定されている構造を持つ表を返します。

この例の最初にあるPL/SQLブロックでは、スクリプトmyNaiveBayesModelOML4Rスクリプト・リポジトリに存在しないようにするために、このスクリプトを削除します。次に、関数を作成して、それをスクリプトmyNaiveBayesModelとしてリポジトリに格納します。

このR関数は、2つの引数(操作対象のデータおよびデータストアの名前)を受け入れます。この関数は、irisデータセットに基づいてNaive Bayesモデルを構築します。Naive Bayesはe1071パッケージ内にあります。

myNaiveBayesModel関数はe1071パッケージをロードして、データベース・サーバーのRエンジンで関数が実行されるときにその関数本体がe1071パッケージにアクセスできるようにします。data.frame内のファクタはユーザー定義の埋込みR関数にロードされるときに文字列ベクターに変換されるため、myNaiveBayesModel関数は明示的に文字ベクターをRファクタに変換します。

myNaiveBayesModel関数は指定された列からデータを取得した後、モデルを作成してデータストアに保存します。R関数は、関数の実行結果として表示可能な単純な値を持つためにTRUEを返します。

次に、rqTableEval関数を呼び出すSELECT文を実行します。rqTableEval関数のINP_CUR 引数で、SELECT文は、R関数に渡すデータセットを指定します。データは、ore.create(iris, "IRIS")の呼出しによって作成されたIRIS表から取得されます(この例には示していません)。rqTableEval関数のINP_CUR引数は、R関数に渡すデータストアの名前を指定し、ユーザー定義のR関数の埋込みRの実行中にデータベースへのOML4R接続を確立するためのore.connect制御引数を指定します。OUT_QRY引数はXML形式の値を返すことを指定し、EXP_NAM引数は、呼び出すR関数としてスクリプト・リポジトリ内のmyNaiveBayesModelスクリプトを指定します。

例10-25 rqTableEval関数の使用

BEGIN
  sys.rqScriptDrop('myNaiveBayesModel');
  sys.rqScriptCreate('myNaiveBayesModel',
    'function(dat, datastoreName) {
       library(e1071)
       dat$Species <- as.factor(dat$Species)
       nbmod <- naiveBayes(Species ~ ., dat)
       ore.save(nbmod, name = datastoreName)
       TRUE
     }');
END;
/

SELECT *
  FROM table(rqTableEval(
    cursor(SELECT * FROM IRIS),
    cursor(SELECT 'myNaiveBayesDatastore' "datastoreName", 
           1 as "ore.connect" FROM dual),
    'XML', 'myNaiveBayesModel'));

SELECT文は、rqTableEval表関数から値TRUEを含むXML文字列を返します。

次のSELECT文に示すとおり、myNaiveBayesDatastoreデータソースが生成され、オブジェクトnbmodがこのデータソースに存在しています。

SQL> SELECT * from RQUSER_DATASTORECONTENTS 
  2     WHERE dsname = 'myNaiveBayesDatastore';
 
DSNAME                  OBJNAME  CLASS       OBJSIZE  LENGTH  NROW  NCOL
---------------------   -------  ----------  -------  ------  ----  ----
myNaiveBayesDatastore   nbmod    naiveBayes     1485       4

次のように、ローカルのRセッションでモデルをロードして表示できます。

R> ore.load("myNaiveBayesDatastore")
[1] "nbmod"
R> nbmod
$apriori
Y
    setosa versicolor  virginica 
        50         50         50 
 
$tables
$tables$Sepal.Length
            Sepal.Length
Y             [,1]      [,2]
  setosa     5.006 0.3524897
  versicolor 5.936 0.5161711
  virginica  6.588 0.6358796
 
$tables$Sepal.Width
            Sepal.Width
Y             [,1]      [,2]
  setosa     3.428 0.3790644
  versicolor 2.770 0.3137983
  virginica  2.974 0.3224966
 
$tables$Petal.Length
            Petal.Length
Y             [,1]      [,2]
  setosa     1.462 0.1736640
  versicolor 4.260 0.4699110
  virginica  5.552 0.5518947
 
$tables$Petal.Width
            Petal.Width
Y             [,1]      [,2]
  setosa     0.246 0.1053856
  versicolor 1.326 0.1977527
  virginica  2.026 0.2746501
 
 
$levels
[1] "setosa"     "versicolor" "virginica" 
 
$call
naiveBayes.default(x = X, y = Y, laplace = laplace)
 
attr(,"class")
[1] "naiveBayes"

10.5.8 sys.rqScriptCreateプロシージャ

sys.rqScriptCreateプロシージャは、スクリプトを作成し、それをOML4Rスクリプト・リポジトリに追加します。

構文

sys.rqScriptCreate (
    V_NAME          VARCHAR2    IN
    V_SCRIPT        CLOB        IN
    V_GLOBAL        BOOLEAN     IN     DEFAULT
    V_OVERWRITE     BOOLEAN     IN     DEFAULT)
パラメータ 説明
V_NAME OML4Rスクリプト・リポジトリ内のスクリプトの名前。
V_SCRIPT スクリプトに保存するR関数定義。
V_GLOBAL TRUEは、スクリプトがパブリックであることを示します。FALSEは、スクリプトがプライベートであることを示します。
V_OVERWRITE OML4Rスクリプト・リポジトリにV_NAMEと同じ名前のスクリプトがすでにある場合、TRUEではそのスクリプトの内容がV_SCRIPTに置き換えられ、FALSEでは置き換えられません。

10.5.9 sys.rqScriptDropプロシージャ

sys.rqScriptDropプロシージャは、OML4Rスクリプト・リポジトリからスクリプトを削除します。

構文

sys.rqScriptDrop (
    V_NAME          VARCHAR2    IN
    V_GLOBAL        BOOLEAN     IN     DEFAULT
    V_SILENT        BOOLEAN     IN     DEFAULT)
パラメータ 説明
V_NAME OML4Rスクリプト・リポジトリ内のスクリプトの名前。
V_GLOBAL TRUE (デフォルト)は、スクリプトがパブリックであることを示します。FALSEは、スクリプトがプライベートであることを示します。
V_SILENT FALSE (デフォルト)は、指定したRスクリプトの削除中にエラーが発生した場合、sys.rqqScriptDropによりエラー・メッセージを表示することを指定します。TRUEは、プロシージャでエラー・メッセージを表示しないことを示します。

10.6 Autonomous DatabaseでのEmbedded R Execution用のSQL API

Autonomous DatabaseでのEmbedded R Execution用のSQL APIは、認可トークンの設定、アクセス制御リスト(ACL)権限の管理、Rスクリプトの実行およびジョブの同期実行と非同期実行のためのSQLインタフェースを提供します。

10.6.1 アクセスおよび認可のプロシージャと関数

ネットワーク・アクセス制御リスト(ACL) APIを使用して、データベースから外部ネットワーク・サービスおよびリソースへのユーザーによるアクセスを制御します。トークン・ストアAPIを使用して、クラウド・ホストによって発行された認可トークンを保持し、後続のSQLコールで使用できるようにします。

次を使用してACL権限を管理します。ADMINユーザーが必要です。

次を使用して認可トークンを管理します。

ワークフロー

Autonomous DatabaseでEmbedded R Execution用のSQL APIを使用するための一般的なワークフローは次のとおりです。

  1. ADMINユーザーとしてPDBに接続し、ルート・ドメインがadb.us-region-1.oraclecloudapps.comであるクラウド・ホストのACLリストに通常のユーザーOMLUSERを追加します。

    exec rqAppendHostAce('OMLUSER','adb.us-region-1.oraclecloudapps.com');
  2. OML Rest URLは、プロビジョニングされているOracle Autonomous Databaseから取得できます。

    1. Oracle Cloud Infrastructureアカウントにサインインします。OCIユーザー名とパスワードが必要です。
    2. ハンバーガー・メニューをクリックし、プロビジョニングされているAutonomous Databaseインスタンスを選択します。Autonomous Databaseのプロビジョニングの詳細は、Oracle Autonomous Databaseのプロビジョニングを参照してください。
    3. 「データベース・アクション」をクリックします。
    4. 「データベース・アクション」ページをスクロール・ダウンし、「関連サービス」タイルで「Oracle Machine Learning RESTfulサービス」をクリックします。「Oracle Machine Learning RESTfulサービス」ダイアログが開きます。

      「コピー」をクリックして、次のURLを取得します。

      • OMLによって提供されるREST APIのREST認証トークンの取得:

        <oml-cloud-service-location-url>/omlusers/

    URL <oml-cloud-service-location-url>には、テナンシID、場所およびデータベース名が含まれます。たとえば、https://qtraya2braestch-omldb.adb.us-sanjose-1.oraclecloudapps.comです.

    この例では、次のようになります。

    • qtraya2braestchはテナンシIDです
    • omldbはデータベース名です
    • us-sanjose-1はデータセンター・リージョンです
    • oraclecloudapps.comはルート・ドメインです
  3. Oracle Machine LearningのREST APIでは、トークンを使用してOracle Machine Learningユーザーを認証します。アクセス・トークンを認証および取得するには、OMLユーザー名およびパスワードを使用して、Oracle Machine Learning User Management Cloud Service RESTエンドポイント/oauth2/v1/tokenにPOSTリクエストを送信します。

    curl -X POST --header 'Content-Type: application/json' --header 'Accept: application/json' 
    -d '{"grant_type":"password", "username":"'${username}'", "password":"'${password}'"}' 
    "<oml-cloud-service-location-url>/omlusers/api/oauth2/v1/token"

    この例では次の値が使用されています。

    • usernameはOMLユーザー名です。
    • passwordはOMLユーザー・パスワード
    • oml-cloud-service-location-urlは、テナンシID、データベース名、場所名を含むOracle Machine Learning User Management Cloud ServiceインスタンスURLのRESTサーバー部分を含む変数です。omlserver URLは、Oracle Autonomous Databaseインスタンスのサービス・コンソールの「開発」タブから取得できます。

    ノート:

    トークンの有効期限が切れると、OML ServicesのRESTエンドポイントへのすべてのコールは、HTTPエラー: HTTP/1.1 401 Unauthorizedとともにトークンの有効期限が切れたことを示すメッセージを返します
  4. OMLUSERとしてPDBに接続し、アクセス・トークンを設定し、rqIndexEval2を実行します。

    exec rqSetAuthToken('<access token>');
    select *
        from table(rqIndexEval2(
            par_qry => NULL,
            out_fmt => '{"ID":"number", "RES":"varchar2(3)"}',
            times_num => 3,
            scr_name => 'idx_ret_df'));
    
            ID RES
    ---------- ---
             1 a
             2 b
             3 c
    
    3 rows selected.
10.6.1.1 rqAppendHostACEプロシージャ

rqAppendHostACEプロシージャは、アクセス制御エントリ(ACE)をクラウド・ホストのアクセス制御リスト(ACL)に追加します。ACLはデータベースからクラウド・ホストへのアクセスを制御し、ACEは指定されたユーザー名に付与される接続権限を指定します。

構文


PROCEDURE SYS.rqAppendHostACE(
  username IN VARCHAR2,
  host_root_domain IN VARCHAR2
)

パラメータ

username: クラウド・ホストへの接続権限が付与されているデータベース・ユーザー。

host_root_domain: クラウド・ホストのルート・ドメイン。たとえば、URLがhttps://qtraya2braestch-omldb.adb.us-sanjose-1.oraclecloudapps.comの場合、クラウド・ホストのルート・ドメインはadb.us-sanjose-1.oraclecloudapps.comです。

10.6.1.2 rqGetHostACE関数

rqGetHostACE関数は、指定されたユーザーの既存のホスト・アクセス制御エントリ(ACE)を取得します。指定されたユーザーのホストACEが存在しない場合は、例外が発生します。

構文

FUNCTION sys.rqGetHostACE(
  p_username IN VARCHAR2
)

パラメータ

p_username: ホストACEを検索するデータベース・ユーザー。

ユーザーOMLUSERにクラウド・ホスト(ibuwlq4mjqkeils-omlrgpy1.adb.us-region-1.oraclecloudapps.com)へのアクセス権がある場合、ADMINユーザーは次を実行してユーザーの権限を確認できます。

SQL> set serveroutput on
DECLARE 
    hostname VARCHAR2(4000);
BEGIN
    hostname := rqGetHostACE('OMLUSER'); 
    DBMS_OUTPUT.put_line ('hostname: ' || hostname);
END;
/
SQL> hostname: ibuwlq4mjqkeils-omlrgpy1.adb.us-region-1.oraclecloudapps.com 
PL/SQL procedure successfully completed.
10.6.1.3 rqRemoveHostACEプロシージャ

rqRemoveHostACEプロシージャは、指定されたusernameから既存のホスト・アクセス制御エントリ(ACE)を削除します。クラウド・ホストにアクセス・トークンが設定されていた場合は、トークンも削除されます。ホストACEが存在しない場合は、例外が発生します。

構文

PROCEDURE SYS.rqRemoveHostACE(
   username IN  VARCHAR2
)

パラメータ

username: クラウド・ホストへの接続権限が取り消されるデータベース・ユーザー。

10.6.1.4 rqSetAuthTokenプロシージャ

rqSetAuthTokenプロシージャは、トークン・ストアにアクセス・トークンを設定します。

構文

PROCEDURE SYS.rqSetAuthToken(
  access_token IN VARCHAR2
)
10.6.1.5 rqIsTokenSet関数

rqIsTokenSet関数は、認可トークンが設定されているかどうかを返します。

構文

FUNCTION SYS.rqIsTokenSet() RETURN BOOLEAN

次の例に、rqSetAuthTokenプロシージャおよびrqIsTokenSet関数の使用方法を示します。

DECLARE
    is_set BOOLEAN;
BEGIN
    rqSetAuthToken('<access token>');
    is_set := rqIsTokenSet();
    IF (is_set) THEN
        DBMS_OUTPUT.put_line ('token is set');
    END IF;
END;
/

10.6.2 Embedded R Execution関数(Autonomous Database)

次の各トピックでは、Autonomous Database関数でのEmbedded R Execution用のSQL APIについて説明します。

10.6.2.1 rqGrant関数

このトピックでは、Oracle Autonomous Databaseで使用される際のrqGrant関数について説明します。

rqGrant関数は、OML4RデータストアまたはOML4Rスクリプト・リポジトリ内のスクリプトへの読取りアクセス権を付与します。

構文

rqGrant (
    V_NAME          VARCHAR2    IN
    V_TYPE          VARCHAR2    IN
    V_USER          VARCHAR2    IN     DEFAULT)

パラメータ

パラメータ 説明
V_NAME OML4RのデータストアまたはOML4Rスクリプト・リポジトリ内のスクリプトの名前。
V_TYPE データストアの場合、タイプはdatastoreです。スクリプトの場合、タイプはrqScriptです。
V_USER アクセス権を付与するユーザーの名前。

例10-26 スクリプトへの読取りアクセス権の付与

-- Grant read privilege access to OMLUSER.
BEGIN
  rqGrant('RandomRedDots2', 'rqscript', 'OMLUSER');
END;
/

例10-27 データストアへの読取りアクセス権の付与

-- Grant read privilege access to datastore ds1 to OMLUSER.
BEGIN
  rqGrant('ds1', 'datastore', 'OMLUSER');
END;
/

例10-28 すべてのユーザーに対するスクリプトへの読取りアクセス権の付与

-- Grant read privilege access to script RandomRedDots to all users.
BEGIN
  rqGrant('rqFun1', 'rqscript', NULL);
END;
/

例10-29 すべてのユーザーに対するデータストアへの読取りアクセス権の付与

-- Grant read privilege access to datastore ds1 to all users.
BEGIN
  rqGrant('ds1', 'datastore', NULL);
END;
/
10.6.2.2 rqRevokeプロシージャ

rqRevokeプロシージャは、OML4RのデータストアまたはOML4Rスクリプト・リポジトリ内のスクリプトへの読取りアクセス権を取り消します。

構文

rqRevoke (
    V_NAME     VARCHAR2     IN
    V_TYPE     VARCHAR2     IN
    V_USER     VARCHAR2     IN     DEFAULT)
  

パラメータ

パラメータ 説明
V_NAME OML4RのデータストアまたはOML4Rスクリプト・リポジトリ内のスクリプトの名前。
V_TYPE データストアの場合、タイプはdatastoreです。スクリプトの場合、タイプはrqscriptです。
V_USER アクセス権を取り消すユーザーの名前。

例10-30 スクリプトへの読取りアクセス権の取消し

-- Revoke read privilege access to OMLUSER.
BEGIN
  rqRevoke('myRandomRedDots2', 'rqscript', 'OMLUSER');
END;
/
10.6.2.3 rqListEnvs関数

関数rqListEnvsは、Oracle Autonomous Databaseで使用すると、オブジェクト・ストレージに保存されている環境をリストします。

構文

FUNCTION rqListEnvs
RETURN SYS.AnyDataSet

rqListEnvs関数をコールし、存在する環境をリストする問合せを発行します。

select * from table(rqListEnvs());

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


NAME
----------
VALUE
--------------------------------------------------------------------------------
{"envs":[{"size":"831.5 MiB","name":"myrenv","description":"Install R forecast and ggplot2 packages","tags":{"application":"OML4R", "user":"OMLUSER"},"number_of_installed_packages":121}]}
10.6.2.4 rqEval2関数

関数rqEval2は、Oracle Autonomous Databaseで使用すると、データを明示的に取得するか、関数に対して外部データが自動的にロードされるユーザー定義R関数を実行します。

関数rqEval2は、SCR_NAMEパラメータで指定されたスクリプト内のR関数を実行します。

構文

rqEval2 (
    PAR_LST VARCHAR2,
    OUT_FMT VARCHAR2,
    SCR_NAME VARCHAR2,
    SCR_OWNER VARCHAR2 DEFAULT NULL,
    ENV_NAME  VARCHAR2 DEFAULT NULL
    )

パラメータ

パラメータ 説明

PAR_LST

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

たとえば、欠損値が含まれる行を入力表から省略するには、'{"ore.na.omit":true}'を使用します。

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

OUT_FMT

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

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

関連項目: 出力形式

SCR_NAME

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

SCR_OWNER

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

ENV_NAME

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

戻り値

関数rqEval2は、out_fmtパラメータ値で指定された構造を持つ表を返します。

例10-31 rqEval2の使用方法

この例では、R関数を定義し、OML4Rスクリプト・リポジトリに格納します。PL/SQLブロックによって、スクリプトRandomRedDots2が作成され、スクリプト・リポジトリに追加されます。スクリプトがプライベートであることを指定し、同じ名前でスクリプトを上書きします。ユーザー定義R関数でrqEval2関数をコールします。


BEGIN
  sys.rqScriptCreate('RandomRedDots2',
    'function(divisor = 100, numDots = 100) {
       id <- 1:10
       plot(1:numDots, rnorm(numDots), pch = 21, bg = "red", cex = 2 )
       data.frame(id = id, val = id / divisor)}',
       v_global => FALSE,
       v_overwrite => TRUE);
END;
/

例10-32 JSON出力

PAR_LST引数は、特殊な制御引数oml_service_levelLOWサービス・レベルを使用することを指定します。OUT_FMT引数で、文字列'JSON'は、返される表にJSON文字列であるCLOBが含まれることを指定します。SCR_NAMEパラメータは、コールするR関数としてスクリプト・リポジトリ内のRandomRedDots2関数を指定します。JSON出力はCLOBです。set long [length]をコールすると、詳細な出力を取得できます。

%script
set long 500
SELECT * FROM table(rqEval2(
    par_lst => '{"ore_service_level":"LOW"}',
    out_fmt => 'JSON',
    scr_name => 'RandomRedDots2'));

結果は次のとおりです。

NAME VALUE 
[{"val":0.01,"id":1},{"val":0.02,"id":2},{"val":0.03,"id":3},{"val":0.04,"id":4},{"val":0.05,"id":5},{"val":0.06,"id":6},{"val":0.07,"id":7},{"val":0.08,"id":8},{"val":0.09,"id":9},{"val":0.1,"id":10}]

例10-33 PNG出力。

PAR_LST引数は、特殊な制御引数oml_service_levelでLOWサービス・レベルを使用することを指定します。OUT_FMT引数で、reqEval2によって返されるイメージを含める文字列'PNG'。SCR_NAMEパラメータは、コールするR関数としてスクリプト・リポジトリ内のRandomRedDots2関数を指定します。JSON出力はCLOBです。

%script
SELECT * FROM table(rqEval2(
    par_lst => '
    {"ore_graphics_flag":true, "ore_service_level":"LOW"}',
    out_fmt => 'PNG',
    scr_name => 'RandomRedDots2'));

結果は次のとおりです。

---------------------------
NAME   ID   VALUE   IMAGE   
       1            89504E470D0A1A0A0000000D49484452000001E0000001E008060000007DD4BE950000200049444154789C

ノート:

ここでは、出力の一部のみを示します。出力の長さを決定するには、パラメータset long [length]を使用します。

例10-34 XML出力。

PAR_LST引数は、特殊な制御引数oml_service_levelでLOWサービス・レベルを使用することを指定します。OUT_FMT引数で、文字列'JSON'は、返される表にJSON文字列であるCLOBが含まれることを指定します。SCR_NAMEパラメータは、コールするR関数としてスクリプト・リポジトリ内のRandomRedDots2関数を指定します。JSON出力はCLOBです。

%script
set long 1000
SELECT * FROM table(rqEval2(
    par_lst => '{"ore_service_level":"LOW"}',
    out_fmt => 'XML',
    scr_name => 'RandomRedDots2'));

結果は次のとおりです。

NAME VALUE
      <root><frame_obj><ROW-frame_obj><id>1</id><val>0.01</val></ROW-frame_obj><ROW-frame_obj><id>2</id><val>0.02</val></ROW-frame_obj><ROW-frame_obj><id>3</id><val>0.03</val></ROW-frame_obj><ROW-frame_obj><id>4</id><val>0.04</val></ROW-frame_obj><ROW-frame_obj><id>5</id><val>0.05</val></ROW-frame_obj><ROW-frame_obj><id>6</id><val>0.06</val></ROW-frame_obj><ROW-frame_obj><id>7</id><val>0.07</val></ROW-frame_obj><ROW-frame_obj><id>8</id><val>0.08</val></ROW-frame_obj><ROW-frame_obj><id>9</id><val>0.09<

ノート:

ここでは、出力の一部のみを示します。出力の長さを決定するには、パラメータset long [length]を使用します。set long 1000は、完全な出力を提示します。

例10-35 XML出力

Select文を実行して、XML出力を取得します。構造化データとイメージの両方がXMLに含まれるように、ore_graphics_flagをtrueに設定します

%script


set long 1000

SELECT * FROM table(rqEval2(
    par_lst => '{"ore_graphics_flag":true, "ore_service_level":"LOW"}',
    out_fmt => 'XML',
    scr_name => 'RandomRedDots2'));

結果は次のとおりです。


---------------------------
NAME   VALUE                
<root><R-data><frame_obj><ROW-frame_obj><id>1</id><val>0.01</val></ROW-frame_obj><ROW-frame_obj><id>2</id><val>0.02</val></ROW-frame_obj><ROW-frame_obj><id>3</id><val>0.03</val></ROW-frame_obj><ROW-frame_obj><id>4</id><val>0.04</val></ROW-frame_obj><ROW-frame_obj><id>5</id><val>0.05</val></ROW-frame_obj><ROW-frame_obj><id>6</id><val>0.06</val></ROW-frame_obj><ROW-frame_obj><id>7</id><val>0.07</val></ROW-frame_obj><ROW-frame_obj><id>8</id><val>0.08</val></ROW-frame_obj><ROW-frame_obj><id>9</id><val>0.09</val></ROW-frame_obj><ROW-frame_obj><id>10</id><val>0.1</val></ROW-frame_obj></frame_obj></R-data><images><image><img src="data:image/pngbase64"><![CDATA[iVBORw0KGgoAAAANSUhEUgAAAeAAAAHgCAYAAAB91L6VAAAgAElEQVR4nOzdd3hT5fvH8Xe6m6QDSgtl07KRjciQIZvKkiECCspQBNkiICBLUBRxACoqU0RAkT0EREGGTCm77LJll2Z0pc/vD9Qf8u04QJPTcb+uq9clzZM8n9Qkd845zzAopRRCCCGEcCk3vQMIIYQQOZEUYCGEEEIHUoCFEEIIHUgBFkIIIXQgBVgIIYTQgRRgIYQQQgdSgIUQQggdSAEWQgghdCAFWAghhNCBFGAhhBBCB1KAhRBCCB1IARZCCCF0IAVYCCGE0IEUYCGEEEIHUoCFEEIIHU 

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

Select文を実行して、リレーショナル出力を取得します。OUT_FMT引数は、rqEval2によって返される表の列名およびデータ型が含まれるJSON文字列を指定します。

%script
SELECT * FROM table(rqEval2(
    par_lst => '{"ore_service_level":"LOW"}',
    out_fmt => '{"val":"NUMBER","id":"NUMBER"}',
    scr_name => 'RandomRedDots2'));

結果は次のとおりです。

val id 
0.01 1 
0.02 2 
0.03 3 
0.04 4 
0.05 5 
0.06 6 
0.07 7 
0.08 8 
0.09 9 
0.1 10 

10 rows selected.

例10-37 rqEval2を使用して引数を渡す場合:

Select文を実行し、rqEval2関数に引数を渡してXML出力を取得します。

%script
set long 500
SELECT * FROM table(rqEval2(
        par_lst => '{"ore_service_level":"LOW", "divisor":50, "numDots":500}',
        out_fmt => 'XML',
        scr_name => 'RandomRedDots2'));

結果は次のとおりです。

NAME VALUE
       <root><frame_obj><ROW-frame_obj><id>1</id><val>0.01</val></ROW-frame_obj><ROW-frame_obj><id>2</id><val>0.02</val></ROW-frame_obj><ROW-frame_obj><id>3</id><val>0.03</val></ROW-frame_obj><ROW-frame_obj><id>4</id><val>0.04</val></ROW-frame_obj><ROW-frame_obj><id>5</id><val>0.05</val></ROW-frame_obj><ROW-frame_obj><id>6</id><val>0.06</val></ROW-frame_obj><ROW-frame_obj><id>7</id><val>0.07</val></ROW-frame_obj><ROW-frame_obj><id>8</id><val>0.08</val></ROW-frame_obj><ROW-frame_obj><id>9</id><val>0.09<
10.6.2.5 rqTableEval2関数

関数rqTableEval2は、SCR_NAMEパラメータで指定されたスクリプト内のユーザー定義R関数を実行します。

INP_NAMパラメータで指定された表名を使用して、ユーザー定義R関数にデータを渡します。PAR_LSTパラメータを使用して、ユーザー定義R関数に引数を渡します。

OUT_FMTパラメータを使用して、戻り値の形式を定義します。

構文

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

パラメータ

表10-19 rqTableEval関数のパラメータ

パラメータ 説明

INP_NAM

SCR_NAMEパラメータで指定されたR関数に渡すデータを指定する表またはビューの名前。別のユーザーが所有する表またはビューを使用する場合は、<owner name>.<table/view name>という形式を使用します。指定された表またはビューに対する読取りアクセス権が必要です。

PAR_LST

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

たとえば、1列の入力data.frameをベクターに変換することを指定するには、次を使用します。

'{"ore.drop":true}'

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

OUT_FMT

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

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

関連項目: 出力形式

SCR_NAME

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

SCR_OWNER

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

ENV_NAME

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

戻り値

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

この例では、関数を作成して、スクリプトbuildLMとしてリポジトリに格納します。

例10-38 rqTableEval2関数の使用

PL/SQLブロックで、R関数buildLMを作成し、buildLMという名前でスクリプト・リポジトリに格納し、同じ名前でスクリプト・リポジトリに格納されている既存のユーザー定義R関数を上書きします。

BEGIN
    sys.rqScriptCreate('buildLM',
        'function(dat, dsname) {
            mod <- lm(Petal.Length~Petal.Width, dat)
            ore.save(mod, name=dsname, overwrite=TRUE)
            plot(predict(mod), dat$Petal.Length, pch=21, bg=c("red","blue"),  xlab = "Predicted Values", ylab = "Observed Values")
            abline(a = 0, b = 1, lwd=2, col = "green")
            return(data.frame(Coef=mod$coef))}',
    v_global => FALSE,  
    v_overwrite => TRUE);
END;
/

例10-39 JSON出力

INP_NAM引数は、ユーザー定義関数に'IRIS'表を渡します。PAR_LST引数は、特殊な制御引数ore_service_levelでLOWサービス・レベルを使用することを指定します。OUT_FMT引数で、文字列'JSON'は、返される表にJSON文字列であるCLOBが含まれることを指定します。scr_nameパラメータは、コールするR関数としてスクリプト・リポジトリ内のbuildLM関数を指定します。JSON出力はCLOBです。set long [length]をコールすると、詳細な出力を取得できます。

%script
set long 500
SELECT * FROM table(rqTableEval2(
    inp_nam => 'IRIS',
    par_lst => '{"dsname":"ds-1", "ore_service_level":"LOW"}',
    out_fmt => 'JSON',
    scr_name => 'buildLM'));

結果は次のとおりです。

---------------------------
NAME   VALUE
       [{"_row":"(Intercept)","Coef":1.0836},{"_row":"Petal.Width","Coef":2.2299}]
---------------------------

例10-40 PNG出力

par_lst引数は、特殊な制御引数ore_service_levelでLOWサービス・レベルを使用することを指定します。out_fmt引数で、文字列'PNG'はBLOB列にイメージを含めるように指定します。scr_nameパラメータは、コールするR関数としてスクリプト・リポジトリ内のbuildLM関数を指定します。

%script

set long 500

SELECT * FROM table(rqTableEval2( 
    inp_nam => 'IRIS', 
    par_lst => '{"dsname":"ds-1", "ore_graphics_flag":true, "ore_service_level":"LOW"}', 
    out_fmt => 'PNG', 
    scr_name => 'buildLM'));

結果は次のとおりです。

---------------------------
NAME   ID   VALUE   IMAGE                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                        
          1         89504E470D0A1A0A0000000D49484452000001E0000001E0080

ノート:

ここでは、出力の一部のみを示します。出力の長さを決定するには、パラメータset long [length]を使用します
.

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

inp_nam引数は、ユーザー定義関数に'IRIS'表を渡します。par_lst引数は、特殊な制御引数ore_service_levelでLOWサービス・レベルを使用することを指定します。out_fmt引数で、関数によって返される表の列名およびデータ型を指定します。scr_nameパラメータは、コールするR関数としてスクリプト・リポジトリ内のbuildLM関数を指定します。

%script

SELECT * FROM table(rqTableEval2( 
    inp_nam => 'IRIS', 
    par_lst => '{"dsname":"ds-1", "ore_service_level":"LOW"}', 
    out_fmt => '{"Coef":"number"}', 
    scr_name => 'buildLM'));

結果は次のとおりです。

Coef     
  1.0836 
  2.2299
10.6.2.6 rqRowEval2関数

関数rqRowEval2は、Oracle Autonomous Databaseで使用すると、データを一連の行にチャンク化した後、各チャンクに対してユーザー定義R関数を実行します。

関数rqRowEval2は、INP_NAMパラメータで指定されたデータをユーザー定義のR関数に渡します。PAR_LSTパラメータを使用して、R関数に引数を渡すことができます。ROW_NUMパラメータは、R関数の各呼出しに渡す必要のある行数を指定します。最後のチャンクの行数は、指定した数より少なくなる可能性があります。

rqRowEval2関数ではデータ・パラレル実行がサポートされており、1つ以上のRエンジンにより同じR関数(タスク)が個々の独立したデータ・チャンクで実行されます。Oracle Databaseは、データベース・サーバー・マシンで実行されるRエンジン(複数の場合もある)の管理および制御を処理し、自動的にデータをチャンク化して、パラレルで実行されるRエンジンに渡します。Oracle Databaseでは行のすべてのチャンクに対するR関数の実行完了が保証されており、完了しない場合はrqRowEval2関数によってエラーが返されます。

OUT_FMTパラメータを使用して、戻り値の形式を定義します。

構文

rqRowEval2(
    INP_NAM VARCHAR2,
    PAR_LST VARCHAR2,
    OUT_FMT VARCHAR2,
    ROW_NUM NUMBER,
    SCR_NAME VARCHAR2,
    SCR_OWNER VARCHAR2 DEFAULT NULL,
    ENV_NAME  VARCHAR2 DEFAULT NULL
    )

パラメータ

表10-20 rqRowEval2関数のパラメータ

パラメータ 説明

INP_NAM

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

<owner name>.<table/view name>

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

PAR_LST

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

たとえば、R関数でレンダリングされたイメージを取得するには、次を使用します。

'{"ore_graphics_flag":true}'

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

OUT_FMT

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

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

関連項目: 出力形式

ROW_NUM

チャンク内の行の数。Rスクリプトは各チャンクで実行されます。

SCR_NAME

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

SCR_OWNER

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

ENV_NAME

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

戻り値

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

例10-42 rqRowEval2関数の使用

この例では、ユーザー定義関数を作成し、その関数をOML4Rスクリプト・リポジトリに保存します。

PL/SQLブロックによって、スクリプトscoreLMが作成され、スクリプト・リポジトリに追加されます。

%script

BEGIN
    sys.rqScriptCreate('scoreLM',
        'function(dat, dsname){
            ore.load(dsname)
            dat$Petal.Length_pred <- predict(mod, newdata=dat)
            dat[,c("Petal.Length_pred","Petal.Length","Species")]}',
        v_global => FALSE,
        v_overwrite => TRUE);
END;
/

結果は次のとおりです。

PL/SQL procedure successfully completed.


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

例10-43 JSON出力

PAR_LST引数は、特殊な制御引数ore_service_levelでMEDIUMサービス・レベルを使用することを指定します。OUT_FMT引数で、文字列'JSON'は、返される表にJSON文字列であるCLOBが含まれることを指定します。SCR_NAMEパラメータは、コールするR関数としてスクリプト・リポジトリ内のscoreLM関数を指定します。JSON出力はCLOBです。set long [length]をコールすると、詳細な出力を取得できます。

%script

set long 1000

SELECT * FROM table(rqRowEval2(
 inp_nam => 'IRIS',
 par_lst => '{"dsname":"ds-1", "ore_parallel_flag":true, "ore_service_level":"MEDIUM"}',
 out_fmt => 'JSON',
 row_num => 5,
 scr_name => 'scoreLM'));

結果は次のとおりです。

---------------------------
NAME   VALUE                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                      
       [{"Petal.Length_pred":1.5295,"Species":"setosa","Petal.Length":1},{"Petal.Length_pred":1.3066,"Species":"setosa","Petal.Length":1.1},{"Petal.Length_pred":1.5295,"Species":"setosa","Petal.Length":1.2},{"Petal.Length_pred":1.5295,"Species":"setosa","Petal.Length":1.2},{"Petal.Length_pred":1.5295,"Species":"setosa","Petal.Length":1.3},{"Petal.Length_pred":1.5295,"Species":"setosa","Petal.Length":1.3},{"Petal.Length_pred":1.5295,"Species":"setosa","Petal.Length":1.3},{"Petal.Length_pred":1.5295,"Species":"setosa","Petal.Length":1.3},{"Petal.Length_pred":1.7525,"Species":"setosa","Petal.Length":1.3},{"Petal.Length_pred":1.7525,"Species":"setosa","Petal.Length":1.3},{"Petal.Length_pred":1.9755,"Species":"setosa","Petal.Length":1.3},{"Petal.Length_pred":1.3066,"Species":"setosa","Petal.Length":1.4},{"Petal.Length_pred":1.3066,"Species":"setosa","Petal.Length":1.4},{"Petal.Length_pred":1.5295,"Species":"setosa","Petal.Length":1.4},{"Petal.Length_pred":1.5295,"Species":"setosa","Petal.Length":1 

例10-44 リレーショナル

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

%script

SELECT * FROM table(rqRowEval2(
 inp_nam => 'IRIS',
 par_lst => '{"dsname":"ds-1", "ore_parallel_flag":true, "ore_service_level":"MEDIUM"}',
 out_fmt => '{"Petal.Length_pred":"NUMBER", "Petal.Length":"NUMBER", "Species":"VARCHAR2(10)"}',
 row_num => 5,
 scr_name => 'scoreLM'));

結果は次のとおりです。

Petal.Length_pred   Petal.Length   Species   
             1.5295              1 setosa    
             1.3066            1.1 setosa    
             1.5295            1.2 setosa    
             1.5295            1.2 setosa    
             1.5295            1.3 setosa    
             1.5295            1.3 setosa    
             1.5295            1.3 setosa    
             1.5295            1.3 setosa    
             1.7525            1.3 setosa    
             1.7525            1.3 setosa    
             1.9755            1.3 setosa    
             1.3066            1.4 setosa    
             1.3066            1.4 setosa    
             1.5295            1.4 setosa    

Petal.Length_pred   Petal.Length   Species   
             1.5295            1.4 setosa    
             1.5295            1.4 setosa    
             1.5295            1.4 setosa    
             1.5295            1.4 setosa    
             1.5295            1.4 setosa    
             1.5295            1.4 setosa    
             1.5295            1.4 setosa    
             1.7525            1.4 setosa    
             1.7525            1.4 setosa    
             1.7525            1.4 setosa    
             1.3066            1.5 setosa    
             1.3066            1.5 setosa    
             1.5295            1.5 setosa    
             1.5295            1.5 setosa    

Petal.Length_pred   Petal.Length   Species   
             1.5295            1.5 setosa    
             1.5295            1.5 setosa    
             1.5295            1.5 setosa    
             1.5295            1.5 setosa    
             1.5295            1.5 setosa    
             1.7525            1.5 setosa    
             1.9755            1.5 setosa    
             1.9755            1.5 setosa    
             1.9755            1.5 setosa    
             1.5295            1.6 setosa    
             1.5295            1.6 setosa    
             1.5295            1.6 setosa    
             1.5295            1.6 setosa    
             1.5295            1.6 setosa    

Petal.Length_pred   Petal.Length   Species      
             1.9755            1.6 setosa       
             2.4215            1.6 setosa       
             1.5295            1.7 setosa       
             1.7525            1.7 setosa       
             1.9755            1.7 setosa       
             2.1985            1.7 setosa       
             1.5295            1.9 setosa       
             1.9755            1.9 setosa       
             3.5365              3 versicolor   
             3.3135            3.3 versicolor   
             3.3135            3.3 versicolor   
             3.3135            3.5 versicolor   
             3.3135            3.5 versicolor   
             3.9825            3.6 versicolor   

Petal.Length_pred   Petal.Length   Species      
             3.3135            3.7 versicolor   
             3.5365            3.8 versicolor   
             3.5365            3.9 versicolor   
             3.7595            3.9 versicolor   
             4.2055            3.9 versicolor   
             3.3135              4 versicolor   
             3.7595              4 versicolor   
             3.9825              4 versicolor   
             3.9825              4 versicolor   
             3.9825              4 versicolor   
             3.3135            4.1 versicolor   
             3.9825            4.1 versicolor   
             3.9825            4.1 versicolor   
             3.7595            4.2 versicolor   

Petal.Length_pred   Petal.Length   Species      
             3.9825            4.2 versicolor   
             3.9825            4.2 versicolor   
             4.4285            4.2 versicolor   
             3.9825            4.3 versicolor   
             3.9825            4.3 versicolor   
             3.7595            4.4 versicolor   
             3.9825            4.4 versicolor   
             4.2055            4.4 versicolor   
             4.2055            4.4 versicolor   
             4.8745            4.5 virginica    
             3.9825            4.5 versicolor   
             4.4285            4.5 versicolor   
             4.4285            4.5 versicolor   
             4.4285            4.5 versicolor   

Petal.Length_pred   Petal.Length   Species      
             4.4285            4.5 versicolor   
             4.4285            4.5 versicolor   
             4.6515            4.5 versicolor   
             3.9825            4.6 versicolor   
             4.2055            4.6 versicolor   
             4.4285            4.6 versicolor   
             3.7595            4.7 versicolor   
             4.2055            4.7 versicolor   
             4.2055            4.7 versicolor   
             4.4285            4.7 versicolor   
             4.6515            4.7 versicolor   
             5.0975            4.8 virginica    
             5.0975            4.8 virginica    
             4.2055            4.8 versicolor   

Petal.Length_pred   Petal.Length   Species      
             5.0975            4.8 versicolor   
             5.0975            4.9 virginica    
             5.0975            4.9 virginica    
             5.5434            4.9 virginica    
             4.4285            4.9 versicolor   
             4.4285            4.9 versicolor   
             4.4285              5 virginica    
             5.3204              5 virginica    
             5.5434              5 virginica    
             4.8745              5 versicolor   
             4.4285            5.1 virginica    
             5.0975            5.1 virginica    
             5.3204            5.1 virginica    
             5.3204            5.1 virginica    

Petal.Length_pred   Petal.Length   Species      
             5.5434            5.1 virginica    
             6.2124            5.1 virginica    
             6.4354            5.1 virginica    
             4.6515            5.1 versicolor   
             5.5434            5.2 virginica    
             6.2124            5.2 virginica    
             5.3204            5.3 virginica    
             6.2124            5.3 virginica    
             5.7664            5.4 virginica    
             6.2124            5.4 virginica    
             5.0975            5.5 virginica    
             5.0975            5.5 virginica    
             5.7664            5.5 virginica    
             4.2055            5.6 virginica    

Petal.Length_pred   Petal.Length   Species     
             5.0975            5.6 virginica   
             5.7664            5.6 virginica   
             5.9894            5.6 virginica   
             6.4354            5.6 virginica   
             6.4354            5.6 virginica   
             5.7664            5.7 virginica   
             6.2124            5.7 virginica   
             6.6584            5.7 virginica   
             4.6515            5.8 virginica   
             5.0975            5.8 virginica   
             5.9894            5.8 virginica   
             5.7664            5.9 virginica   
             6.2124            5.9 virginica   
             5.0975              6 virginica   

Petal.Length_pred   Petal.Length   Species     
             6.6584              6 virginica   
             5.3204            6.1 virginica   
             6.2124            6.1 virginica   
             6.6584            6.1 virginica   
             5.0975            6.3 virginica   
             5.5434            6.4 virginica   
             5.7664            6.6 virginica   
             5.5434            6.7 virginica   
             5.9894            6.7 virginica   
             6.2124            6.9 virginica   


150 rows selected. 


---------------------------
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
10.6.2.8 rqIndexEval2関数

関数rqIndexEval2は、Oracle Autonomous Databaseで使用すると、データベース環境によって生成されたRエンジンでユーザー定義R関数を複数回実行します。

PAR_LSTパラメータを使用して、ユーザー定義R関数に引数を渡すことができます。追加の引数は、ore_parallel_flagore_service_levelなどのパラメータPAR_LSTに渡すことができます。ブール引数ore_parallel_flag (デフォルト値false)は、データ・パラレル処理でユーザー定義R関数を実行します。Autonomous Databaseでの様々なレベルのパフォーマンスおよび同時実行性は、引数ore_service_level (デフォルトのサービス・レベルLOW)で制御できます。関連項目: 特殊な制御引数

構文

rqIndexEval2(
    PAR_LST VARCHAR2,
    OUT_FMT VARCHAR2,
    TIMES_NUM NUMBER,
    SCR_NAME VARCHAR2,
    SCR_OWNER VARCHAR2 DEFAULT NULL,
    ENV_NAME VARCHAR2 DEFAULT NULL
)

パラメータ

パラメータ 説明

PAR_LST

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

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

OUT_FMT

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

  • ファンクションによって返された表の列名およびデータ型を指定するJSON文字列。イメージ・データは破棄されます。
  • 文字列'JSON'。返される表にJSON文字列であるCLOBが含まれることを指定します。

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

関連項目: 出力形式

TIMES_NUM

Rスクリプトを実行する回数。

SCR_NAME

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

SCR_OWNER

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

ENV_NAME

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

PL/SQLブロックによって、スクリプトcomputeMeanが作成され、スクリプト・リポジトリに追加されます。スクリプトがプライベートであることを指定し、同じ名前でスクリプトを上書きします。

BEGIN
    sys.rqScriptCreate('computeMean',
        'function(idx, rseed){
            set.seed(rseed)
            x <- round(runif(100,2,10),4)
            return(mean(x))}',
        v_global => FALSE,
        v_overwrite => TRUE);
END;
/

結果は次のとおりです。

PL/SQL procedure successfully completed.


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

例10-49 JSON出力

Select文を実行して、JSON出力を取得します。

%script

SELECT * FROM table(rqIndexEval2(
        par_lst => '{"rseed":99, "ore_parallel_flag":true, "ore_service_level":"MEDIUM"}',
        out_fmt => 'JSON',
        times_num => 5,
        scr_name => 'computeMean'));

結果は次のとおりです。

NAME   VALUE                                                      
       {"1":5.8977,"2":5.8977,"3":5.8977,"4":5.8977,"5":5.8977}   



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

例10-50 XML出力

Select文を実行して、XML出力を取得します。

%script

SELECT * FROM table(rqIndexEval2(
        par_lst => '{"rseed":99, "ore_parallel_flag":true, "ore_service_level":"MEDIUM"}',
        out_fmt => 'XML',
        times_num => 5,
        scr_name => 'computeMean'));

結果は次のとおりです。

NAME   VALUE                                                                              
1      <root><vector_obj><ROW-vector_obj><value>5.897744</value></ROW-vector_obj></vect   
2      <root><vector_obj><ROW-vector_obj><value>5.897744</value></ROW-vector_obj></vect   
3      <root><vector_obj><ROW-vector_obj><value>5.897744</value></ROW-vector_obj></vect   
4      <root><vector_obj><ROW-vector_obj><value>5.897744</value></ROW-vector_obj></vect   
5      <root><vector_obj><ROW-vector_obj><value>5.897744</value></ROW-vector_obj></vect   
10.6.2.9 sys.rqScriptCreateプロシージャ

sys.rqScriptCreateプロシージャは、スクリプトを作成し、それをOML4Rスクリプト・リポジトリに追加します。

構文

sys.rqScriptCreate (
    V_NAME          VARCHAR2    IN
    V_SCRIPT        CLOB        IN
    V_GLOBAL        BOOLEAN     IN     DEFAULT
    V_OVERWRITE     BOOLEAN     IN     DEFAULT)
パラメータ 説明
V_NAME OML4Rスクリプト・リポジトリ内のスクリプトの名前。
V_SCRIPT スクリプトに保存するR関数定義。
V_GLOBAL TRUEは、スクリプトがパブリックであることを示します。FALSEは、スクリプトがプライベートであることを示します。
V_OVERWRITE OML4Rスクリプト・リポジトリにV_NAMEと同じ名前のスクリプトがすでにある場合、TRUEではそのスクリプトの内容がV_SCRIPTに置き換えられ、FALSEでは置き換えられません。
10.6.2.10 sys.rqScriptDropプロシージャ

sys.rqScriptDropプロシージャは、OML4Rスクリプト・リポジトリからスクリプトを削除します。

構文

sys.rqScriptDrop (
    V_NAME          VARCHAR2    IN
    V_GLOBAL        BOOLEAN     IN     DEFAULT
    V_SILENT        BOOLEAN     IN     DEFAULT)
パラメータ 説明
V_NAME OML4Rスクリプト・リポジトリ内のスクリプトの名前。
V_GLOBAL TRUE (デフォルト)は、スクリプトがパブリックであることを示します。FALSEは、スクリプトがプライベートであることを示します。
V_SILENT FALSE (デフォルト)は、指定したRスクリプトの削除中にエラーが発生した場合、sys.rqqScriptDropによりエラー・メッセージを表示することを指定します。TRUEは、プロシージャでエラー・メッセージを表示しないことを示します。

10.6.3 非同期ジョブ

関数が非同期で実行されるとき、rqJobStatus関数とrqJobResult関数を使用して追跡できるジョブとして実行されます。

10.6.3.1 ore_async_flag引数

特殊な制御引数ore_async_flagは、ジョブを同期で実行するか非同期で実行するかを決定します。デフォルト値はfalseです。

ore_async_flag引数の設定

  • 同期モードで関数を実行するには、ore_async_flagfalseに設定します。

    同期モードでは、SQL APIはHTTPコールが終了するのを待機し、HTTPレスポンスの準備ができると戻ります。

    デフォルトでは、rq*Eval2関数は同期で実行されます。デフォルトの接続タイムアウト制限は60秒です。同期モードは、ore_async_flagが設定されていない場合、またはfalseに設定されている場合に使用されます。

  • 非同期モードで関数を実行するには、ore_async_flagtrueに設定します。

    非同期モードでは、非同期ジョブがWebサーバーに発行された直後に、SQL APIはURLを返します。URLにはジョブIDが含まれており、これを使用してジョブ・ステータスをフェッチし、後続のSQLコールを実行できます。

非同期ジョブの発行例

次のコードでは、R関数RandomRedDots2は、引数ore_async_flagをtrueに設定して非同期モードで実行されます。

%script

set long 500

SELECT * FROM table(rqEval2(
    par_lst => '{"ore_async_flag":true, "ore_graphics_flag":true, "ore_service_level":"LOW"}',
    out_fmt => NULL,
    scr_name => 'RandomRedDots2'));

結果のVALUE列には、非同期ジョブのジョブIDが含まれるURLが示されます。

NAME
--------------------------------------------------------------------------------
VALUE
-------------------------------------------------------------------------------- 
https://<host_name>/oml/api/r-scripts/v1/jobs/<job_id>
1 row selected.
10.6.3.2 rqJobStatus関数

rqJobStatus関数を使用して、非同期ジョブのステータスを調べます。ジョブが保留中の場合は、「ジョブはまだ実行中です。」を返します。ジョブが完了している場合、関数はURLを返します。

構文

FUNCTION RQSYS.rqJobStatus(
  job_id       VARCHAR2 
)
RETURN RQSYS.rqClobSet

パラメータ

パラメータ 説明
job_id

非同期ジョブのID。

次の例は、rqJobStatusコールとその出力を示しています。

SQL> select * from rqJobStatus(
       job_id => '<job id>'
);
NAME
--------------------------------------------------------------------------------
VALUE
--------------------------------------------------------------------------------
https://<host_name>/oml/api/r-scripts/v1/jobs/<job_id>/result

1 row selected.
10.6.3.3 rqJobResult関数

rqJobResult関数を使用して、ジョブ結果を返します。

構文

FUNCTION RQSYS.rqJobResult(
  job_id       VARCHAR2, 
  out_fmt      VARCHAR2 DEFAULT 'JSON'
)
RETURN SYS.AnyDataSet

パラメータ

パラメータ 説明
job_id

非同期ジョブのID。

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

次の例は、rqJobResultコールとその出力を示しています。

SQL> select * from rqJobResult(
    job_id => '<job id>',
    out_fmt => '{"val":"NUMBER","id":"NUMBER"}'
);
val id
  0.01 1
  0.02 2
  0.03 3
  0.04 4
  0.05 5
  0.06 6
  0.07 7
  0.08 8
  0.09 9
   0.1 10


10 rows selected.
10.6.3.4 非同期ジョブの例

次の例は、XML以外の出力およびXML出力を使用して非同期ジョブを発行する方法を示しています。

XML以外の出力

非同期ジョブを発行する際、JSON、PNGおよびリレーショナル出力の場合は、ジョブの発行時にOUT_FMT引数をNULLに設定します。ジョブ結果をフェッチする際は、rqJobResultコールでOUT_FMTを指定します。

rqEval2関数コールを発行して、非同期ジョブを発行します。この関数では、PAR_LST引数は、特殊な制御引数ore_async_flagでジョブを非同期に発行することを指定し、特殊な制御引数ore_graphics_flagでスクリプトでレンダリングされたイメージを取得することを指定します。

OUT_FMT引数はNULLです。SCR_NAMEパラメータは、RandomRedDots2という名前でスクリプト・リポジトリに格納されているユーザー定義R関数を指定します。

非同期コールはCLOBでジョブ・ステータスURLを返し、set long [length]をコールして完全なURLを取得できます。

%script

set long 500

SELECT * FROM table(rqEval2(
    par_lst => '{"ore_async_flag":true, "ore_graphics_flag":true, "ore_service_level":"LOW"}',
    out_fmt => NULL,
    scr_name => 'RandomRedDots2'));

出力は次のようになります。

NAME
--------------------------------------------------------------------------------
VALUE
--------------------------------------------------------------------------------  
https://<host name>/oml/api/r-scripts/v1/jobs/<job id>
1 row selected. 

rqJobStatus関数をコールするSELECT文を実行します。これにより、ジョブ結果の準備ができると、ジョブIDが含まれるリソースURLが返されます。

select * from rqJobStatus(
job_id => '<job id>');  

ジョブがまだ保留中の場合は、出力は次のようになります。

NAME
---------------------------------------------------------------------- 
VALUE 
----------------------------------------------------------------------  
job is still running
1 row selected. 

ジョブが終了すると、出力は次のようになります。

NAME
--------------------------------------------------------------------------------
VALUE
--------------------------------------------------------------------------------  
https://<host name>/oml/api/r-scripts/v1/jobs/<job id>/result
1 row selected. 

rqJobResult関数をコールするSELECT文を実行します。

OUT_FMT引数で、文字列'PNG'は、戻り値とイメージ(タイトルとイメージ・バイト)の両方を結果に含めるように指定します。


select * from rqJobResult(                
        job_id => '<job id>',
        out_fmt => 'PNG' 
);

出力は次のようになります。


---------------------------
NAME   ID   VALUE   IMAGE   
          1
      89504E470D0A1A0A0000000D49484452000001E0000001E008060000007DD4BE950000200049444154789CECDD775853E

ノート:

ここでは、出力の一部のみを示します。出力の長さを決定するには、パラメータset long [length]を使用します。

XML出力

非同期ジョブからXML出力が想定される場合は、ジョブの発行時とジョブ結果のフェッチ時に、OUT_FMT引数を'XML'に設定します。

この例では、「rqIndexEval2関数」に示した例で作成されたスクリプトRandomRedDots2を使用します。

rqEval2関数コールを発行して、非同期ジョブを発行します。この関数では、PAR_LST引数は、特殊な制御引数ore_async_flagでジョブを非同期に発行することを指定し、特殊な制御引数ore_service_levelLOWサービス・レベルを使用することを指定します。

非同期コールはCLOBでジョブ・ステータスURLを返し、set long [length]をコールして完全なURLを取得できます。

%script

set long 1000

SELECT * FROM table(rqEval2(
    par_lst => '{"ore_async_flag":true, "ore_graphics_flag":true, "ore_service_level":"LOW"}',
    out_fmt => 'XML',
    scr_name => 'RandomRedDots2'));

出力は次のようになります。

NAME
--------------------------------------------------------------------------------
VALUE
--------------------------------------------------------------------------------  
https://<host name>/oml/api/r-scripts/v1/jobs/<job id>
 
1 row selected.

rqJobStatus関数をコールするSELECT文を実行します。これにより、ジョブ結果の準備ができると、ジョブIDが含まれるリソースURLが返されます。

select * from rqJobStatus(
job_id => '<job id>' 
);
      

ジョブがまだ保留中の場合は、出力は次のようになります。

NAME
---------------------------------------------------------------------- 
VALUE
----------------------------------------------------------------------  
job is still running   
1 row selected. 

ジョブ結果の準備ができると、出力は次のようになります。

NAME
--------------------------------------------------------------------------------
VALUE
--------------------------------------------------------------------------------  
https://<host name>/oml/api/r-scripts/v1/jobs/<job id>/result
1 row selected. 

rqJobResult関数をコールするSELECT文を実行します。

OUT_FMT引数で、文字列'XML'は、返される表にXML文字列であるCLOBが含まれることを指定します。

%script

set long 1000

select * from rqJobResult(
         job_id => '<job id>',
         out_fmt => 'XML' 
);

出力は次のようになります。


---------------------------
NAME   VALUE                
<root><R-data><frame_obj><ROW-frame_obj><id>1</id><val>0.01</val></ROW-frame_obj><ROW-frame_obj><id>2</id><val>0.02</val></ROW-frame_obj><ROW-frame_obj><id>3</id><val>0.03</val></ROW-frame_obj><ROW-frame_obj><id>4</id><val>0.04</val></ROW-frame_obj><ROW-frame_obj><id>5</id><val>0.05</val></ROW-frame_obj><ROW-frame_obj><id>6</id><val>0.06</val></ROW-frame_obj><ROW-frame_obj><id>7</id><val>0.07</val></ROW-frame_obj><ROW-frame_obj><id>8</id><val>0.08</val></ROW-frame_obj><ROW-frame_obj><id>9</id><val>0.09</val></ROW-frame_obj><ROW-frame_obj><id>10</id><val>0.1</val></ROW-frame_obj></frame_obj></R-data><images><image><img src="data:image/pngbase64"><![CDATA[iVBORw0KGgoAAAANSUhEUgAAAeAAAAHgCAYAAAB91L6VAAAgAElEQVR4nOzdd3xTZfvH8U/StEmTtGUV2rKnCCjrARGZZcsegqgoKoKCqIAyHIgKylABUUFAZIuAAjIUZMkqZVVk7yl7tSTpSNP79wfqT7HjFJqctlzv16uvx6e5c873pKVXcs59rtuglFIIIYQQwqeMegcQQggh7kVSgIUQQggdSAEWQgghdCAFWAghhNCBFGAhhBBCB1KAhRBCCB1IARZCCCF0IAVYCCGE0IEUYCGEEEIHUoCFEEIIHUgBFkIIIXQgBVgIIYTQgRRgIYQQQgdSgIUQQggdSA

10.6.4 特殊な制御引数

PAR_LSTパラメータを使用して、Rスクリプトに渡される特殊な制御引数および追加の引数を指定します。

引数 構文および説明
ore.drop

構文

ore.drop: bool, true (デフォルト)

説明

入力データのオブジェクト・タイプを制御します。trueの場合、1列のdata.frameがベクターに変換されます。falseの場合、1列のdata.frameは変換されません。

ore.na.omit

構文

ore.na.omit: bool, false (デフォルト)

説明

入力データの欠損値の処理を制御します。

trueの場合、ore.drop設定に応じて、欠損値が含まれる行またはベクター要素が入力データから削除されます。

falseの場合、欠損値が含まれる行を表から省略されません。

rqRowEvalチャンクのすべての行に欠損値が含まれる場合、そのチャンクの入力データは空のdata.frameまたはベクターになります。

ore.png.*

構文

ore.png.*: numeric or character

説明

ore_graphics_flagtrueの場合、pngグラフィック・デバイス・ドライバ用の追加パラメータ。これらの引数のネーミング規則では、png関数の引数にore.png.接頭辞を追加します。たとえば、ore.png.heightを指定すると、引数heightpng関数に渡されます。

設定しない場合は、png関数に標準のデフォルト値が使用されます。

ore.characterAsFactor

構文

ore.characterAsFactor: bool, false (デフォルト)

説明

入力表の文字およびファクタの列が扱われるタイプを制御します。trueの場合、すべての文字およびファクタの列はファクタ・タイプとして扱われます。falseの場合、すべての文字およびファクタの列は文字タイプとして扱われます。関数rqGroupEval2およびrqRowEval2の場合、各パーティションはそれ自体のファクタ・レベルのみを認識し、他のパーティションのレベルは認識しません。

ore_async_flag

構文

ore_async_flag: bool, false (デフォルト)

説明

trueの場合、ジョブは非同期に発行されます。

falseの場合、ジョブは同期モードで実行されます。

ore_graphics_flag

構文

ore_graphics_flag:bool, false (デフォルト)

説明

trueの場合、サーバーはRスクリプトでレンダリングされたイメージを取得します。

falseの場合、サーバーはRスクリプトでレンダリングされたイメージを取得しません。

ore_parallel_flag

構文

ore_parallel_flag:bool, false (デフォルト)

説明

trueの場合、Rスクリプトはデータ・パラレル処理で実行されます。データ・パラレル処理は、rqRowEval2rqGroupEval2およびrqIndexEval2にのみ適用できます。

falseの場合、Rスクリプトはデータ・パラレル処理で実行されません。

ore_service_level

構文

ore_service_level : string, allowed values: 'LOW'(デフォルト), 'MEDIUM', 'HIGH'

説明

Autonomous Databaseでの様々なレベルのパフォーマンスおよび同時実行性を制御します。

10.6.5 出力フォーマット

OUT_FMTパラメータは、表関数rqEval2rqGroupEval2rqIndexEval2rqRowEval2rqTableEval2およびrqJobResultによって返される出力の形式を制御します。

出力形式は次のとおりです。

JSON

OUT_FMTJSONに設定されている場合、表関数は、JSON文字列であるCLOBが含まれる表を返します。

次の例では、rqEval2関数に関する項で作成された'RandomRedDots2'rqEval2関数をコールします。

%script

set long 500

SELECT * FROM table(rqEval2(
    par_lst => '{"ore_service_level":"LOW"}',
    out_fmt => 'JSON',
    scr_name => 'RandomRedDots2'));

---------------------------
NAME   VALUE                                                                                                                                                                                                       
       [{"val":0.01,"id":1},{"val":0.02,"id":2},{"val":0.03,"id":3},{"val":0.04,"id":4},{"val":0.05,"id":5},{"val":0.06,"id":6},{"val":0.07,"id":7},{"val":0.08,"id":8},{"val":0.09,"id":9},{"val":0.1,"id":10}]   



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

リレーショナル

列名が列タイプにマップされるJSON文字列でOUT_FMTが指定されている場合、表関数はそれを表の列に再形成してレスポンスを返します。たとえば、{"NAME":"varchar2(10)", "COUNT":"number"}でOUT_FMTが指定されている場合、出力にはVARCHAR2(10)型のNAME列およびNUMBER型のCOUNT列が含まれています。次の例では、表rqGroupEval2およびスクリプトgroupCount (「rqGroupEval2関数」で作成)を使用し、groupCount関数をコールします。

%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

XML

XMLOUT_FMTが指定されている場合、表関数は固定列が含まれる表でレスポンスを返します。出力は、2つの列で構成されています。NAME列には、行の名前が示されます。rqEval2rqTableEval2rqRowEval2関数が返す場合、NAME列値はNULLです。rqGroupEval2rqIndexEval2の場合、NAME列値はグループ/索引名です。VALUE列には、XML文字列が示されます。

XMLには構造化データとイメージの両方が含まれる可能性があり、最初に構造化Rオブジェクトまたは半構造化Rオブジェクトが返され、次にR関数により生成されたイメージが続きます。イメージはPNG表示のbase 64エンコーディングとして返されます。XML文字列にイメージを含めるには、特殊な制御引数ore_graphics_flagをtrueに設定する必要があります。

次のコードでは、R関数RandomRedDots2がスクリプト・リポジトリに作成されます。

%script

set long 500

SELECT * FROM table(rqEval2(
    par_lst => '{"ore_service_level":"LOW"}',
    out_fmt => 'XML',
    scr_name => 'RandomRedDots2'));

次の例は、構造化データとイメージの両方が結果に含まれるrqEval2関数コールのXML出力を示しています。

set long 1000

SELECT * FROM table(rqEval2(
    par_lst => '{"ore_graphics_flag":true, "ore_service_level":"LOW"}',
    out_fmt => 'XML',
    scr_name => 'RandomRedDots2'));

--------------------------------------------------------------------------------
 NAME VALUE
----------------------------------------------------------------------

<root><root><R-data><frame_obj><ROW-frame_obj><id>1</id><val>0.01</val></ROW-frame_obj><ROW-frame_obj><id>2</id><val>0.02</val></ROW-frame_obj><ROW-frame_obj><id>3</id><val>0.03</val></ROW-frame_obj><ROW-frame_obj><id>4</id><val>0.04</val>
</ROW-frame_obj><ROW-frame_obj><id>5</id><val>0.05</val></ROW-frame_obj><ROW-frame_obj><id>6</id><val>0.06</val></ROW-frame_obj><ROW-frame_obj><id>7</id><val>0.07</val></ROW-frame_obj><ROW-frame_obj><id>8</id><val>0.08</val></ROW-frame_obj>
<ROW-frame_obj><id>9</id><val>0.09</val></ROW-frame_obj><ROW-frame_obj><id>10</id><val>0.1</val></ROW-frame_obj></frame_obj></R-data><images><image><img src="data:image/pngbase64">
<![CDATA[iVBORw0KGgoAAAANSUhEUgAAAeAAAAHgCAYAAAB91L6VAAAgAElEQVR4nOzdd3hT5fvH8Xe6MzoopZS9ZE9BliiIgLKHooCgyBRRQFSGG0GUJSKKogxl42KIqCB8AQEVkD0rlL1HgTZJZ3r//gD9IXaEtkk67td15VJ6npzzOWmaO+ec5zyPQUQEpZRSSrmVl6cDKKWUUvmRFmCllFLKA7QAK6WUUh6gBVgppZTyAC3ASimllAdoAVZKKaU8QAuwUkop5QFagJVSSikP0AKslFJKeYAWYKWUUsoDtAArpZRSHqAFWCmllPIALcBKKaWUB2gBVkoppTxAC7BSSi

PNG

PNGOUT_FMTが指定されている場合、表関数は固定列(イメージ・バイト列を含む)が含まれる表でレスポンスを返します。SQL APIをコールする場合、実行されたスクリプトでレンダリングされたイメージをWebサーバーが取得できるように、特殊な制御引数ore_graphics_flagtrueに設定する必要があります。

PNG出力は、次の4つの列で構成されています。NAME列には、行の名前が示されます。rqEval2およびrqTableEval2関数が返す場合、NAME列値はNULLです。rqRowEval2rqGroupEval2rqIndexEval2の場合、NAME列値はチャンク/グループ/索引名です。ID列には、イメージのIDが示されます。VALUE列には、実行されたスクリプトの戻り値が示されます。IMAGE列は、実行されたスクリプトによってレンダリングされたPNGイメージのバイトが含まれるBLOB列です。

次の例は、rqTableEval2関数コールのPNG出力を示しています。

set long 500

SELECT * FROM table(rqTableEval2( 
    inp_nam => 'IRIS', 
    par_lst => '{"dsname":"ds-1", "ore_graphics_flag":true, "ore_service_level":"LOW"}', 
    out_fmt => 'PNG', 
    scr_name => 'buildLM'));

---------------------------
NAME   ID   VALUE   IMAGE   
          1
      89504E470D0A1A0A0000000D49484452000001E0000001E008060000007DD4BE950000200049444154789CE

ノート:

ここでは、出力の一部のみを示します。出力の長さを決定するには、パラメータset long [length]を使用します。

非同期モード出力

非同期ジョブを実行するためにore_async_flagtrueに設定する場合は、次に示すように、XML以外の結果を返すジョブに対してはOUT_FMTNULLに設定するか、XML結果を返すジョブに対してはXMLに設定します。

非同期モード: XML以外の出力

非同期ジョブを発行する際、JSON、PNGおよびリレーショナル出力の場合は、ジョブの発行時にOUT_FMTNULLに設定します。ジョブ結果をフェッチする際は、rqJobResultコールでOUT_FMTを指定します。

次の例は、非同期rqEval2関数コールからJSON出力を取得する方法を示しています。

%script

set long 500

SELECT * FROM table(rqEval2(
    par_lst => '{"ore_async_flag":true, "ore_graphics_flag":true, "ore_service_level":"LOW"}',
    out_fmt => 'NULL',
    scr_name => 'RandomRedDots2'));
NAME
--------------------------------------------------------------------
VALUE 
--------------------------------------------------------------------

https://<host name>/oml/api/r-scripts/v1/jobs/<job id>

1 row selected.
SQL> select * from rqJobStatus(
        job_id => '<job id>');
NAME
--------------------------------------------------------------------
VALUE
--------------------------------------------------------------------

https://<host name>/oml/api/r-scripts/v1/jobs/<job id>/result

1 row selected.
SQL> select * from rqJobResult(
     job_id => '<job id>',
     out_fmt => 'PNG'
     );
---------------------------
NAME   ID   VALUE   IMAGE   
          1
      89504E470D0A1A0A0000000D49484452000001E0000001E008060000007DD4BE95000020004944

ノート:

ここでは、出力の一部のみを示します。出力の長さを決定するには、パラメータset long [length]を使用します

非同期モード: XML出力

非同期ジョブからXML出力が想定される場合は、ジョブの発行時とジョブ結果のフェッチ時に、OUT_FMTXMLに設定する必要があります。

次の例は、非同期rqEval2関数コールからXML出力を取得する方法を示しています。

set long 1000

SELECT * FROM table(rqEval2(
    par_lst => '{"ore_async_flag":true, "ore_graphics_flag":true, "ore_service_level":"LOW"}',
    out_fmt => 'XML',
    scr_name => 'RandomRedDots2'));
NAME
--------------------------------------------------------------------------------
VALUE
--------------------------------------------------------------------------------
https://<host name>/oml/api/r-scripts/v1/jobs/<job id>

1 row selected.
set long 500

SELECT * FROM rqJobStatus(
    job_id => '<Job id>'
);
  2  
NAME
--------------------------------------------------------------------------------
VALUE
--------------------------------------------------------------------------------
https://<host name>/oml/api/r-scripts/v1/jobs/<job id>/result

1 row selected.

set long 1000

SELECT * FROM rqJobResult(
    job_id => '<job id>',
    out_fmt => 'XML'
);

結果は次のとおりです。


---------------------------
NAME   VALUE                
       <root><R-data><frame_obj><ROW-frame_obj><id>1</id><val>0.01</val></ROW-frame_obj><ROW-frame_obj><id>2</id><val>0.02</val></ROW-frame_obj><ROW-frame_obj><id>3</id><val>0.03</val></ROW-frame_obj><ROW-frame_obj><id>4</id><val>0.04</val></ROW-frame_obj><ROW-frame_obj><id>5</id><val>0.05</val></ROW-frame_obj><ROW-frame_obj><id>6</id><val>0.06</val></ROW-frame_obj><ROW-frame_obj><id>7</id><val>0.07</val></ROW-frame_obj><ROW-frame_obj><id>8</id><val>0.08</val></ROW-frame_obj><ROW-frame_obj><id>9</id><val>0.09</val></ROW-frame_obj><ROW-frame_obj><id>10</id><val>0.1</val></ROW-frame_obj></frame_obj></R-data><images><image><img src="data:image/pngbase64"><![CDATA[iVBORw0KGgoAAAANSUhEUgAAAeAAAAHgCAYAAAB91L6VAAAgAElEQVR4nOzdd3xTZfvH8U/StEmTtGUV2rKnCCjrARGZZcsegqgoKoKCqIAyHIgKylABUUFAZIuAAjIUZMkqZVVk7yl7tSTpSNP79wfqT7HjFJqctlzv16uvx6e5c873pKVXcs59rtuglFIIIYQQwqeMegcQQggh7kVSgIUQQggdSAEWQgghdCAFWAghhNCBFGAhhBBCB1KAhRBCCB1IARZCCCF0IAVYCCGE0IEUYCGEEEIHUoCFEEIIHUgBFkIIIXQgBVgIIYTQgRRgIYQQQgdSgIUQQggdSA