Megosztás a következőn keresztül:


R/Python-kód módosítása SQL Server (In-Database) példányokban való futtatáshoz

A következőkre vonatkozik: Sql Server 2016 (13.x) és újabb verziók felügyelt Azure SQL-példány

Ez a cikk magas szintű útmutatást nyújt arról, hogyan módosíthatja az R- vagy Python-kódot, hogy SQL Server-alapú tárolt eljárásként fusson a teljesítmény javítása érdekében az SQL-adatok elérésekor.

Amikor R/Python-kódot helyez át egy helyi IDE-ből vagy más környezetből az SQL Serverre, a kód általában további módosítás nélkül működik. Ez különösen igaz az egyszerű kódokra, például egy olyan függvényre, amely bizonyos bemeneteket vesz igénybe, és értéket ad vissza. A RevoScaleR/revoscalepy csomagokat használó megoldásokat is könnyebben portozhatja, amelyek minimális módosításokkal támogatják a végrehajtást különböző végrehajtási környezetekben. Vegye figyelembe, hogy a MicrosoftML az SQL Server 2016-ra (13.x), az SQL Server 2017-re (14.x) és az SQL Server 2019-re (15.x) vonatkozik, és nem jelenik meg az SQL Server 2022-ben (16.x).

A kód azonban jelentős módosításokat igényelhet, ha az alábbiak bármelyike érvényes:

  • Olyan kódtárakat használ, amelyek hozzáférnek a hálózathoz, vagy amelyek nem telepíthetők az SQL Serverre.
  • A kód külön hívásokat indít az SQL Serveren kívüli adatforrásokhoz, például Excel-munkalapokhoz, megosztásokon tárolt fájlokhoz és más adatbázisokhoz.
  • A tárolt eljárást paraméterezni szeretné, és a kódot a sp_execute_external_script @script paraméterében szeretné futtatni.
  • Az eredeti megoldás több olyan lépést is tartalmaz, amelyek hatékonyabbak lehetnek éles környezetben, ha egymástól függetlenül hajtják végre, például adat-előkészítést vagy szolgáltatásfejlesztést vagy modellbetanítást, pontozást vagy jelentéskészítést.
  • Optimalizálni szeretné a teljesítményt a kódtárak módosításával, a párhuzamos végrehajtással vagy a feldolgozás sql serverre való kiszervezésével.

1. lépés. Követelmények és erőforrások tervezése

Csomagok

  • Határozza meg, hogy mely csomagokra van szükség, és győződjön meg arról, hogy az SQL Serveren működnek.

  • Telepítse előre a csomagokat a Machine Learning Services által használt alapértelmezett csomagtárban. A felhasználói kódtárak nem támogatottak.

Adatforrások

  • Ha a kódot sp_execute_external_script szeretné beágyazni, azonosítsa az elsődleges és másodlagos adatforrásokat.

    • Az elsődleges adatforrások nagy adathalmazok, például modellbetanítási adatok vagy előrejelzések bemeneti adatai. Tervezze meg, hogy a legnagyobb adatkészletet a sp_execute_external_script bemeneti paraméteréhez rendeli.

    • A másodlagos adatforrások általában kisebb adathalmazok, például a tényezők listája vagy további csoportosítási változók.

    Jelenleg sp_execute_external_script csak egyetlen adathalmazt támogat a tárolt eljárás bemeneteként. Azonban több skaláris vagy bináris bemenetet is hozzáadhat.

    Az EXECUTE előtt tárolt eljáráshívások nem használhatók a sp_execute_external_script bemeneteként. Használhat lekérdezéseket, nézeteket vagy bármely más érvényes SELECT utasítást.

  • Határozza meg a szükséges kimeneteket. Ha sp_execute_external_script használatával futtat kódot, a tárolt eljárás ennek eredményeként csak egy adatkeretet tud kihozni. Azonban több skaláris kimenetet is kiadhat, beleértve a bináris formátumú diagramokat és modelleket, valamint a kódból vagy SQL-paraméterekből származtatott egyéb skaláris értékeket is.

Adattípusok

Az R/Python és az SQL Server közötti adattípus-leképezések részletes megtekintéséhez tekintse meg az alábbi cikkeket:

