Aracılığıyla paylaş


R/Python kodunu SQL Server (In-Database) örneklerinde çalışacak şekilde değiştirme

Şunlar için geçerlidir: SQL Server 2016 (13.x) ve sonraki sürümleri Azure SQL Yönetilen Örnek

Bu makalede, SQL verilerine erişirken performansı geliştirmek için R veya Python kodunu SQL Server saklı yordamı olarak çalışacak şekilde değiştirme konusunda üst düzey yönergeler sağlanmaktadır.

R/Python kodunu yerel bir IDE'den veya başka bir ortamdan SQL Server'a taşıdığınızda, kod genellikle daha fazla değişiklik yapmadan çalışır. Bu, özellikle bazı girişleri alan ve değer döndüren bir işlev gibi basit kodlar için geçerlidir. Ayrıca, çok az değişiklikle farklı yürütme bağlamlarında yürütmeyi destekleyen RevoScaleR/revoscalepy paketlerini kullanan çözümleri taşıması da daha kolaydır. MicrosoftML'nin SQL Server 2016 (13.x), SQL Server 2017 (14.x) ve SQL Server 2019 (15.x) için geçerli olduğunu ve SQL Server 2022'de (16.x) görünmediğini unutmayın.

Ancak, aşağıdakilerden biri geçerliyse kodunuz önemli değişiklikler gerektirebilir:

  • Ağ erişimi sağlayan veya SQL Server'a yüklenemeyen yazılım kütüphaneleri kullanırsınız.
  • Kod, Excel çalışma sayfaları, paylaşımlardaki dosyalar ve diğer veritabanları gibi SQL Server dışındaki veri kaynaklarına ayrı çağrılar yapar.
  • Saklı yordamı parametreleştirmek ve kodu sp_execute_external_script @scriptparametresinde çalıştırmak istiyorsunuz.
  • Özgün çözümünüz veri hazırlama veya özellik mühendisliği ile model eğitimi, puanlama veya raporlama gibi bağımsız olarak yürütülürse üretim ortamında daha verimli olabilecek birden çok adım içerir.
  • Kitaplıkları değiştirerek, paralel yürütme kullanarak veya bazı işlemleri SQL Server'a boşaltarak performansı iyileştirmek istiyorsunuz.

Adım 1. Gereksinimleri ve kaynakları planlama

Packages

  • Hangi paketlerin gerekli olduğunu belirleyin ve BUNLARıN SQL Server üzerinde çalıştığından emin olun.

  • Machine Learning Services tarafından kullanılan varsayılan paket kitaplığına paketleri önceden yükleyin. Kullanıcı kitaplıkları desteklenmez.

Veri kaynakları

  • Kodunuzu sp_execute_external_script eklemek istiyorsanız birincil ve ikincil veri kaynaklarını tanımlayın.

    • Birincil veri kaynakları, model eğitim verileri veya tahminler için giriş verileri gibi büyük veri kümeleridir. En büyük veri kümenizi sp_execute_external_script giriş parametresiyle eşlemeyi planlayın.

    • İkincil veri kaynakları genellikle faktör listeleri veya ek gruplandırma değişkenleri gibi daha küçük veri kümeleridir.

    Şu anda sp_execute_external_script saklı yordama giriş olarak yalnızca tek bir veri kümesini destekler. Ancak, birden çok skaler veya ikili giriş ekleyebilirsiniz.

    EXECUTE komutunun ardından gelen saklı yordam çağrıları, sp_execute_external_script için giriş olarak kullanılamaz. Sorguları, görünümleri veya başka bir geçerli SELECT deyimini kullanabilirsiniz.

  • İhtiyacınız olan çıkışları belirleyin. sp_execute_external_script kullanarak kod çalıştırırsanız saklı yordam sonuç olarak yalnızca bir veri çerçevesi çıkışı verebilir. Bununla birlikte, ikili biçimde çizimler ve modeller ile kod veya SQL parametrelerinden türetilen diğer skaler değerler de dahil olmak üzere birden çok skaler çıkış da çıkarabilirsiniz.

Veri türleri

R/Python ile SQL Server arasındaki veri türü eşlemelerine ayrıntılı bir bakış için şu makalelere bakın:

R/Python kodunuzda kullanılan veri türlerine göz atın ve aşağıdakileri yapın:

  • Olası veri türü sorunlarının denetim listesini yapın.

    Tüm R/Python veri türleri SQL Server Machine Learning Services tarafından desteklenir. Ancak SQL Server, R veya Python'dan daha fazla veri türünü destekler. Bu nedenle, SQL Server verileri kodunuza girerken ve kodunuzdan çıkarken bazı örtük veri türü dönüştürmeleri gerçekleştirilir. Bazı verileri açıkça atamanız veya dönüştürmeniz gerekebilir.

    NULL değerleri desteklenir. Ancak R, null değerine benzer bir eksik değeri temsil etmek için veri yapısını kullanır na .

  • R tarafından kullanılamayacak verilere bağımlılığı ortadan kaldırmayı düşünün: örneğin, SQL Server'dan alınan satır kimliği (rowid) ve GUID veri türleri R tarafından kullanılamaz ve hata oluşturur.

