Bagikan melalui


Jalankan fungsi R kustom di SQL Server menggunakan rxExec (tutorial SQL Server dan RevoScaleR)

Berlaku untuk: SQL Server 2016 (13.x) dan versi yang lebih baru

Ini adalah tutorial 14 dari seri tutorial RevoScaleR tentang cara menggunakan fungsi RevoScaleR dengan SQL Server.

Dalam tutorial ini, Anda akan menggunakan data simulasi untuk menunjukkan eksekusi fungsi R kustom yang berjalan di server jarak jauh.

Anda dapat menjalankan fungsi R kustom dalam konteks SQL Server dengan meneruskan fungsi Anda melalui rxExec, dengan asumsi bahwa pustaka apa pun yang diperlukan skrip Anda juga diinstal di server dan pustaka tersebut kompatibel dengan distribusi dasar R.

Fungsi rxExec di RevoScaleR menyediakan mekanisme untuk menjalankan skrip R apa pun yang Anda butuhkan. Selain itu, rxExec dapat secara eksplisit mendistribusikan pekerjaan di beberapa inti dalam satu server, menambahkan skala ke skrip yang dibatasi pada batasan sumber daya mesin R asli.

Prasyarat

Distribusi R pada stasiun kerja klien menyediakan alat Rgui bawaan yang dapat Anda gunakan untuk menjalankan skrip R dalam tutorial ini. Anda juga dapat menggunakan IDE seperti RStudio atau R Tools untuk Visual Studio.

Membuat konteks komputasi jarak jauh

Jalankan perintah R berikut pada stasiun kerja klien. Misalnya, Anda menggunakan Rgui, mulai dari lokasi ini: C:\Program Files\Microsoft\R Client\R_SERVER\bin\x64.

  1. Tentukan string koneksi untuk instans SQL Server tempat komputasi dilakukan. Server harus dikonfigurasi untuk integrasi R. Nama database tidak digunakan dalam latihan ini, tetapi string koneksi memerlukannya. Jika Anda memiliki database pengujian atau sampel, Anda dapat menggunakannya.

    Menggunakan login SQL

    sqlConnString <- "Driver=SQL Server;Server=<SQL-Server-instance-name>; Database=<database-name>;Uid=<SQL-user-name>;Pwd=<password>"
    

    Menggunakan autentikasi Windows

    sqlConnString <- "Driver=SQL Server;Server=<SQL-Server-instance-name>;Database=<database-name>;Trusted_Connection=True"
    
  2. Buat konteks komputasi jarak jauh ke instans SQL Server yang dirujuk dalam string koneksi.

    sqlCompute <- RxInSqlServer(connectionString = sqlConnString)
    
  3. Aktifkan konteks komputasi lalu kembalikan definisi objek sebagai langkah konfirmasi. Anda akan melihat properti objek konteks komputasi.

    rxSetComputeContext(sqlCompute)
    rxGetComputeContext()
    

Membuat fungsi kustom

Dalam latihan ini, Anda akan membuat fungsi R kustom yang mensimulasikan kasino umum yang terdiri dari menggulung sepasang dadu. Aturan permainan menentukan hasil menang atau kalah:

  • Putar 7 atau 11 pada roll awal Anda, Anda menang.
  • Roll 2, 3, atau 12, Anda kehilangan.
  • Gulung 4, 5, 6, 8, 9, atau 10, angka itu menjadi titik Anda, dan Anda terus bergulir sampai Anda menggulung titik Anda lagi (dalam hal ini Anda menang) atau menggulung 7, dalam hal ini Anda kalah.

Gim ini mudah disimulasikan dalam R, dengan membuat fungsi kustom, dan kemudian menjalankannya berkali-kali.

  1. Buat fungsi kustom menggunakan kode R berikut:

    rollDice <- function()
    {
        result <- NULL
        point <- NULL
        count <- 1
            while (is.null(result))
            {
                roll <- sum(sample(6, 2, replace=TRUE))
    
                if (is.null(point))
                { point <- roll }
                if (count == 1 && (roll == 7 || roll == 11))
                {  result <- "Win" }
                else if (count == 1 && (roll == 2 || roll == 3 || roll == 12))
                { result <- "Loss" }
                else if (count > 1 && roll == 7 )
                { result <- "Loss" }
                else if (count > 1 && point == roll)
                { result <- "Win" }
                else { count <- count + 1 }
            }
            result
    }
    
  2. Simulasikan satu game dadu dengan menjalankan fungsi .

    rollDice()
    

    Apakah Anda menang atau kalah?

Sekarang setelah Anda memiliki skrip operasional, mari kita lihat bagaimana Anda dapat menggunakan rxExec untuk menjalankan fungsi beberapa kali untuk membuat simulasi yang membantu menentukan kemungkinan menang.

Pass rollDice() di rxExec

Untuk menjalankan fungsi arbitrer dalam konteks SQL Server jarak jauh, panggil fungsi rxExec .

  1. Panggil fungsi kustom sebagai argumen ke rxExec, bersama dengan parameter lain yang memodifikasi simulasi.

    sqlServerExec <- rxExec(rollDice, timesToRun=20, RNGseed="auto")
    length(sqlServerExec)
    
    • Gunakan argumen timesToRun untuk menunjukkan berapa kali fungsi harus dijalankan. Dalam hal ini, Anda menggulung dadu 20 kali.

    • Argumen RNGseed dan RNGkind dapat digunakan untuk mengontrol pembuatan angka acak. Ketika RNGseed diatur ke otomatis, aliran angka acak paralel diinisialisasi pada setiap pekerja.

  2. Fungsi rxExec membuat daftar dengan satu elemen untuk setiap eksekusi; namun, Anda tidak akan melihat banyak hal terjadi sampai daftar selesai. Ketika semua perulangan selesai, garis yang dimulai dengan panjang akan mengembalikan nilai.

    Anda kemudian dapat masuk ke langkah berikutnya untuk mendapatkan ringkasan catatan win-loss Anda.

  3. Konversi daftar yang dikembalikan ke vektor menggunakan fungsi unlist R, dan ringkas hasilnya menggunakan fungsi tabel.

    table(unlist(sqlServerExec))
    

    Hasil Anda akan terlihat seperti ini:

    Kalah Menang12 8

Kesimpulan

Meskipun latihan ini sederhana, latihan ini menunjukkan mekanisme penting untuk mengintegrasikan fungsi R arbitrer dalam skrip R yang berjalan di SQL Server. Untuk meringkas poin utama yang memungkinkan teknik ini:

  • SQL Server harus dikonfigurasi untuk pembelajaran mesin dan integrasi R: SQL Server Pembelajaran Mesin Services dengan fitur R, atau SQL Server 2016 R Services (dalam Database).

  • Pustaka sumber terbuka atau pihak ketiga yang digunakan dalam fungsi Anda, termasuk dependensi apa pun, harus diinstal di SQL Server. Untuk informasi selengkapnya, lihat Menginstal paket R baru.

  • Memindahkan skrip dari lingkungan pengembangan ke lingkungan produksi yang diperkeras dapat memperkenalkan pembatasan firewall dan jaringan. Uji dengan hati-hati untuk memastikan skrip Anda dapat berkinerja seperti yang diharapkan.

Langkah berikutnya

Untuk contoh penggunaan rxExec yang lebih kompleks, lihat artikel ini: Paralelisme butir kasar dengan foreach dan rxExec