Pemetaan jenis data antara R dan SQL Server

Berlaku untuk: SQL Server 2016 (13.x) dan yang lebih baru Azure SQL Managed Instance

Artikel ini mencantumkan jenis data yang didukung, dan konversi jenis data yang dilakukan, saat menggunakan fitur integrasi R di SQL Server Machine Learning Services.

Versi R dasar

SQL Server 2016 R Services dan SQL Server Machine Learning Services dengan R selaras dengan rilis Microsoft R Open tertentu. Misalnya, rilis terbaru, SQL Server 2019 Machine Learning Services, dibangun di Microsoft R Open 3.5.2.

Untuk melihat versi R yang terkait dengan instans SQL Server tertentu, buka RGui di instans SQL. Misalnya, jalur untuk instans default di SQL Server 2019 adalah: C:\Program Files\Microsoft SQL Server\MSSQL15.MSSQLSERVER\R_SERVICES\bin\x64\Rgui.exe.

Alat ini memuat R dasar dan pustaka lainnya. Informasi versi paket disediakan dalam pemberitahuan untuk setiap paket yang dimuat saat memulai sesi.

Jenis Data R dan SQL

Meskipun SQL Server mendukung beberapa lusin jenis data, R memiliki sejumlah jenis data skalar terbatas (numerik, bilangan bulat, kompleks, logis, karakter, tanggal/waktu, dan mentah). Akibatnya, setiap kali Anda menggunakan data dari SQL Server dalam skrip R, data mungkin secara implisit dikonversi ke jenis data yang kompatibel. Namun, sering kali konversi yang tepat tidak dapat dilakukan secara otomatis, dan kesalahan dikembalikan, seperti "Jenis data SQL yang tidak tertangani".

Bagian ini mencantumkan konversi implisit yang disediakan, dan mencantumkan jenis data yang tidak didukung. Beberapa panduan disediakan untuk memetakan jenis data antara R dan SQL Server.

Konversi jenis data implisit

Tabel berikut ini memperlihatkan perubahan tipe data dan nilai saat data dari SQL Server digunakan dalam skrip R lalu dikembalikan ke SQL Server.

Jenis SQL Kelas R Jenis TATAAN HASIL Komentar
bigint numeric Float Menjalankan skrip R dengan sp_execute_external_script memungkinkan jenis data bigint sebagai data input. Namun, karena dikonversi ke jenis numerik R, ia mengalami kerugian presisi dengan nilai yang sangat tinggi atau memiliki nilai koma desimal. R hanya mendukung hingga bilangan bulat 53-bit dan kemudian akan mulai mengalami kehilangan presisi.
biner(n)
n <= 8000
raw varbinary(max) Hanya diizinkan sebagai parameter input dan output
bit logical bit
char(n)
n <= 8000
character varchar(max) Bingkai data input (input_data_1) dibuat tanpa secara eksplisit mengatur parameter stringsAsFactors sehingga jenis kolom akan bergantung pada default.stringsAsFactors() di R
datetime POSIXct datetime Direpresentasikan sebagai GMT
date POSIXct datetime Direpresentasikan sebagai GMT
desimal(p,s) numeric Float Menjalankan skrip R dengan sp_execute_external_script memungkinkan jenis data desimal sebagai data input. Namun, karena dikonversi ke jenis numerik R, ia mengalami kerugian presisi dengan nilai yang sangat tinggi atau memiliki nilai koma desimal. sp_execute_external_script dengan skrip R tidak mendukung rentang lengkap jenis data dan akan mengubah beberapa digit desimal terakhir terutama yang memiliki pecahan.
Float numeric Float
int integer int
money numeric Float Menjalankan skrip R dengan sp_execute_external_script memungkinkan jenis data uang sebagai data input. Namun, karena dikonversi ke jenis numerik R, ia mengalami kerugian presisi dengan nilai yang sangat tinggi atau memiliki nilai koma desimal. Terkadang nilai sen tidak tepat dan peringatan akan dikeluarkan: Peringatan: tidak dapat secara tepat mewakili nilai sen.
numerik(p,s) numeric Float Menjalankan skrip R dengan sp_execute_external_script memungkinkan jenis data numerik sebagai data input. Namun, karena dikonversi ke jenis numerik R, ia mengalami kerugian presisi dengan nilai yang sangat tinggi atau memiliki nilai koma desimal. sp_execute_external_script dengan skrip R tidak mendukung rentang lengkap jenis data dan akan mengubah beberapa digit desimal terakhir terutama yang memiliki pecahan.
nyata numeric Float
smalldatetime POSIXct datetime Direpresentasikan sebagai GMT
smallint integer int
smallmoney numeric Float
tinyint integer int
uniqueidentifier character varchar(max)
varbinary(n)
n <= 8000
raw varbinary(max) Hanya diizinkan sebagai parameter input dan output
varbinary(max) raw varbinary(max) Hanya diizinkan sebagai parameter input dan output
varchar(n)
n <= 8000
character varchar(max) Bingkai data input (input_data_1) dibuat tanpa secara eksplisit mengatur parameter stringsAsFactors sehingga jenis kolom akan bergantung pada default.stringsAsFactors() di R