Tekintse meg az R/Python-kódban használt adattípusokat, és tegye a következőket:

  • Készítsen ellenőrzőlistát a lehetséges adattípus-problémákról.

    Az SQL Server Machine Learning Services minden R/Python-adattípust támogat. Az SQL Server azonban több adattípust támogat, mint az R vagy a Python. Ezért az SQL Server-adatok kódba és a kódból való áthelyezésekor implicit adattípus-átalakításokat hajtunk végre. Előfordulhat, hogy bizonyos adatokat explicit módon kell leadnia vagy konvertálnia.

    A NULL értékek támogatottak. Az R azonban az na adatszerkezettel egy hiányzó értéket jelöl, amely a null értékhez hasonló.

  • Fontolja meg az R által nem használható adatoktól való függőség megszüntetését: például az SQL Server sorazonosító és GUID adattípusai nem használhatók az R által, és hibákat okoznak.

2. lépés. Kód konvertálása vagy újracsomagolása

A kód módosításának mértéke attól függ, hogy távoli ügyfélről szeretné-e elküldeni a kódot az SQL Server számítási környezetében való futtatáshoz, vagy egy tárolt eljárás részeként kívánja üzembe helyezni a kódot. Ez utóbbi jobb teljesítményt és adatbiztonságot biztosít, bár további követelményeket támaszt.

  • Az elsődleges bemeneti adatok meghatározása SQL-lekérdezésként, ahol csak lehetséges, az adatáthelyezés elkerülése érdekében.

  • Ha kódokat futtat egy tárolt eljárásban, több skaláris bemenetet is továbbíthat. A kimenetben használni kívánt paraméterekhez adja hozzá a OUTPUT kulcsszót .

    A következő skaláris bemenet @model_name például tartalmazza a modell nevét, amelyet később az R-szkript is módosít, és a kimenet a saját oszlopában jelenik meg az eredményekben:

    -- 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;
    
  • A tárolt eljárás paraméterként átadott változókat a sp_execute_external_script-ben a kód változóira kell képezni. Alapértelmezés szerint a változók név szerint vannak megfeleltetve. A bemeneti adathalmaz összes oszlopát a szkript változóira is le kell képezni.

    Tegyük fel például, hogy az R-szkript az alábbihoz hasonló képletet tartalmaz:

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

    Hiba lép fel, ha a bemeneti adatkészlet nem tartalmaz ArrDelay, CRSDepTime, DayOfWeek, CRSDepHour és DayOfWeek nevű oszlopokat.

  • Bizonyos esetekben előre meg kell határozni a kimeneti sémát az eredményekhez.

    Ha például be szeretné szúrni az adatokat egy táblába, a séma megadásához a WITH RESULT SET záradékot kell használnia.

    A kimeneti sémára akkor is szükség van, ha a szkript az argumentumot @parallel=1használja. Ennek az az oka, hogy az SQL Server több folyamatot is létrehozhat a lekérdezés párhuzamos futtatásához, a végén összegyűjtött eredményekkel. Ezért a kimeneti sémát a párhuzamos folyamatok létrehozása előtt elő kell készíteni.

    Más esetekben kihagyhatja az eredménysémát a WITH RESULT SETS UNDEFINED (EREDMÉNYHALMAZOK NEM DEFINIÁLVA) lehetőséggel. Ez az utasítás az adatkészletet az oszlopok elnevezése vagy az SQL-adattípusok megadása nélkül adja vissza a szkriptből.

  • Fontolja meg az időzítést vagy az adatok nyomon követését az R/Python helyett a T-SQL használatával.

    Átadhatja például a rendszeridőt vagy a naplózáshoz és a tároláshoz használt egyéb adatokat úgy, hogy hozzáad egy T-SQL-hívást, amely átmegy az eredményekhez, és nem hoz létre hasonló adatokat a szkriptben.

