Oracle R Enterpriseには、Oracle Databaseインスタンスのデータを直接操作するために使用できるオーバーロードされたオープン・ソースRメソッドがあります。このメソッドおよび関数は、R関数をSQLに変換する透過層を実装するパッケージに含まれています。
Oracle R Enterpriseの透過層パッケージおよびRをSQLに変換する際の制限について、次の各項で説明します。
Oracle R Enterpriseの透過層は、OREbase
、OREgraphics
およびOREstats
のパッケージで実装されます。これらのOracle R Enterpriseパッケージには、オープン・ソースRのbase
、graphics
およびstats
のパッケージに関数のオーバーロードされたメソッドがそれぞれ含まれています。また、Oracle R Enterpriseパッケージには、一部のオープン・ソースR関数のOracle R Enterprise版も含まれています。
これらのパッケージのメソッドおよび関数を使用することで、Oracle Databaseインスタンスのデータを指定するRオブジェクトを作成できます。そのようなオブジェクトを使用するR式を実行すると、メソッドおよび関数はSQL問合せを透過的に生成してデータベースに送信します。その後、データベースはその問合せを実行して、操作の結果をRオブジェクトとして返します。
データベース表またはビューは、data.frame
のサブクラスであるore.frame
オブジェクトで表されます。その他のOracle R Enterpriseクラスは、ore.vector
、vector
などの対応するRクラスから継承されます。Oracle R Enterpriseは、Oracle Databaseのデータ型をOracle R Enterpriseのクラスに(NUMBER
をore.integer
に)マップします。
透過層メソッドおよび関数を使用して、分析用のデータベース常駐データを準備できます。次に、他のOracle R Enterpriseパッケージの関数を使用して、モデルを構築および適合し、それを使用してデータをスコアリングできます。大規模なデータセットでは、Oracle Databaseに埋め込まれたRエンジンを使用してモデリングおよびスコアリングを実行できます。
関連項目:
Oracle R Enterpriseデータ型とオブジェクト・マッピングおよびR、Oracle R EnterpriseおよびSQLのデータ型およびオブジェクトの対応の詳細は、「Rのデータ型およびクラスの透過層サポート」を参照してください
例1-2 Rでの種ごとの花弁の長さの平均の調査
この例では、SQLへのR関数呼出しの変換を示します。これは、オーバーロードされたOracle R Enterpriseのaggregate
関数を使用して、IRIS_TABLE
オブジェクトから花弁の長さの平均を取得します。
ore.create(iris, table = 'IRIS_TABLE') aggplen = aggregate(IRIS_TABLE$Petal.Length, by = list(species = IRIS_TABLE$Species), FUN = mean) aggplenこの例のリスト
R> ore.create(iris, table = 'IRIS_TABLE') R> aggplen = aggregate(IRIS_TABLE$Petal.Length, by = list(species = IRIS_TABLE$Species), FUN = mean) R> aggplen species x setosa setosa 1.462 versicolor versicolor 4.260 virginica virginica 5.552
例1-3 前の例に対応するSQL
この例では、前の例のaggregate
関数に対応するSQLを示します。
SELECT "Species", AVG("Petal.Length") FROM IRIS_TABLE GROUP BY "Species" ORDER BY "Species"; Species AVG("PETAL.LENGTH") ----------- ------------------- setosa 1.4620000000000002 versicolor 4.26 virginica 5.552
Oracle R Enterpriseの透過層には、Rデータ型をOracle Databaseデータ型にマップするクラスおよびデータ型があります。これらのクラスおよびデータ型について、次の各項で説明します。
Oracle R Enterpriseには、Rデータ型をSQLデータ型にマップするデータ型があります。Rセッションでは、Rオブジェクトからデータベース・オブジェクトを作成するか、データベース・データからRオブジェクトを作成すると、Oracle R EnterpriseはRデータ型をSQLデータ型に変換し、可能な場合はその逆を実行します。
Oracle R Enterpriseは、Oracle R Enterpriseのクラスのインスタンスであるオブジェクトを作成します。Oracle R Enterpriseは、多くの標準のR関数をオーバーロードし、それらでOracle R Enterpriseのクラスおよびデータ型を使用できるようにします。R言語の構造および構文は、Oracle Databaseオブジェクトにマップされているオブジェクトでサポートされます。
表1-1 R、Oracle R EnterpriseおよびSQLのデータ型のマッピング
Rデータ型 | Oracle R Enterpriseデータ型 | SQLデータ型 |
---|---|---|
キャラクタ・モードの |
|
|
整数モードの |
|
|
論理モードの |
|
|
数値モードの |
|
|
|
|
|
|
|
|
|
|
|
なし |
未サポート |
ユーザー定義のデータ型 参照データ型 |
注意:
タイプore.datetime
のオブジェクトはタイム・ゾーン設定をサポートしていないため、かわりに、システム・タイム・ゾーンSys.timezone
が使用可能な場合はそれを使用し、Sys.timezone
を使用できない場合はGMTを使用します。
SQL VARCHAR2データ型は、埋込みRの入力データ引数を介してR文字データ型にマップされます。ユーザーは、as.factor()
を使用して、必要に応じて文字変数をRファクタに変換できます。
ore.frame
オブジェクトは、Oracle Databaseインスタンスに対するリレーショナル問合せを表します。これはdata.frame
に相当するOracle R Enterpriseのオブジェクトです。通常は、データベース表のプロキシであるore.frame
オブジェクトを取得します。次に、ore.frame
プロキシ・オブジェクトに新しい列を追加するか、他の変更を行います。そのような変更は、基礎となる表には影響しません。その後でore.frame
オブジェクトのソース表からデータをリクエストした場合は、透過層関数が選択リストに追加の列があるSQL問合せを生成しますが、その表は変更されません。
Rでは、data.frame
の要素に明示的な順序付けがあります。整数索引付けを使用して要素を指定できます。一方、リレーショナル・データベース表では行の順序が定義されないため、Rデータ構造に直接マップできません。
Oracle R Enterpriseには、ore.frame
オブジェクトの順序付けられたものと順序付けられていないものの両方があります。表に主キー(行内で個別のタプルを形成する1つ以上の列のセット)がある場合は、SELECT
文でORDER BY
句を使用することで順序付けられた結果を生成できます。ただし、リレーショナル・データの順序付けは負荷が高く、多くの場合、透過層操作では不要です。たとえば、ore.frame
でsummary
関数を呼び出す場合、サマリー統計の計算に順序付けは必要ありません。
例1-4 data.frameおよび対応するore.frameのクラス
この例では、様々なデータ型を含む列があるdata.frame
を作成し、data.frame
の構造を表示します。この例では次に、ore.push
関数を呼び出して、data.frame
のデータのコピーを含むデータベースに一時表を作成します。ore.push
の呼出しでは、その表のプロキシであるore.frame
オブジェクトも生成されます。この例では、ore.frame
オブジェクトとdata.frame
オブジェクトおよびore.frame
オブジェクトにある列のクラスを表示します。
df <- data.frame(a="abc", b=1.456, c=TRUE, d=as.integer(1), e=Sys.Date(), f=as.difftime(c("0:3:20", "11:23:15"))) ore.push(df) class(of) class(df$a class(of$a) class(df$b) class(of$b) class(df$c) class(of$c) class(df$d) class(of$d) class(df$e) class(of$e) class(df$f) class(of$f)例1-4のリスト
R> df <- data.frame(a="abc", + b=1.456, + c=TRUE, + d=as.integer(1), + e=Sys.Date(), + f=as.difftime(c("0:3:20", "11:23:15"))) R> ore.push(df) R> class(of) [1] "ore.frame" attr(,"package") [1] "OREbase" R> class(df$a) [1] "factor" R> class(of$a) [1] "ore.factor" attr(,"package") [1] "OREbase" R> class(df$b) [1] "numeric" R> class(of$b) [1] "ore.numeric" attr(,"package") [1] "OREbase" R> class(df$c) [1] "logical" R> class(of$c) [1] "ore.logical" attr(,"package") [1] "OREbase" R> class(df$d) [1] "integer" R> class(of$d) [1] "ore.integer" attr(,"package") [1] "OREbase" R> class(df$e) [1] "Date" R> class(of$e) [1] "ore.date" attr(,"package") [1] "OREbase" R> class(df$f) [1] "difftime" R> class(of$f) [1] "ore.difftime" attr(,"package") [1] "OREbase"
汎用のas.ore
関数は、インメモリーRオブジェクトをore
オブジェクトに強制変換します。より厳密なas.ore.character
などの関数は、オブジェクトを特定の型に強制変換します。ore.push
関数は、Rクラス・タイプをore
クラス・タイプに暗黙的に強制変換し、ore.pull
関数は、ore
クラス・タイプをRクラス・タイプに強制変換します。これらの関数の詳細は、「データベースに対するデータの移動」を参照してください。
例1-5 RおよびOracle R Enterpriseのクラス・タイプの強制変換
この例では、ore
オブジェクトへのRオブジェクトの強制変換を示します。Rのinteger
オブジェクトを作成した後、汎用メソッドas.ore
を使用してore.integer
であるore
オブジェクトに強制変換します。この例では、Rオブジェクトを他の様々なore
クラス・タイプに強制変換します。埋込みRの実行関数でのas.factor
の使用例は、例6-13を参照してください。
x <- 1:10 class(x) X <- as.ore(x) class(X) Xn <- as.ore.numeric(x) class(Xn) Xc <- as.ore.character(x) class(Xc) Xc Xf <- as.ore.factor(x) Xf例1-5のリスト
R> x <- 1:10 R> class(x) [1] "integer" R> X <- as.ore(x) R> class(X) [1] "ore.integer" attr(,"package") [1] "OREbase" R> Xn <- as.ore.numeric(x) R> class(Xn) [1] "ore.numeric" attr(,"package") [1] "OREbase" R> Xc <- as.ore.character(x) R> class(Xc) [1] "ore.character" attr(,"package") [1] "OREbase" R> Xc [1] "1" "2" "3" "4" "5" "6" "7" "8" "9" "10" R> Xf <- as.ore.factor(x) R> Xf [1] 1 2 3 4 5 6 7 8 9 10 Levels: 1 10 2 3 4 5 6 7 8 9