Megjegyzés
Az oldalhoz való hozzáféréshez engedély szükséges. Megpróbálhat bejelentkezni vagy módosítani a címtárat.
Az oldalhoz való hozzáféréshez engedély szükséges. Megpróbálhatja módosítani a címtárat.
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:
- Adattípus-leképezések az R és az SQL Server között
- Adattípus-leképezések a Python és az SQL Server között
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
naadatszerkezettel 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_namepé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:DayOfWeekHiba 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: