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
Saran dan Komentar
https://aka.ms/ContentUserFeedback.
Segera hadir: Sepanjang tahun 2024 kami akan menghentikan penggunaan GitHub Issues sebagai mekanisme umpan balik untuk konten dan menggantinya dengan sistem umpan balik baru. Untuk mengetahui informasi selengkapnya, lihat:Kirim dan lihat umpan balik untuk