10 Embedded R Execution
OML4RのEmbedded R Executionを使用すると、データベース環境で実行されるRセッションでユーザー定義R関数(スクリプト
とも呼ばれる)を実行できます。
次の各トピックでは、Embedded R Executionについて説明します。
- Embedded R Executionについて
OML4Rでは、Embedded R Executionにより、データベースによって動的に生成および管理されるRエンジンでRスクリプトを実行できます。 - Embedded R Executionをサポートするデータストアおよびスクリプト・リポジトリ・ビュー
OML4Rには、データストアに関する情報、およびデータストア内のスクリプトおよびユーザー定義関数に関する情報を含む多数のデータベース・ビューが含まれます。これらのビューをEmbedded R Execution APIとともに使用して、データストアおよびそのコンテンツを操作できます。 - Embedded R Execution用のRインタフェース
Oracle Machine Learning for Rには、Oracle Databaseに埋め込まれている1つ以上のRエンジンで実行するRスクリプトをコールする関数があります。 - Embedded R Execution用のSQLインタフェース
Oracle Machine Learning for RのEmbedded Rの実行用のSQLインタフェースでは、本番データベースのアプリケーションでR関数を実行できます。 - オンプレミス・データベースでのEmbedded R Execution用のSQL API
OML4R SQL APIには、OML4R Serverデータベース上の1つ以上の埋込みRセッションでR関数を実行するためのSQL表関数と、OML4Rデータストアを管理し、OML4Rスクリプト・リポジトリ内のスクリプトを管理するためのPL/SQLプロシージャが含まれます。 - Autonomous DatabaseでのEmbedded R Execution用のSQL API
Autonomous DatabaseでのEmbedded R Execution用のSQL APIは、認可トークンの設定、アクセス制御リスト(ACL)権限の管理、Rスクリプトの実行およびジョブの同期実行と非同期実行のためのSQLインタフェースを提供します。
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の実行について説明します。
- Embedded R Executionの利点
Embedded R Executionには次の利点があります。 - Embedded R Execution用のAPI
Oracle Machine Learning for Rには、Embedded R Execution用のR、SQLおよびRESTインタフェースが用意されています。 - パラレル実行のサポート
Oracle Machine Learning for RのEmbedded R Execution関数の一部では、データベースでのパラレル実行の使用がサポートされています。
親トピック: Embedded R Execution
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対応のツールと統合できます。
親トピック: Embedded R Executionについて
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.grant |
rqGrant |
データストアまたはスクリプトへの読取りアクセス権を付与します。 |
ore.revoke |
rqRevoke |
データストアまたはスクリプトへの読取りアクセス権を取り消します。 |
|
|
指定されたR関数を、指定された名前でOML4Rスクリプト・リポジトリに追加します。 |
|
|
指定されたR関数をOML4Rスクリプト・リポジトリから削除します。 |
ore.scriptList |
ALL_RQ_SCRIPTS
|
スクリプトに関する情報をリストします。 |
ore.scriptLoad |
該当するものはありません。 | スクリプトのR関数をR環境にロードします。 |
親トピック: Embedded R Executionについて
10.1.3 パラレル実行のサポート
Oracle Machine Learning for RのEmbedded R Execution関数の一部では、データベースでのパラレル実行の使用がサポートされています。
関数ore.groupApply
、ore.rowApply
、rqGroupEval2
およびrqRowEval2
はデータ・パラレル実行をサポートし、ore.indexApply
はタスク・パラレル実行をサポートします。このパラレル実行機能によって、Oracle Exadataデータベース・マシンなどの高パフォーマンスのコンピューティング・ハードウェアをスクリプトで利用できます。
関数ore.groupApply
、ore.rowApply
およびore.indexApply
のparallel
引数には、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でサポートされているデータ・パラレル実行およびタスク・パラレル実行を利用できます。
親トピック: 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スクリプト・リポジトリ内のスクリプトを示します。 |
- ALL_RQ_DATASTORES
ALL_RQ_DATASTORES
は、現行のユーザーが使用可能なデータストアを示します。 - ALL_RQ_SCRIPTS
ALL_RQ_SCRIPTS
は、現行のユーザーが使用可能な、OML4Rスクリプト・リポジトリ内のスクリプトを示します。 - RQUSER_DATASTORECONTENTS
RQUSER_DATASTORECONTENTS
には、Oracle Machine Learning for Rのデータストアの内容に関する情報が格納されます。 - RQUSER_DATASTORELIST
RQUSER_DATASTORELIST
には、Oracle Machine Learning for Rのデータストアに関する情報が格納されます。 - USER_RQ_DATASTORE_PRIVS
USER_RQ_DATASTORE_PRIVS
は、データストア、および現行のユーザーが読取りアクセス権を付与したユーザーを示します。 - USER_RQ_DATASTORES
USER_RQ_DATASTORES
は、現行のユーザーが作成したデータストアを示します。 - USER_RQ_SCRIPT_PRIVS
USER_RQ_SCRIPT_PRIVS
は、現行のユーザーが読取りアクセス権を付与したOML4Rスクリプト・リポジトリ内のスクリプトおよびアクセス権が付与されたユーザーを示します。 - USER_RQ_SCRIPTS
USER_RQ_SCRIPTS
は、現行のユーザーが所有している、OML4Rスクリプト・リポジトリ内のスクリプトを示します。
親トピック: Embedded R Execution
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 | 説明 |
---|---|---|---|
|
VARCHAR2(128) |
NOT NULL |
データストアの名前。 |
|
VARCHAR2(128) |
NOT NULL |
データストア内のオブジェクトの名前。 |
CLASS |
VARCHAR2(128) |
NOT NULL |
オブジェクトのRクラス。 |
|
NUMBER |
NOT NULL |
オブジェクトのサイズ。 |
|
NUMBER |
NOT NULL |
オブジェクトのサイズ。 |
NROW |
NUMBER |
NULL 許可
|
オブジェクト内の行数。 |
|
NUMBER |
NULL 許可
|
オブジェクト内の列数。 |
10.2.4 RQUSER_DATASTORELIST
RQUSER_DATASTORELIST
には、Oracle Machine Learning for Rのデータストアに関する情報が格納されます。
列 | データ型 | Null | 説明 |
---|---|---|---|
DSNAME |
|
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 |
|
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.3 埋込みRの実行用のRインタフェース
Oracle Machine Learning for Rには、Oracle Databaseに埋め込まれている1つ以上のRエンジンで実行されるRスクリプトをコールする関数があります。
他には、R関数の作成およびスクリプトとしてのOML4Rスクリプト・リポジトリへの格納、スクリプトへの読取りアクセス権の付与または取消し、使用可能なスクリプトのリスト、R環境へのスクリプト関数のロード、またはリポジトリからのスクリプトの削除を行う関数があります。この項では、次の各トピックでこれらの関数について説明します。
- スクリプトを実行する関数の引数
Oracle Machine Learning for RのEmbedded R Execution関数のore.doEval
、ore.tableApply
、ore.groupApply
、ore.rowApply
およびore.indexApply
には、これらの関数の一部またはすべてに共通の引数があります。 - Rでのスクリプトの管理
Embedded R Execution関数で、OML4Rスクリプト・リポジトリにスクリプトとして格納されているR関数をコールできます。このトピックで説明するR関数を使用すると、スクリプトを作成および管理できます。 - ore.doEval関数の使用
ore.doEval
関数は、入力関数によって生成されたデータを使用して指定された入力関数を実行します。 - ore.tableApply関数の使用
ore.tableApply
関数は、入力データとしてore.frame
を指定してRスクリプトをコールします。 - ore.groupApply関数の使用
ore.groupApply
関数は、入力データとしてore.frame
を指定してRスクリプトをコールします。 - ore.rowApply関数の使用
ore.rowApply
関数は、入力データとしてore.frame
を指定してRスクリプトをコールします。 - ore.indexApply関数の使用
ore.indexApply
関数は、入力関数によって生成されたデータを使用して指定されたユーザー定義の入力関数を実行します。
親トピック: Embedded R Execution
10.3.1 スクリプトを実行する関数の引数
Oracle Machine Learning for RのEmbedded R Execution関数であるore.doEval
、ore.tableApply
、ore.groupApply
、ore.rowApply
およびore.indexApply
には、これらの関数の一部または全部に共通の引数があります。
一部の関数には、その関数に固有の引数もあります。次の各トピックでは、これらの引数について説明します。
- 実行するための入力関数
Embedded R Execution関数にはすべて、スクリプトの実行時に適用するR関数が必要です。 - オプションの制御引数
Embedded R Execution関数はすべて、指定が可能または不可能なオプションの引数を取ります。 - 戻り値の構造
Embedded R Execution関数のすべてに適用されるもう1つの引数にFUN.VALUE
があります。 - 入力データ
ore.doEval
関数およびore.indexApply
関数は、データベースから自動的にデータを受け取りません。 - パラレル実行
parallel
引数は、入力関数のEmbedded R Executionで使用する並列レベルを指定します。 - 固有の引数
関数ore.groupApply
、ore.indexApply
およびore.rowApply
は、それぞれの関数に固有の引数を取ります。
親トピック: 埋込みRの実行用のRインタフェース
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.glm
、ore.lm
、ore.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.frame
がvector
に変換されます。デフォルト値はTRUE
です。 -
ore.envAsEmptyenv
は、シリアライズ中にオブジェクト内の参照される環境を空の環境で置き換えるかどうかを制御します。一部のタイプの入力パラメータおよび戻りオブジェクト(list
やformula
など)は、データベースに保存される前にシリアライズされます。制御引数の値がTRUE
の場合、オブジェクト内の参照される環境は親が.GlobalEnv
である空の環境で置き換えられ、参照される元の環境内のオブジェクトはシリアライズされません。これにより、シリアライズされるオブジェクトのサイズを大幅に削減できる場合があります。制御引数の値がFALSE
の場合、参照される環境内のすべてのオブジェクトがシリアライズされますが、後からシリアライズ解除してリカバリすることができます。デフォルト値は、グローバル・オプションore.envAsEmptyenv
によって決定されます。 -
ore.na.omit
入力データの欠損値の処理を制御します。ore.na.omit = TRUE
を指定した場合、欠損値を含む行またはベクター要素(ore.drop
設定に応じて)が入力データから削除されます。チャンクのすべての行に欠損値がある場合、そのチャンクの入力データは空のdata.frame
またはvector
になります。デフォルト値はFALSE
です。 -
ore.graphics
は、グラフィカル・ドライバを起動して画像を検索するかどうかを制御します。デフォルト値はTRUE
です。 -
ore.png.*
には、ore.graphics
がTRUE
の場合に、png
グラフィック・ドライバの追加引数を指定します。これらの引数のネーミング規則では、png
関数の引数にore.png.
接頭辞を追加します。たとえば、ore.png.height
を指定すると、引数height
がpng
関数に渡されます。設定しない場合は、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.groupApply
、ore.indexApply
およびore.rowApply
の各関数はore.list
オブジェクトを返します。ただし、data.frame
またはore.frame
にFUN.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.tableApply
、ore.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.groupApply
、ore.indexApply
およびore.rowApply
の各関数は、parallel
引数を取ります。
親トピック: スクリプトを実行する関数の引数
10.3.1.6 固有の引数
関数ore.groupApply
、ore.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.scriptCreate
はNULL
を返します。
スクリプトへの読取りアクセス権の付与または取消し
スクリプトの作成者は、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 |
スクリプトのタイプとして、次のいずれかを指定できます。
|
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.scriptDrop
はNULL
を返します。
例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}
関連項目:
- 実行するための入力関数
ore.scriptCreate
およびore.scriptDrop
の他の使用例は、例10-10を参照してください。- SQLでのスクリプトの管理
親トピック: 埋込みRの実行用のRインタフェース
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-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-2のRandomRedDots
関数を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-2のRandomRedDots
関数と似ているが、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))
出力は、次のようなものです。
表10-5 data.frame: 1 x 1
x |
---|
<chr> |
Hello, world |
表10-6 data.frame: 1 x 1
x |
---|
<chr> |
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
親トピック: 埋込みRの実行用のRインタフェース
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")] } |
この例のリスト
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
親トピック: 埋込みRの実行用のRインタフェース
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
関数の使用例は、次の各項で説明します。
- 単一列へのパーティション化
この例では、ore.groupApply
関数を使用して、データを単一列にパーティション化します。 - 複数列へのパーティション化
この例では、ore.groupApply
関数を使用して、データを複数列にパーティション化します。
親トピック: 埋込みRの実行用のRインタフェース
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
親トピック: ore.groupApply関数の使用
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) *
親トピック: ore.groupApply関数の使用
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
を作成します。 -
IRIS
をIRIS_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 |
親トピック: 埋込みRの実行用のRインタフェース
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
オブジェクトを返します。
- ore.indexApply関数の簡単な使用例
この例では、ore.indexApply
をコールし、入力関数を並行して5回実行することを指定します。 - 列並行の使用例
この例では、Rのsummary
関数を使用して、iris
データセットの最初の4つの数値列でサマリー統計を並行して計算します。 - シミュレーションの使用例
ore.indexApply
関数をシミュレーションで使用することで、Oracle Exadata Database Machineなどの高パフォーマンスのコンピューティング・ハードウェアを利用できます。
親トピック: 埋込みRの実行用のRインタフェース
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"
親トピック: ore.indexApply関数の使用
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
親トピック: ore.indexApply関数の使用
10.3.7.3 シミュレーションの使用例
ore.indexApply
関数をシミュレーションで使用しすることで、Oracle Exadataデータベース・マシンなどの高パフォーマンスのコンピューティング・ハードウェアを利用できます。
例10-14 シミュレーションでのore.indexApply関数の使用
この例では、ランダムな正規分布の複数のサンプルを使用してサマリー統計の分布を比較します。各シミュレーションは、データベースの別個のRエンジンで、データベースで許可された並列度まで並列に実行されます。この例では、サンプル・サイズの変数、乱数値の平均および標準偏差および実行するシミュレーションの数を定義します。この例では、num.simulations
をore.indexApply
関数の最初の引数として指定します。ore.indexApply
関数は、num.simulations
をindex
引数としてユーザー定義の関数に渡します。この入力関数はその後、各入力関数の呼出しで異なる乱数値のセットが生成されるように、索引に基づいて乱数シードを設定します。
次に、入力関数は、rnorm
関数を使用してsample.size
ランダムな標準値を生成します。乱数のベクターでsummary
関数をコールし、返される結果としてdata.frame
を準備します。ore.indexApply
関数には、シミュレーションの結合された結果を構成するore.frame
を返すように、FUN.VALUE
引数を指定します。res
変数は、ore.indexApply
関数によって返されるore.frame
を取得します。
サンプルの分布を取得するために、この例では、ore.pull
関数を使用した結果であるdata.frame
でboxplot
関数をコールし、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))
親トピック: ore.indexApply関数の使用
10.4 埋込みRの実行用のSQLインタフェース
Oracle Machine Learning for RのEmbedded R Execution用のSQLインタフェースでは、本番データベースのアプリケーションでR関数を実行できます。
SQLインタフェースには、次のアクションのためのプロシージャがあります。
-
OML4Rスクリプト・リポジトリに対するスクリプトの追加および削除
-
所有者による他のユーザーに対するスクリプトへの読取りアクセス権の付与または取消し
-
埋込みRセッションでのRスクリプトの実行
-
OML4Rデータストアの削除
データ・ディクショナリ・ビューは、スクリプトおよびデータストアに関する情報を提供します。
このSQLインタフェースについては、次のトピックで説明しています。
- Oracle Machine Learning for RのSQL表関数について
OML4Rでは、埋込みRの実行用のRインタフェース関数のほとんどに相当するSQL表関数が提供されています。 - SQLでのスクリプトの管理
このトピックでは、Rスクリプトを作成および管理するためのPL/SQLプロシージャとOracle Databaseデータ・ディクショナリ・ビューを紹介します。 - SQLでのデータストアの管理
Oracle Machine Learning for Rには、SQLでデータストアの基本的な管理を行うためのPL/SQLプロシージャおよびOracle Databaseデータ・ディクショナリ・ビューが用意されています。
親トピック: Embedded R Execution
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表関数の一般的な側面について説明します。
- SQL表関数のパラメータ
SQL表関数の中には、共通のパラメータを持つものもあれば、その関数に固有のパラメータを持つものもあります。 - SQL表関数の戻り値
Oracle Machine Learning for RのSQL表関数は、表を返します。 - Embedded R ExecutionでのOracle Machine Learning for Rへの接続
Embedded R Execution中にOracle Databaseサーバー上のOML4Rへの接続を確立するには、パラメータ・リストに制御引数ore.connect
を指定できます。
親トピック: 埋込みRの実行用のSQLインタフェース
10.4.1.1 SQL表関数のパラメータ
SQL表関数の中には、共通のパラメータを持つものもあれば、その関数に固有のパラメータを持つものもあります。
SQL表関数のパラメータは次のとおりです。
表10-12 SQL表関数のパラメータ
パラメータ | 説明 |
---|---|
|
SCR_NAME パラメータで指定されたR関数に渡すデータを指定する表またはビューの名前。別のユーザーが所有するテーブルまたはビューを使用する場合は、<owner name>.<table/view name>という形式を使用します。指定された表またはビューに対する読取りアクセス権が必要です。
ノート: |
|
SCR_NAMEパラメータで指定されたユーザー定義R関数に渡す追加パラメータが含まれるJSON文字列。oreで始まる特殊な制御引数は、SCR_NAMEで指定された関数に渡されず、関数の呼出し前後の動作を制御します。たとえば、欠損値が含まれる行を入力表から省略するには、 |
|
出力表の定義。この引数の値は、 ファンクションによって返される出力の形式。 次のいずれかになります。
関連項目: 出力形式 |
|
|
|
|
|
OML4Rスクリプト・リポジトリ内のスクリプトの名前。 |
|
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を持つ表が返されます。表には、列名name
、id
および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;
/
親トピック: 埋込みRの実行用のSQLインタフェース
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 |
データストアが付与可能かどうかを含め、現行のユーザーが所有しているデータストアを示します。 |
親トピック: 埋込みRの実行用のSQLインタフェース
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について説明します。
- rqDropDataStoreプロシージャ
rqDropDataStore
プロシージャは、Oracle Databaseスキーマからデータストアを削除します。 - rqEval関数
rqEval
関数は、EXP_NAM
パラメータで指定されているスクリプト内のR関数を実行します。 - rqGrantプロシージャ
rqGrant
プロシージャは、OML4RのデータストアまたはOML4Rスクリプト・リポジトリ内のスクリプトへの読取りアクセス権を付与します。 - rqGroupEval関数
rqGroupEval
関数は、グループ化列を識別するユーザー定義関数です。 - rqRevokeプロシージャ
rqRevoke
プロシージャは、OML4RのデータストアまたはOML4Rスクリプト・リポジトリ内のスクリプトへの読取りアクセス権を取り消します。 - rqRowEval関数
rqRowEval
関数は、EXP_NAM
パラメータで指定されているスクリプト内のR関数を実行します。 - rqTableEval関数
rqTableEval
関数は、EXP_NAM
パラメータで指定されているスクリプト内のR関数を実行します。 - sys.rqScriptCreateプロシージャ
sys.rqScriptCreate
プロシージャは、スクリプトを作成し、それをOML4Rスクリプト・リポジトリに追加します。 - sys.rqScriptDropプロシージャ
sys.rqScriptDrop
プロシージャは、OML4Rスクリプト・リポジトリからスクリプトを削除します。
親トピック: Embedded R Execution
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)
パラメータ
パラメータ | 説明 |
---|---|
|
|
|
次のうちの1つ。
|
|
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)
パラメータ
パラメータ | 説明 |
---|---|
|
|
|
R関数に渡す引数値を含むカーソル。 |
|
次のうちの1つ。
|
|
データのパーティショニングに使用するグループ化列の名前。 |
|
OML4Rスクリプト・リポジトリ内のスクリプトの名前。 |
戻り値
ユーザー定義のrqGroupEval
関数は、OUT_QRY
パラメータ値で指定された構造を持つ表を返します。
例
この例に示すPL/SQLブロックでは、スクリプトmyC5.0Function
がOML4Rスクリプト・リポジトリに存在しないようにするために、このスクリプトを削除します。その後、関数を作成し、それをスクリプト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関数のパラメータ
パラメータ | 説明 |
---|---|
|
|
|
R関数に渡す引数値を含むカーソル。 |
|
次のうちの1つ。
|
|
R関数の各呼出しに含める行数。 |
|
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関数のパラメータ
パラメータ | 説明 |
---|---|
|
|
|
入力関数に渡す引数値を含むカーソル。 |
|
次のうちの1つ。
|
|
OML4Rスクリプト・リポジトリ内のスクリプトの名前。 |
戻り値
関数rqTableEval
は、OUT_QRY
パラメータ値で指定されている構造を持つ表を返します。
例
この例の最初にあるPL/SQLブロックでは、スクリプトmyNaiveBayesModel
がOML4Rスクリプト・リポジトリに存在しないようにするために、このスクリプトを削除します。次に、関数を作成して、それをスクリプト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スクリプト・リポジトリに と同じ名前のスクリプトがすでにある場合、TRUE ではそのスクリプトの内容がV_SCRIPT に置き換えられ、 では置き換えられません。
|
関連トピック
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インタフェースを提供します。
次の各トピックでは、SQL APIについて説明します。
- アクセスおよび認可のプロシージャと関数
ネットワーク・アクセス制御リスト(ACL) APIを使用して、データベースから外部ネットワーク・サービスおよびリソースへのユーザーによるアクセスを制御します。トークン・ストアAPIを使用して、クラウド・ホストによって発行された認可トークンを保持し、後続のSQLコールで使用できるようにします。 - Embedded R Execution関数(Autonomous Database)
次の各トピックでは、Autonomous Database関数でのEmbedded R Execution用のSQL APIについて説明します。 - 非同期ジョブ
関数が非同期で実行されるとき、rqJobStatus
関数とrqJobResult
関数を使用して追跡できるジョブとして実行されます。 - 特殊な制御引数
PAR_LST
パラメータを使用して、Rスクリプトに渡される特殊な制御引数および追加の引数を指定します。 - 出力形式
OUT_FMT
パラメータは、表関数rqEval2
、rqGroupEval2
、rqIndexEval2
、rqRowEval2
、rqTableEval2
およびrqJobResultによって返される出力の形式を制御します。
親トピック: Embedded R Execution
10.6.1 アクセスおよび認可のプロシージャと関数
ネットワーク・アクセス制御リスト(ACL) APIを使用して、データベースから外部ネットワーク・サービスおよびリソースへのユーザーによるアクセスを制御します。トークン・ストアAPIを使用して、クラウド・ホストによって発行された認可トークンを保持し、後続のSQLコールで使用できるようにします。
次を使用してACL権限を管理します。ADMIN
ユーザーが必要です。
次を使用して認可トークンを管理します。
ワークフロー
Autonomous DatabaseでEmbedded R Execution用のSQL APIを使用するための一般的なワークフローは次のとおりです。
-
ADMIN
ユーザーとしてPDBに接続し、ルート・ドメインがadb.us-region-1.oraclecloudapps.com
であるクラウド・ホストのACLリストに通常のユーザーOMLUSER
を追加します。exec rqAppendHostAce('OMLUSER','adb.us-region-1.oraclecloudapps.com');
-
OML Rest URLは、プロビジョニングされているOracle Autonomous Databaseから取得できます。
- Oracle Cloud Infrastructureアカウントにサインインします。OCIユーザー名とパスワードが必要です。
- ハンバーガー・メニューをクリックし、プロビジョニングされているAutonomous Databaseインスタンスを選択します。Autonomous Databaseのプロビジョニングの詳細は、Oracle Autonomous Databaseのプロビジョニングを参照してください。
- 「データベース・アクション」をクリックします。
-
「データベース・アクション」ページをスクロール・ダウンし、「関連サービス」タイルで「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
はルート・ドメインです
-
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
とともにトークンの有効期限が切れたことを示すメッセージを返します -
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.
- rqAppendHostACEプロシージャ
rqAppendHostACE
プロシージャは、アクセス制御エントリ(ACE)をクラウド・ホストのアクセス制御リスト(ACL)に追加します。ACLはデータベースからクラウド・ホストへのアクセスを制御し、ACEは指定されたユーザー名に付与される接続権限を指定します。 - rqGetHostACE関数
rqGetHostACE
関数は、指定されたユーザーの既存のホスト・アクセス制御エントリ(ACE)を取得します。指定されたユーザーのホストACEが存在しない場合は、例外が発生します。 - rqRemoveHostACEプロシージャ
- rqSetAuthTokenプロシージャ
rqSetAuthToken
プロシージャは、トークン・ストアにアクセス・トークンを設定します。 - rqIsTokenSet関数
rqIsTokenSet
関数は、認可トークンが設定されているかどうかを返します。
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について説明します。
- rqGrant関数
このトピックでは、Oracle Autonomous Databaseで使用される際のrqGrant
関数について説明します。 - rqRevokeプロシージャ
rqRevoke
プロシージャは、OML4RのデータストアまたはOML4Rスクリプト・リポジトリ内のスクリプトへの読取りアクセス権を取り消します。 - rqListEnvs関数
関数rqListEnvs
は、Oracle Autonomous Databaseで使用すると、オブジェクト・ストレージに保存されている環境をリストします。 - rqEval2関数
関数rqEval2
は、Oracle Autonomous Databaseで使用すると、データを明示的に取得するか、関数に対して外部データが自動的にロードされるユーザー定義R関数を実行します。 - rqTableEval2関数
関数rqTableEval2
は、SCR_NAME
パラメータで指定されたスクリプト内のユーザー定義R関数を実行します。 - rqRowEval2関数
関数rqRowEval2
は、Oracle Autonomous Databaseで使用すると、データを一連の行にチャンク化した後、各チャンクに対してユーザー定義R関数を実行します。 - rqGroupEval2関数
関数rqGroupEval2
は、Oracle Autonomous Databaseで使用すると、データを1つ以上の列でグループ化し、各グループに対してユーザー定義R関数を実行します。 - rqIndexEval2関数
関数rqIndexEval2
は、Oracle Autonomous Databaseで使用すると、データベース環境によって生成されたRエンジンでユーザー定義R関数を複数回実行します。 - sys.rqScriptCreateプロシージャ
sys.rqScriptCreate
プロシージャは、スクリプトを作成し、それをOML4Rスクリプト・リポジトリに追加します。 - sys.rqScriptDropプロシージャ
sys.rqScriptDrop
プロシージャは、OML4Rスクリプト・リポジトリからスクリプトを削除します。
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
)
パラメータ
パラメータ | 説明 |
---|---|
|
たとえば、欠損値が含まれる行を入力表から省略するには、'{"ore.na.omit":true}'を使用します。 関連項目: 特殊な制御引数。 |
|
ファンクションによって返される出力の形式。次のいずれかになります。
関連項目: 出力形式。 |
|
OML4Rスクリプト・リポジトリ内のユーザー定義R関数の名前。 |
SCR_OWNER |
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_level
でLOW
サービス・レベルを使用することを指定します。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関数のパラメータ
パラメータ | 説明 |
---|---|
|
SCR_NAMEパラメータで指定されたR関数に渡すデータを指定する表またはビューの名前。別のユーザーが所有する表またはビューを使用する場合は、 |
|
SCR_NAMEパラメータで指定されたユーザー定義R関数に渡す追加パラメータが含まれるJSON文字列。 たとえば、1列の入力data.frameをベクターに変換することを指定するには、次を使用します。
関連項目: 特殊な制御引数。 |
|
ファンクションによって返される出力の形式。次のいずれかになります。
関連項目: 出力形式。 |
|
OML4Rスクリプト・リポジトリ内のユーザー定義R関数の名前。 |
|
Rスクリプトの所有者。デフォルト値は |
|
指定されたユーザー定義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関数のパラメータ
パラメータ | 説明 |
---|---|
|
指定された表またはビューに対する読取りアクセス権が必要です。 |
|
たとえば、R関数でレンダリングされたイメージを取得するには、次を使用します。
関連項目: 特殊な制御引数。 |
|
ファンクションによって返される出力の形式。次のいずれかになります。
関連項目: 出力形式。 |
|
チャンク内の行の数。Rスクリプトは各チャンクで実行されます。 |
|
OML4Rスクリプト・リポジトリ内のユーザー定義R関数の名前。 |
|
登録済Rスクリプトの所有者。デフォルト値はNULL です。NULL の場合、ユーザーのスクリプト・リポジトリでRスクリプトを検索します。
|
|
指定されたユーザー定義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
)
パラメータ
パラメータ | 説明 |
---|---|
|
SCR_NAMEパラメータで指定されたR関数に渡すデータを指定する表またはビューの名前。別のユーザーが所有する表またはビューを使用する場合は、次の形式を使用します:
指定された表またはビューに対する読取りアクセス権が必要です。 |
|
たとえば、データ・パラレル処理でR関数を実行するには、次を使用します。
関連項目: 特殊な制御引数 |
|
ファンクションによって返される出力の形式。次のいずれかになります。
関連項目: 出力形式。 |
|
データのパーティション化に使用するグループ化列の名前。複数の列を区切るには、カンマを使用します。たとえば、
|
|
OML4Rスクリプト・リポジトリ内のユーザー定義R関数の名前。 |
|
登録済Rスクリプトの所有者。デフォルト値はNULL です。NULL の場合、ユーザーのスクリプト・リポジトリでRスクリプトを検索します。
|
|
指定されたユーザー定義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_level
でMEDIUM
サービス・レベルを使用することを指定し、特殊な制御引数ore_parallel_flag
をtrue
に設定します。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_flag
、ore_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
)
パラメータ
パラメータ | 説明 |
---|---|
|
関連項目: 特殊な制御引数。 |
|
ファンクションによって返される出力の形式。次のいずれかになります。
関連項目: 出力形式 |
TIMES_NUM |
Rスクリプトを実行する回数。 |
|
OML4Rスクリプト・リポジトリ内のユーザー定義R関数の名前。 |
|
登録済Rスクリプトの所有者。デフォルト値は |
|
指定されたユーザー定義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スクリプト・リポジトリに と同じ名前のスクリプトがすでにある場合、TRUE ではそのスクリプトの内容がV_SCRIPT に置き換えられ、 では置き換えられません。
|
関連トピック
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
関数を使用して追跡できるジョブとして実行されます。
- ore_async_flag引数
特殊な制御引数ore_async_flag
は、ジョブを同期で実行するか非同期で実行するかを決定します。デフォルト値はfalseです。 - rqJobStatus関数
rqJobStatus
関数を使用して、非同期ジョブのステータスを調べます。ジョブが保留中の場合は、「ジョブはまだ実行中です。」
を返します。ジョブが完了している場合、関数はURLを返します。 - rqJobResult関数
rqJobResult
関数を使用して、ジョブ結果を返します。 - 非同期ジョブの例
次の例は、XML以外の出力およびXML出力を使用して非同期ジョブを発行する方法を示しています。
10.6.3.1 ore_async_flag引数
特殊な制御引数ore_async_flag
は、ジョブを同期で実行するか非同期で実行するかを決定します。デフォルト値はfalseです。
ore_async_flag
引数の設定
-
同期モードで関数を実行するには、
ore_async_flag
をfalse
に設定します。同期モードでは、SQL APIはHTTPコールが終了するのを待機し、HTTPレスポンスの準備ができると戻ります。
デフォルトでは、
rq*Eval2
関数は同期で実行されます。デフォルトの接続タイムアウト制限は60秒です。同期モードは、ore_async_flag
が設定されていない場合、またはfalse
に設定されている場合に使用されます。 -
非同期モードで関数を実行するには、
ore_async_flag
をtrue
に設定します。非同期モードでは、非同期ジョブが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 |
ファンクションによって返される出力の形式。次のいずれかになります。
|
例
次の例は、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_level
でLOW
サービス・レベルを使用することを指定します。
非同期コールは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.na.omit |
構文
説明 入力データの欠損値の処理を制御します。
|
ore.png.* |
構文
説明
設定しない場合は、 |
ore.characterAsFactor |
構文
説明 入力表の文字およびファクタの列が扱われるタイプを制御します。 |
ore_async_flag |
構文 説明
|
ore_graphics_flag |
構文 説明
|
ore_parallel_flag |
構文 説明
|
ore_service_level |
構文
説明 Autonomous Databaseでの様々なレベルのパフォーマンスおよび同時実行性を制御します。 |
10.6.5 出力フォーマット
OUT_FMT
パラメータは、表関数rqEval2
、rqGroupEval2
、rqIndexEval2
、rqRowEval2
、rqTableEval2
およびrqJobResultによって返される出力の形式を制御します。
出力形式は次のとおりです。
JSON
OUT_FMT
がJSON
に設定されている場合、表関数は、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
XML
でOUT_FMT
が指定されている場合、表関数は固定列が含まれる表でレスポンスを返します。出力は、2つの列で構成されています。NAME
列には、行の名前が示されます。rqEval2
、rqTableEval2
、rqRowEval2
関数が返す場合、NAME
列値はNULL
です。rqGroupEval2
、rqIndexEval2
の場合、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
PNG
でOUT_FMT
が指定されている場合、表関数は固定列(イメージ・バイト列を含む)が含まれる表でレスポンスを返します。SQL APIをコールする場合、実行されたスクリプトでレンダリングされたイメージをWebサーバーが取得できるように、特殊な制御引数ore_graphics_flag
をtrue
に設定する必要があります。
PNG出力は、次の4つの列で構成されています。NAME
列には、行の名前が示されます。rqEval2
およびrqTableEval2
関数が返す場合、NAME
列値はNULL
です。rqRowEval2
、rqGroupEval2
、rqIndexEval2
の場合、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_flag
をtrue
に設定する場合は、次に示すように、XML以外の結果を返すジョブに対してはOUT_FMT
をNULL
に設定するか、XML結果を返すジョブに対してはXMLに設定します。
非同期モード: XML以外の出力
非同期ジョブを発行する際、JSON、PNGおよびリレーショナル出力の場合は、ジョブの発行時にOUT_FMT
をNULL
に設定します。ジョブ結果をフェッチする際は、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_FMT
をXML
に設定する必要があります。
次の例は、非同期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