Jenis data tidak didukung oleh R

Dari kategori jenis data yang didukung oleh sistem jenis SQL Server, jenis berikut cenderung menimbulkan masalah ketika diteruskan ke kode R:

  • Jenis data tercantum di bagian Lain dari artikel sistem jenis SQL: kursor, tanda waktu, hierarkiid, pengidentifikasi unik, sql_variant, xml, tabel
  • Semua jenis spasial
  • gambar

Jenis data yang mungkin mengonversi dengan buruk

  • Sebagian besar jenis tanggalwaktu harus berfungsi, kecuali untuk datetimeoffset.
  • Sebagian besar jenis data numerik didukung, tetapi konversi mungkin gagal untuk uang dan smallmoney.
  • varchar didukung, tetapi karena SQL Server menggunakan Unicode sebagai aturan, penggunaan nvarchar dan jenis data teks Unicode lainnya direkomendasikan jika memungkinkan.
  • Fungsi dari pustaka RevoScaleR yang diawali dengan rx dapat menangani jenis data biner SQL (biner dan varbinary), tetapi dalam sebagian besar skenario penanganan khusus akan diperlukan untuk jenis ini. Sebagian besar kode R tidak dapat bekerja dengan kolom biner.

Untuk informasi selengkapnya tentang jenis data SQL Server, lihat Jenis Data (Transact-SQL)

Perubahan jenis data antara versi SQL Server

Microsoft SQL Server 2016 dan yang lebih baru menyertakan peningkatan dalam konversi jenis data dan dalam beberapa operasi lainnya. Sebagian besar peningkatan ini menawarkan peningkatan presisi ketika Anda berurusan dengan jenis floating-point, serta perubahan kecil pada operasi pada jenis tanggalwaktu klasik.

Semua peningkatan ini tersedia secara default saat Anda menggunakan tingkat kompatibilitas database 130 atau yang lebih baru. Namun, jika Anda menggunakan tingkat kompatibilitas yang berbeda, atau menyambungkan ke database menggunakan versi yang lebih lama, Anda mungkin melihat perbedaan dalam presisi angka atau hasil lainnya.

Untuk informasi selengkapnya, lihat penyempurnaan SQL Server 2016 dalam menangani beberapa jenis data dan operasi yang tidak biasa.

Verifikasi skema data R dan SQL terlebih dahulu

Secara umum, setiap kali Anda memiliki keraguan tentang bagaimana jenis data atau struktur data tertentu digunakan dalam R, gunakan str() fungsi untuk mendapatkan struktur internal dan jenis objek R. Hasil fungsi dicetak ke konsol R dan juga tersedia dalam hasil kueri, di tab Pesan di Management Studio.

Saat mengambil data dari database untuk digunakan dalam kode R, Anda harus selalu menghilangkan kolom yang tidak dapat digunakan dalam R, serta kolom yang tidak berguna untuk analisis, seperti GUIDS (pengidentifikasi unik), tanda waktu, dan kolom lain yang digunakan untuk audit, atau informasi silsilah yang dibuat oleh proses ETL.

Perhatikan bahwa penyertaan kolom yang tidak perlu dapat sangat mengurangi performa kode R, terutama jika kolom kardinalitas tinggi digunakan sebagai faktor. Oleh karena itu, kami sarankan Anda menggunakan prosedur tersimpan sistem SQL Server dan tampilan informasi untuk mendapatkan jenis data untuk tabel tertentu terlebih dahulu, dan menghilangkan atau mengonversi kolom yang tidak kompatibel. Untuk informasi selengkapnya, lihat Tampilan Skema Informasi di Transact-SQL

