Inicio rápido: Ejecución de scripts de Python sencillos con aprendizaje automático de SQL

Se aplica a: SQL Server 2017 (14.x) y versiones posteriores Azure SQL Managed Instance

En este inicio rápido, ejecutará un conjunto de scripts de Python sencillos mediante SQL Server Machine Learning Services, Machine Learning Services en Azure SQL Managed Instance o Clústeres de macrodatos de SQL Server. Aprenderá a usar el procedimiento almacenado sp_execute_external_script para ejecutar el script en una instancia de SQL Server.

Prerrequisitos

Para ejecutar este inicio rápido, debe cumplir los siguientes requisitos previos.

Ejecución de un script sencillo

Para ejecutar un script de Python, necesita pasarlo como argumento al procedimiento almacenado del sistema, sp_execute_external_script. Este procedimiento almacenado del sistema inicia el entorno de ejecución de Python en el contexto de aprendizaje automático de SQL, pasa datos a Python, administra de forma segura las sesiones de usuario de Python y devuelve los resultados al cliente.

En los pasos siguientes, deberá ejecutar este script de Python de ejemplo en la base de datos:

a = 1
b = 2
c = a/b
d = a*b
print(c, d)
  1. Abra una nueva ventana de consulta en Azure Data Studio conectada a su instancia de SQL.

  2. Pase todo el script de Python al procedimiento almacenado sp_execute_external_script.

    El script se pasa mediante el argumento @script. Todo lo que contenga el argumento @script tiene que ser código de Python válido.

    EXECUTE sp_execute_external_script @language = N'Python'
        , @script = N'
    a = 1
    b = 2
    c = a/b
    d = a*b
    print(c, d)
    '
    
  3. Se calcula el resultado correcto y la función print de Python devuelve el resultado a la ventana Mensajes.

    Necesita tener el siguiente aspecto.

    Resultados

    STDOUT message(s) from external script:
    0.5 2
    

Ejecución de un script Hola mundo

Un script de ejemplo típico es uno que simplemente muestra la cadena "Hola mundo". Ejecute el siguiente comando:

EXECUTE sp_execute_external_script @language = N'Python'
    , @script = N'OutputDataSet = InputDataSet'
    , @input_data_1 = N'SELECT 1 AS hello'
WITH RESULT SETS(([Hello World] INT));
GO

Entre las entradas para el procedimiento almacenado sp_execute_external_script, se incluyen las siguientes:

Entrada Descripción
@language define la extensión del lenguaje de la llamada (en este caso, Python).
@script define los comandos que se pasarán al entorno de ejecución de Python. Es necesario incluir todo el script de Python en este argumento como texto Unicode. También puede agregar texto a una variable del tipo nvarchar y, después, llamar a la variable.
@input_data_1 Los datos devueltos por la consulta se pasan al entorno de ejecución de Python, que los devuelve a su vez como una trama de datos.
WITH RESULT SETS cláusula que define el esquema de la tabla de datos devuelta a aprendizaje automático de SQL (se agrega "Hola mundo" como el nombre de columna e int para el tipo de datos).

El comando muestra el texto siguiente:

Hola mundo
1

Uso de entradas y salidas

De forma predeterminada, sp_execute_external_script acepta un único conjunto de datos como entrada, que se suele proporcionar como una consulta SQL válida. Después, devuelve una única trama de datos de Python como salida.

Por ahora, usaremos las variables de entrada y salida predeterminadas de sp_execute_external_script: InputDataSet y OutputDataSet.

  1. Cree 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
    
  2. Use la instrucción SELECT para consultar la tabla.

    SELECT *
    FROM PythonTestData
    

    Resultados

    Contenido de la tabla PythonTestData

  3. Ejecute 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. La cláusula WITH RESULT SETS define el esquema de la tabla de datos devuelta para SQL y agrega el nombre de columna NewColName.

    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));
    

    Resultados

    Salida del script de Python que devuelve datos de una tabla

  4. 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));
    

    Tenga en cuenta que Python distingue mayúsculas de minúsculas. Las variables de entrada y salida usadas en el script de Python (SQL_out y SQL_in) tienen que coincidir con los nombres definidos con @input_data_1_name y @output_data_1_name, incluido el uso de mayúsculas.

    Sugerencia

    Solo se puede pasar un conjunto de datos de entrada como parámetro, y solo se puede devolver un conjunto de datos. Pero puede llamar a otros conjuntos de datos desde dentro del código de Python y devolver salidas de otros tipos, además del conjunto de datos. También puede agregar la palabra clave OUTPUT a cualquier parámetro para que se devuelva con los resultados.

  5. También puede generar valores con el script de Python sin datos de entrada (@input_data_1 se establece en blanco).

    El script siguiente genera el texto "hola" y "mundo".

    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));
    

    Resultados

    Resultados de la consulta usando <span class=@script como entrada" />

Sugerencia

Python usa espacios iniciales para agrupar instrucciones. Por lo tanto, cuando el script de Python insertado abarca varias líneas, como en el script anterior, no intente agregar sangría a los comandos de Python para que estén alineados con los comandos de SQL. Por ejemplo, este script produciría un error:

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));

Comprobación de la versión de Python

Si quiere ver qué versión de Python está instalada en el servidor, ejecute el script siguiente.

EXECUTE sp_execute_external_script @language = N'Python'
    , @script = N'
import sys
print(sys.version)
'
GO

La función print de Python devuelve la versión en la ventana Mensajes. En la salida de ejemplo siguiente, puede ver que, en este caso, la versión de Python instalada es 3.5.2.

Resultados

STDOUT message(s) from external script:
3.5.2 |Continuum Analytics, Inc.| (default, Jul  5 2016, 11:41:13) [MSC v.1900 64 bit (AMD64)]

Lista de paquetes de Python

Microsoft proporciona varios paquetes de Python preinstalados con Machine Learning Services en SQL Server 2016 (13.x), SQL Server 2017 (14.x) y SQL Server 2019 (15.x). En SQL Server 2022 (16.x), puede descargar e instalar los paquetes y entornos de ejecución de Python personalizados según sea necesario.

Para ver una lista de los paquetes de Python instalados, incluida la versión, ejecute el script siguiente.

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

La lista es de pkg_resources.working_set en Python y se devuelve a SQL como una trama de datos.

Pasos siguientes

Para obtener información sobre cómo usar estructuras de datos al usar Python en aprendizaje automático de SQL, siga este inicio rápido: