Machine Learning Services con SQL Server Managed Instance
En este articulo se incluyen los scripts para configurar y utilizar los servicios de Machine Learning Services en Azure Managed Instance y de esa forma poder ejecutar scripts de Python dentro de la base de datos
-- Para habilitar Machine Learning Services en Azure SQL Managed Instance, habilite la extensibilidad
sp_configure 'external scripts enabled', 1;
RECONFIGURE WITH OVERRIDE;
-- Ejecucion de un script sencillo
EXECUTE sp_execute_external_script @language = N'Python'
, @script = N'
a = 1
b = 2
c = a/b
d = a*b
print(c, d)
'
-- Script en Python que devuelve un Result Set
EXECUTE sp_execute_external_script @language = N'Python'
, @script = N'OutputDataSet = InputDataSet'
, @input_data_1 = N'SELECT 1 AS resultado'
WITH RESULT SETS(([Resultado Hola Mundo] INT));
GO
-- Uso de las variables de entrada y salida predeterminadas de sp_execute_external_script: InputDataSet y OutputDataSet.
-- Crear una tabla pequeña con datos de prueba
CREATE TABLE PythonTestData (col1 INT NOT NULL)
INSERT INTO PythonTestData
VALUES (1);
INSERT INTO PythonTestData
VALUES (10);
INSERT INTO PythonTestData
VALUES (100);
GO
-- Use la instrucción SELECT para consultar la tabla
SELECT *
FROM PythonTestData
-- el siguiente script de Python. Recupera los datos de la tabla mediante
-- la instrucción SELECT, los pasa mediante el entorno de ejecución de Python
-- y devuelve los datos como una trama de datos
EXECUTE sp_execute_external_script @language = N'Python'
, @script = N'OutputDataSet = InputDataSet;'
, @input_data_1 = N'SELECT * FROM PythonTestData;'
WITH RESULT SETS(([NewColName] INT NOT NULL));
-- Ahora, cambie los nombres de las variables de entrada y salida
-- Los nombres predeterminados de las variables de entrada y salida son InputDataSet y OutputDataSet
-- El script siguiente cambia los nombres a SQL_in y SQL_out
EXECUTE sp_execute_external_script @language = N'Python'
, @script = N'SQL_out = SQL_in;'
, @input_data_1 = N'SELECT 12 as Col;'
, @input_data_1_name = N'SQL_in'
, @output_data_1_name = N'SQL_out'
WITH RESULT SETS(([NewColName] INT NOT NULL));
-- se puede generar valores con el script de Python sin datos de entrada (@input_data_1 se establece en blanco)
EXECUTE sp_execute_external_script @language = N'Python'
, @script = N'
import pandas as pd
mytextvariable = pandas.Series(["hello", " ", "world"]);
OutputDataSet = pd.DataFrame(mytextvariable);
'
, @input_data_1 = N''
WITH RESULT SETS(([Col1] CHAR(20) NOT NULL));
-- Si quiere ver qué versión de Python está instalada en el servidor
EXECUTE sp_execute_external_script @language = N'Python'
, @script = N'
import sys
print(sys.version)
'
GO
-- Para ver una lista de los paquetes de Python instalados
EXECUTE sp_execute_external_script @language = N'Python'
, @script = N'
import pkg_resources
import pandas
dists = [str(d) for d in pkg_resources.working_set]
OutputDataSet = pandas.DataFrame(dists)
'
WITH RESULT SETS(([Package] NVARCHAR(max)))
GO
-- El siguiente código de Python devuelve 100 números en una media de 50
EXECUTE sp_execute_external_script @language = N'Python'
, @script = N'
import numpy
import pandas
OutputDataSet = pandas.DataFrame(numpy.random.normal(size=100, loc=50, scale=3));
'
, @input_data_1 = N' ;'
WITH RESULT SETS(([Density] FLOAT NOT NULL));
GO;
-- Definicion de un procedimiento almacenado que obtenga los argumentos del usuario
CREATE PROCEDURE MyPyNorm (
@param1 INT
, @param2 INT
, @param3 INT
)
AS
EXECUTE sp_execute_external_script @language = N'Python'
, @script = N'
import numpy
import pandas
OutputDataSet = pandas.DataFrame(numpy.random.normal(size=mynumbers, loc=mymean, scale=mysd));
'
, @input_data_1 = N' ;'
, @params = N' @mynumbers int, @mymean int, @mysd int'
, @mynumbers = @param1
, @mymean = @param2
, @mysd = @param3
WITH RESULT SETS(([Density] FLOAT NOT NULL));
GO;
-- Ahora que ha creado la función de Python en un procedimiento almacenado,
-- puede llamar a la función y pasar distintos valores fácilmente de la manera siguiente
EXECUTE MyPyNorm @param1 = 100,@param2 = 50, @param3 = 3
Comments