次の方法で共有


RxSqlServerData を使用した SQL Server のデータ オブジェクトを作成する (SQL Server および RevoScaleR チュートリアル)

適用対象: SQL Server 2016 (13.x) 以降のバージョン

これは、SQL Server で RevoScaleR 関数を使用する方法についての RevoScaleR チュートリアル シリーズのチュートリアル 2 です。

このチュートリアルは、データベースの作成の続きであり、テーブルの追加とデータの読み込みについて説明します。 チュートリアル 2 で、DBA がデータベースを作成してログインした場合、RStudio などの R IDE または Rgui などの組み込みツールを使用してテーブルを追加できます。

R から、SQL Server に接続し、RevoScaleR 関数を使用して次のタスクを実行します。

  • トレーニング データと予測用のテーブルを作成する
  • ローカルの .csv ファイルからのデータを使用してテーブルを読み込む

サンプル データは、クレジット カード不正データ (ccFraud データセット) をシミュレートしたもので、トレーニング データ セットとスコアリング データセットにパーティション分割されています。 データ ファイルは RevoScaleR に含まれています。

これらのタスクを完了するには、R IDE または Rgui を使用します。 必ず次の場所にある R 実行可能ファイルを使用してください。C:\Program Files\Microsoft\R Client \ R_SERVER \bin\x64 (そのツールを使用している場合は Rgui、または R IDE で C:\Program Files\Microsoft\R Client\R_SERVER を指定)。 R クライアント ワークステーションにこれらの実行可能ファイルがあることを、このチュートリアルの前提条件としています。

トレーニング データ テーブルを作成する

  1. データベース接続文字列を R 変数に格納します。 SQL Server に対する有効な ODBC 接続文字列の例を下記に 2 つ示します。1 つは SQL ログインを使用するもので、もう 1 つは Windows 統合認証を使用するものです。

    サーバー名、ユーザー名、およびパスワードは必ず適切なものに変更してください。

    SQL ログイン

    sqlConnString <- "Driver=SQL Server;Server=<server-name>; Database=RevoDeepDive;Uid=<user_name>;Pwd=<password>"
    

    Windows 認証

    sqlConnString <- "Driver=SQL Server;Server=<server-name>;Database=RevoDeepDive;Trusted_Connection=True"
    
  2. 作成するテーブルの名前を指定し、R 変数に保存します。

    sqlFraudTable <- "ccFraudSmall"
    

    サーバー インスタンスとデータベースの名前は接続文字列の一部として既に指定されているので、2 つの変数を組み合わせると、新しいテーブルの完全修飾名は、instance.database.schema.ccFraudSmall となります。

  3. 必要に応じて、rowsPerRead を指定して、各バッチで読み込まれるデータ行の数を制御します。

    sqlRowsPerRead = 5000
    

    このパラメーターは省略可能ですが、これを設定すると、より効率的に計算できます。 RevoScaleR および MicrosoftML のほどんどの各著された分析関数は、チャンクでデータを処理します。 rowsPerRead パラメーターは、各チャンクで行数を決定します。

    適切なバランスを見つけるために、この設定を試してみることが必要な場合があります。 値が大きすぎる場合、そのサイズのチャンクでデータを処理するのに十分なメモリがないと、データ アクセスの速度が低下する可能性があります。 逆に、一部のシステムでは、rowsPerRead の値が小さすぎると、パフォーマンスが低下する可能性もあります。

    初期値として、データベース エンジン インスタンスによって定義された既定のバッチ処理サイズを使用して、各チャンク内の行の数を制御します (5000 行)。 この値を変数 sqlRowsPerRead に保存します。

  4. 新しいデータ ソース オブジェクトの変数を定義し、前に RxSqlServerData コンストラクターに対して定義した引数を渡します。 ここではデータ ソース オブジェクトが作成されるだけで、設定は行われないことに注意してください。 データの読み込みは別の手順です。

    sqlFraudDS <- RxSqlServerData(connectionString = sqlConnString,
       table = sqlFraudTable,
       rowsPerRead = sqlRowsPerRead)
    

スコアリング データ テーブルを作成する

同じ手順を使用し、スコアリング データを保持するテーブルを同じプロセスを使用して作成します。

  1. スコア付けで使用するテーブルの名前を格納するための新しい R 変数 sqlScoreTableを作成します。

    sqlScoreTable <- "ccFraudScoreSmall"
    
  2. その変数を引数として RxSqlServerData 関数に渡して、2 つ目のデータ ソース オブジェクト sqlScoreDSを定義します。

    sqlScoreDS <- RxSqlServerData(connectionString = sqlConnString,
       table = sqlScoreTable, rowsPerRead = sqlRowsPerRead)
    

接続文字列およびその他のパラメーターは変数として R ワークスペースに定義済みであるため、異なるテーブル、ビュー、クエリを表す新しいデータ ソース用にそれを再利用することができます。

注意

この関数では、クエリに基づくデータ ソースよりも、テーブル全体に基づいたデータ ソースの定義に異なる引数を使用します。 これは、SQL Server データベース エンジンがクエリを別に準備する必要があるためです。 このチュートリアルの後の方で、SQL クエリを使用してデータ ソース オブジェクトを作成する方法について説明します。