Jika jenis data SQL Server tertentu tidak didukung oleh R, tetapi Anda perlu menggunakan kolom data dalam skrip R, kami sarankan Anda menggunakan fungsi CAST dan CONVERT (Transact-SQL) untuk memastikan bahwa konversi jenis data dilakukan seperti yang dimaksudkan sebelum menggunakan data dalam skrip R Anda.

Peringatan

Jika Anda menggunakan rxDataStep untuk menghilangkan kolom yang tidak kompatibel saat memindahkan data, ketahuilah bahwa argumen varsToKeep dan varsToDrop tidak didukung untuk jenis sumber data RxSqlServerData .

Contoh

Contoh 1: Konversi implisit

Contoh berikut menunjukkan bagaimana data diubah saat melakukan komunikasi dua arah antara SQL Server dan R.

Kueri mendapatkan serangkaian nilai dari tabel SQL Server, dan menggunakan prosedur tersimpan sp_execute_external_script untuk menghasilkan nilai menggunakan runtime R.

CREATE TABLE MyTable (    
 c1 int,    
 c2 varchar(10),    
 c3 uniqueidentifier    
);    
go    
INSERT MyTable VALUES(1, 'Hello', newid());    
INSERT MyTable VALUES(-11, 'world', newid());    
SELECT * FROM MyTable;    
  
EXECUTE sp_execute_external_script    
 @language = N'R'    
 , @script = N'    
inputDataSet["cR"] <- c(4, 2)    
str(inputDataSet)    
outputDataSet <- inputDataSet'    
 , @input_data_1 = N'SELECT c1, c2, c3 FROM MyTable'    
 , @input_data_1_name = N'inputDataSet'    
 , @output_data_1_name = N'outputDataSet'    
 WITH RESULT SETS((C1 int, C2 varchar(max), C3 varchar(max), C4 float));  

Hasil

Baris # C1 C2 C3 C4
1 1 Halo 6e225611-4b58-4995-a0a5-554d19012ef1 4
2 -11 Dunia 6732ea46-2d5d-430b-8ao1-86e7f3351c3e 2

Perhatikan penggunaan str fungsi di R untuk mendapatkan skema data output. Fungsi ini mengembalikan informasi berikut:

'data.frame':2 obs. of  4 variables:
 $ c1: int  1 -11
 $ c2: Factor w/ 2 levels "Hello","world": 1 2
 $ c3: Factor w/ 2 levels "6732EA46-2D5D-430B-8A01-86E7F3351C3E",..: 2 1
 $ cR: num  4 2

Dari ini, Anda dapat melihat bahwa konversi jenis data berikut secara implisit dilakukan sebagai bagian dari kueri ini:

  • Kolom C1. Kolom direpresentasikan sebagai int dalam SQL Server, integer di R, dan int dalam tataan hasil output.

    Tidak ada konversi jenis yang dilakukan.

  • Kolom C2. Kolom direpresentasikan sebagai varchar(10) dalam SQL Server, factor di R, dan varchar(max) dalam output.

    Perhatikan bagaimana output berubah; string apa pun dari R (baik faktor atau string reguler) akan direpresentasikan sebagai varchar(max), apa pun panjang stringnya.

  • Kolom C3. Kolom direpresentasikan sebagai pengidentifikasi unik dalam SQL Server, character dalam R, dan varchar(max) dalam output.

    Perhatikan konversi jenis data yang terjadi. SQL Server mendukung pengidentifikasi unik tetapi R tidak; oleh karena itu, pengidentifikasi direpresentasikan sebagai string.

  • Kolom C4. Kolom berisi nilai yang dihasilkan oleh skrip R dan tidak ada dalam data asli.

Contoh 2: Pemilihan kolom dinamis menggunakan R

Contoh berikut menunjukkan bagaimana Anda bisa menggunakan kode R untuk memeriksa jenis kolom yang tidak valid. mendapatkan skema tabel tertentu menggunakan tampilan sistem SQL Server, dan menghapus kolom apa pun yang memiliki jenis yang tidak valid tertentu.

connStr <- "Server=.;Database=TestDB;Trusted_Connection=Yes"
data <- RxSqlServerData(connectionString = connStr, sqlQuery = "SELECT COLUMN_NAME FROM TestDB.INFORMATION_SCHEMA.COLUMNS WHERE TABLE_NAME = N'testdata' AND DATA_TYPE <> 'image';")
columns <- rxImport(data)
columnList <- do.call(paste, c(as.list(columns$COLUMN_NAME), sep = ","))
sqlQuery <- paste("SELECT", columnList, "FROM testdata")

Lihat juga