A teljesítmény és a biztonság javítása

  • Ne írjon előrejelzéseket vagy köztes eredményeket egy fájlba. Az adatáthelyezés elkerülése érdekében inkább írjon előrejelzéseket egy táblába.
  • Futtassa előre az összes lekérdezést, és tekintse át az SQL Server lekérdezési terveit a párhuzamosan végrehajtható feladatok azonosításához.

    Ha a bemeneti lekérdezés párhuzamosítható, adja meg az @parallel=1 értéket az sp_execute_external_script argumentumaként.

    Ezzel a jelzővel a párhuzamos feldolgozás általában bármikor lehetséges, amikor az SQL Server képes particionált táblákkal dolgozni, vagy több folyamat között elosztani egy lekérdezést, és a végén összesíteni az eredményeket. Az ezzel a jelzővel történő párhuzamos feldolgozás általában nem lehetséges, ha olyan algoritmusokat használó modelleket képez be, amelyek minden adatot beolvasnak, vagy ha összesítéseket kell létrehoznia.

  • Tekintse át a kódot, és állapítsa meg, hogy vannak-e egymástól függetlenül végrehajtható vagy hatékonyabban végrehajtható lépések egy külön tárolt eljáráshívás használatával. Például jobb teljesítményt érhet el azáltal, hogy külön-külön végzi el a szolgáltatásfejlesztést vagy a funkciókinyeréseket, és menti az értékeket egy táblába.

  • Keresse meg az R/Python-kód helyett a T-SQL beállításalapú számításokhoz való használatát.

    Ez az R-megoldás például azt mutatja be, hogy a felhasználó által definiált T-SQL-függvények és az R hogyan hajthatják végre ugyanazt a funkciótervezési feladatot: adatelemzési teljes körű útmutató.

  • Az adatbázis-fejlesztővel konzultálva meghatározhatja, hogyan javíthatja a teljesítményt az SQL Server olyan funkcióival, mint például a memóriaoptimalizált táblák, vagy ha Enterprise Edition kiadással rendelkezik, a Resource Governor használatával.

  • Ha R-t használ, akkor ha lehetséges, cserélje le a hagyományos R-függvényeket az elosztott végrehajtást támogató RevoScaleR-függvényekre . További információ: Base R és RevoScaleR Functions összehasonlítása.

3. lépés. Felkészülés az üzembe helyezésre

  • Értesítse a rendszergazdát, hogy a csomagok a kód üzembe helyezése előtt telepíthetők és tesztelhetők legyenek.

    Fejlesztési környezetben előfordulhat, hogy a kód részeként csomagokat telepít, de ez éles környezetben helytelen gyakorlat.

    A felhasználói kódtárak nem támogatottak, függetlenül attól, hogy tárolt eljárást használ, vagy R/Python-kódot futtat az SQL Server számítási környezetében.

R/Python-kód becsomagolása tárolt eljárásba

  • Hozzon létre egy felhasználó által definiált T-SQL-függvényt, amely beágyazza a kódot az sp-execute-external-script utasítással.

  • Ha összetett R-kóddal rendelkezik, az R-csomag sqlrutils használatával konvertálja a kódot. Ez a csomag úgy lett kialakítva, hogy segítsen a tapasztalt R-felhasználóknak a jó tárolt eljáráskód írásában. Az R-kódot egyetlen függvényként írja át egyértelműen definiált bemenetekkel és kimenetekkel, majd az sqlrutils-csomag használatával hozza létre a bemenetet és a kimeneteket a megfelelő formátumban. Az sqlrutils-csomag létrehozza a teljes tárolt eljáráskódot, és regisztrálhatja a tárolt eljárást az adatbázisban.

    További információkért és példákért lásd: sqlrutils (SQL).

Integrálás más munkafolyamatokkal

  • T-SQL-eszközök és ETL-folyamatok használata. Az adat-munkafolyamatok részeként előre végezze el a szolgáltatásfejlesztést, a funkciókinyerést és az adattisztítást.

    Ha dedikált fejlesztői környezetben dolgozik, adatokat vonhat le a számítógépére, iteratív módon elemezheti az adatokat, majd kiírhatja vagy megjelenítheti az eredményeket. Ha azonban önálló kódot migrál az SQL Serverre, a folyamat nagy része egyszerűsíthető vagy delegálható más SQL Server-eszközökre.

  • Használjon biztonságos, aszinkron vizualizációs stratégiákat.

    Az SQL Server felhasználói gyakran nem férnek hozzá a kiszolgálón található fájlokhoz, és az SQL-ügyféleszközök általában nem támogatják az R/Python grafikus eszközöket. Ha a megoldás részeként hoz létre diagramokat vagy más ábrákat, fontolja meg a diagramok bináris adatokként való exportálását és a táblázatba vagy írásba való mentést.

  • Az előrejelzési és pontozási függvények tárolt eljárásokba foglalása az alkalmazások általi közvetlen hozzáférés érdekében.

Következő lépések

Az R- és Python-megoldások SQL Serveren való üzembe helyezésének példáit az alábbi oktatóanyagokban tekintheti meg:

R-oktatóanyagok

Python-oktatóanyagok