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(20NOT 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

Popular posts from this blog

Permitiendo la administración de los jobs a usuarios que no son System Administrators en SQL Server Agent 2005 o superior

Desactivar llaves foráneas en SQL Server

Restringir acceso desde el Management Studio