Adım 2. Kodu dönüştürme veya yeniden paketleme

Kodunuzu ne kadar değiştirdiğiniz, SQL Server işlem bağlamında çalıştırılacak uzak bir istemciden kodu göndermeyi mi yoksa kodu saklı yordamın bir parçası olarak dağıtmayı mı amaçladığınıza bağlıdır. İkincisi daha iyi performans ve veri güvenliği sağlayabilir, ancak bazı ek gereksinimlere neden olur.

  • Veri taşımayı önlemek için birincil giriş verilerinizi mümkün olduğunca SQL sorgusu olarak tanımlayın.

  • Saklı yordamda kod çalıştırırken, birden çok skaler girişten geçebilirsiniz. Çıktıda kullanmak istediğiniz parametreler için OUTPUT anahtar sözcüğünü ekleyin.

    Örneğin, aşağıdaki skaler giriş @model_name , daha sonra R betiği tarafından değiştirilen model adını içerir ve sonuçlarda kendi sütununda çıktı olarak verilmiştir.

    -- declare a local scalar variable which will be passed into the R script
    DECLARE @local_model_name AS NVARCHAR (50) = 'DefaultModel';
    
    -- The below defines an OUTPUT variable in the scope of the R script, called model_name
    -- Syntactically, it is defined by using the @model_name name. Be aware that the sequence
    -- of these parameters is very important. Mandatory parameters to sp_execute_external_script
    -- must appear first, followed by the additional parameter definitions like @params, etc.
    EXECUTE sp_execute_external_script @language = N'R', @script = N'
      model_name <- "Model name from R script"
      OutputDataSet <- data.frame(InputDataSet$c1, model_name)'
      , @input_data_1 = N'SELECT 1 AS c1'
      , @params = N'@model_name nvarchar(50) OUTPUT'
      , @model_name = @local_model_name OUTPUT;
    
    -- optionally, examine the new value for the local variable:
    SELECT @local_model_name;
    
  • Saklı yordam sp_execute_external_script parametresi olarak geçirdiğiniz tüm değişkenler koddaki değişkenlere eşlenmelidir. Varsayılan olarak değişkenler ada göre eşlenir. Giriş veri kümesindeki tüm sütunlar da betikteki değişkenlere eşlenmelidir.

    Örneğin, R betiğinizin aşağıdakine benzer bir formül içerdiğini varsayalım:

    formula <- ArrDelay ~ CRSDepTime + DayOfWeek + CRSDepHour:DayOfWeek
    

    Giriş veri kümesi ArrDelay, CRSDepTime, DayOfWeek, CRSDepHour ve DayOfWeek adlarına sahip sütunlar içermiyorsa hata oluşur.

  • Bazı durumlarda, sonuçlar için bir çıkış şeması önceden tanımlanmalıdır.

    Örneğin, verileri bir tabloya eklemek için, şemayı belirtmek için WITH RESULT SET yan tümcesini kullanmanız gerekir.

    Betik bağımsız değişkenini @parallel=1 kullanıyorsa çıkış şeması da gereklidir. Bunun nedeni, SQL Server tarafından sorguyu paralel olarak çalıştırmak için birden çok işlem oluşturulup sonuçların sonunda toplanmış olmasıdır. Bu nedenle, paralel işlemlerin oluşturulabilmesi için önce çıkış şemasının hazırlanması gerekir.

    Diğer durumlarda, WITH RESULT SETS UNDEFINED seçeneğini kullanarak sonuç kümelerini tanımsız bırakabilirsiniz. Bu deyim, sütunları adlandırmadan veya SQL veri türlerini belirtmeden betikten veri kümesini döndürür.

  • R/Python yerine T-SQL kullanarak zamanlama veya izleme verileri oluşturmayı göz önünde bulundurun.

    Örneğin, betikte benzer veriler oluşturmak yerine sonuçlara aktarılan bir T-SQL çağrısı ekleyerek denetim ve depolama amacıyla kullanılan sistem zamanını veya diğer bilgileri geçirebilirsiniz.