R を使用して SQL テーブルにデータを読み込む

SQL Server テーブルが作成されましたので、それらのテーブルには、適切な Rx 関数を使用してデータを読み込むことができます。

RevoScaleR パッケージには、データソースの種類に固有の関数が含まれています。 テキスト データの場合は、RxTextData を使用して、データ ソース オブジェクトを生成します。 その他に、Hadoop データや ODBC データなどからデータ ソース オブジェクトを作成するための関数もあります。

注意

このセクションでは、データベースに対する Execute DDL アクセス許可が必要です。

トレーニング用のテーブルにデータを読み込む

  1. R 変数 ccFraudCsv を作成し、サンプル データを含む CSV ファイルへのパスをこの変数に割り当てます。 このデータ セットは、RevoScaleR で提供されています。 "sampleDataDir" は、rxGetOption 関数のキーワードです。

    ccFraudCsv <- file.path(rxGetOption("sampleDataDir"), "ccFraudSmall.csv")
    

    rxGetOption の呼び出しに注意してください。これは、RevoScaleRrxOptions に関連付けられている GET メソッドです。 このユーティリティを使用して、既定の共有ディレクトリや計算で使用するプロセッサ (コア) の数などの、ローカルおよびリモートのコンピューティング コンテキストに関連するオプションを設定し一覧表示します。

    この特定の呼び出しによって、コードを実行している場所に関係なく、正しいライブラリからサンプルを取得します。 たとえば、SQL Server で関数を実行し、開発用コンピューターでパスがどのように違うかを確認してください。

  2. 新しいデータを格納する変数を定義し、 RxTextData 関数を使用してテキスト データ ソースを指定します。

    inTextData <- RxTextData(file = ccFraudCsv,      colClasses = c(
        "custID" = "integer", "gender" = "integer", "state" = "integer",
        "cardholder" = "integer", "balance" = "integer",
        "numTrans" = "integer",
        "numIntlTrans" = "integer", "creditLine" = "integer",
        "fraudRisk" = "integer"))
    

    引数 colClasses は重要です。 この引数は、テキスト ファイルから読み込まれたデータの各列に割り当てるデータ型を指定するために使用します。 この例では、すべての列がテキストとして扱われます。例外として、名前付きの列は整数として扱われます。

  3. この時点で、少し間を置いてから、SQL Server Management Studio でデータベースを表示できます。 データベース内のテーブルの一覧を更新します。

    ローカル ワークスペースには R データ オブジェクトが作成されているが、SQL Server データベースにはテーブルが作成されていないのがわかります。 また、テキスト ファイルから R 変数に読み込まれたデータもありません。

  4. rxDataStep 関数を呼び出して、データを挿入します。

    rxDataStep(inData = inTextData, outFile = sqlFraudDS, overwrite = TRUE)
    

    接続文字列に問題がなければ、しばらくすると、次のような結果が表示されます。

    Total Rows written: 10000, Total time: 0.466Rows Read: 10000, Total Rows Processed: 10000, Total Chunk Time: 0.577 seconds

  5. テーブルの一覧を更新します。 各変数に適切なデータ型が格納されていること、また各変数が正常にインポートされたことを確認するには、SQL Server Management Studio でテーブルを右クリックして、 [上位 1000 行の選択] を選択してもかまいません。

スコアリング用テーブルにデータを読み込む

  1. この手順を繰り返して、スコアリングに使用されるデータ セットをデータベースに読み込みます。

    まず、ソース ファイルへのパスを指定します。

    ccScoreCsv <- file.path(rxGetOption("sampleDataDir"), "ccFraudScoreSmall.csv")
    
  2. RxTextData 関数を使用してデータを取得し、それを変数 inTextDataに保存します。

    inTextData <- RxTextData(file = ccScoreCsv,      colClasses = c(
        "custID" = "integer", "gender" = "integer", "state" = "integer",
        "cardholder" = "integer", "balance" = "integer",
        "numTrans" = "integer",
        "numIntlTrans" = "integer", "creditLine" = "integer"))
    
  3. rxDataStep 関数を呼び出して、現在のテーブルを新しいスキーマとデータで上書きします。

    rxDataStep(inData = inTextData, sqlScoreDS, overwrite = TRUE)
    
    • inData 引数では、使用するデータ ソースを定義します。

    • OutFile 引数では、データを保存する、 SQL Server 内のテーブルを指定します。

    • テーブルが既に存在しているために上書きオプションを使用しない場合は、切り捨てなしで結果が挿入されます。

ここでも、接続に成功した場合は、完了を示すメッセージと、テーブルへのデータ書き込みに要した時間が表示されます。

合計書き込み行数:10000、合計時間:0.384読み取られる行:10000、処理された行数の合計:10000、合計チャンク時間:0.456 秒

rxDataStep に関する詳細情報

rxDataStep は、R データ フレームに対して複数の変換を実行できる強力な関数です。 rxDataStep を使用して、変換先に必要な表現 (この場合は SQL Server) にデータを変換することもできます。

必要に応じて、rxDataStep への引数で R 関数を使用して、データの変換を指定できます。 これらの操作の例については、このチュートリアルで後述します。

次のステップ