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