Performansı ve güvenliği geliştirme

  • Bir dosyaya tahmin veya ara sonuçlar yazmaktan kaçının. Veri taşımayı önlemek için bunun yerine bir tabloya tahminler yazın.
  • Tüm sorguları önceden çalıştırın ve paralel olarak gerçekleştirilebilecek görevleri belirlemek için SQL Server sorgu planlarını gözden geçirin.

    Giriş sorgusu paralelleştirilebilirse, bağımsız değişkenlerinizin bir parçası olarak @parallel=1 olarak ayarlayın.

    BU bayrakla paralel işleme genellikle SQL Server'ın bölümlenmiş tablolarla çalışabileceği veya sorguyu birden çok işlem arasında dağıtabildiği ve sonuçların sonunda toplandığı her zaman mümkündür. Modelleri tüm verilerin okunmasını gerektiren algoritmalar kullanarak eğitiyorsanız veya toplamalar oluşturmanız gerekiyorsa, bu bayrakla paralel işleme genellikle mümkün değildir.

  • Ayrı bir saklı yordam çağrısı kullanarak bağımsız olarak veya daha verimli bir şekilde gerçekleştirilebilecek adımlar olup olmadığını belirlemek için kodunuzu gözden geçirin. Örneğin, özellik mühendisliğini veya özellik ayıklamayı ayrı ayrı yaparak ve değerleri bir tabloya kaydederek daha iyi performans elde edebilirsiniz.

  • Ayar tabanlı hesaplamalar için R/Python kodu yerine T-SQL kullanmanın yollarını arayın.

    Örneğin, bu R çözümü kullanıcı tanımlı T-SQL işlevlerinin ve R'nin aynı özellik mühendisliği görevini nasıl gerçekleştirebileceğini gösterir: Veri Bilimi Uçtan Uca İzlenecek Yol.

  • Bellek için iyileştirilmiş tablolar gibi SQL Server özelliklerini kullanarak veya Enterprise Edition, Resource Governor kullanıyorsanız performansı artırmanın yollarını belirlemek için bir veritabanı geliştiricisine danışın.

  • R kullanıyorsanız, mümkünse geleneksel R işlevlerini dağıtılmış yürütmeyi destekleyen RevoScaleR işlevleriyle değiştirin. Daha fazla bilgi için bkz. Temel R ve RevoScaleR İşlevlerinin Karşılaştırması.

Adım 3. Dağıtıma hazırlanma

  • Kodunuzu dağıtmadan önce paketlerin yüklenebilmesi ve test edilebilmesi için yöneticiyi bilgilendirin.

    Bir geliştirme ortamında, kodunuzun bir parçası olarak paketleri yüklemeniz sorun olmayabilir, ancak bu üretim ortamında kötü bir uygulamadır.

    SQL Server işlem bağlamında saklı yordam veya R/Python kodu kullanmanız fark etmeksizin kullanıcı kitaplıkları desteklenmez.

R/Python kodunuzu saklı yordam içinde paketleyin

  • Sp-execute-external-script deyimini kullanarak kodunuzu ekleyerek T-SQL kullanıcı tanımlı bir işlev oluşturun.

  • Karmaşık R kodunuz varsa kodunuzu dönüştürmek için R paketi sqlrutils kullanın. Bu paket, deneyimli R kullanıcılarının iyi bir saklı yordam kodu yazmasına yardımcı olmak için tasarlanmıştır. R kodunuzu net bir şekilde tanımlanmış girişler ve çıkışlarla tek bir işlev olarak yeniden yazar, ardından girişi ve çıkışları doğru biçimde oluşturmak için sqlrutils paketini kullanırsınız. sqlrutils paketi sizin için tam saklı yordam kodunu oluşturur ve ayrıca saklı yordamı veritabanına kaydedebilir.

    Daha fazla bilgi ve örnek için bkz. sqlrutils (SQL).

Diğer iş akışlarıyla tümleştirme

  • T-SQL araçlarından ve ETL işlemlerinden yararlanın. Veri iş akışlarının bir parçası olarak özellik mühendisliği, özellik ayıklama ve veri temizleme işlemlerini önceden gerçekleştirin.

    Özel bir geliştirme ortamında çalışırken, verileri bilgisayarınıza çekebilir, verileri yinelemeli olarak analiz edebilir ve sonra da sonuçları yazabilir veya görüntüleyebilirsiniz. Ancak, tek başına kod SQL Server'a geçirildiğinde, bu işlemin çoğu basitleştirilmiş veya diğer SQL Server araçlarına devredilebilir.

  • Güvenli, zaman uyumsuz görselleştirme stratejilerini kullanın.

    SQL Server kullanıcıları genellikle sunucudaki dosyalara erişemez ve SQL istemci araçları genellikle R/Python grafik cihazlarını desteklemez. Çözümün bir parçası olarak çizimler veya başka grafikler oluşturuyorsanız, çizimleri ikili veri olarak dışarı aktarmayı ve bir tabloya kaydetmeyi veya yazmayı göz önünde bulundurun.

  • Uygulamalar tarafından doğrudan erişim için saklı yordamlar içinde tahmin ve puanlama işlevlerini sarmalayın.

Sonraki Adımlar

R ve Python çözümlerinin SQL Server'da nasıl dağıtılabildiğine yönelik örnekleri görüntülemek için şu öğreticilere bakın:

R öğreticileri

Python öğreticileri