Démarrage rapide : Exécution de scripts Python simples avec le Machine Learning SQL

S’applique à : SQL Server 2017 (14.x) et versions ultérieures Azure SQL Managed Instance

Dans ce guide de démarrage rapide, vous allez exécuter un ensemble de scripts Python simples en utilisant Machine Learning Services de SQL Server, Machine Learning Services d’Azure SQL Managed Instance ou des clusters Big Data SQL Server. Vous allez découvrir comment utiliser la procédure stockée sp_execute_external_script pour exécuter ce script dans une instance SQL Server.

Prérequis

Pour effectuer ce démarrage rapide, vous avez besoin de ce qui suit.

Exécuter un script simple

Pour exécuter un script Python, vous devez le transmettre sous forme d’argument à la procédure stockée système, sp_execute_external_script. Cette procédure stockée système démarre le runtime Python dans le contexte du Machine Learning SQL, transmet les données à Python, gère les sessions utilisateur Python de manière sécurisée et retourne les résultats au client.

Au cours des étapes suivantes, vous allez exécuter cet exemple de script Python dans votre base de données :

a = 1
b = 2
c = a/b
d = a*b
print(c, d)
  1. Ouvrez une nouvelle fenêtre Requête connectée à votre instance SQL dans Azure Data Studio.

  2. Transmettez le script Python complet à la procédure stockée sp_execute_external_script.

    Le script est transmis via l’argument @script. Tout ce qui se trouve dans l’argument @script doit être du code Python valide.

    EXECUTE sp_execute_external_script @language = N'Python'
        , @script = N'
    a = 1
    b = 2
    c = a/b
    d = a*b
    print(c, d)
    '
    
  3. Le résultat correct est calculé et la fonction Python print retourne le résultat dans la fenêtre Messages.

    Voici comment il se présente.

    Résultats

    STDOUT message(s) from external script:
    0.5 2
    

Exécuter un script Hello World

Un exemple type de script est celui qui génère simplement la chaîne « Hello World ». Exécutez la commande suivante :

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

Les entrées de la procédure stockée sp_execute_external_script sont les suivantes :

Entrée Description
@language définit l’extension de langage à appeler (dans le cas présent, Python)
@script Cette entrée définit les commandes transmises au runtime Python. L’intégralité de votre script Python doit être placé dans cet argument en tant que texte Unicode. Vous pouvez aussi ajouter le texte à une variable de type nvarchar, puis appeler cette variable
@input_data_1 données retournées par la requête, transmises au runtime Python, qui retourne les données sous forme de trame de données
WITH RESULT SETS Cette clause définit le schéma de la table de données retournée pour le Machine Learning SQL, en ajoutant « Hello World » comme nom de colonne et int comme type de données.

La commande génère le texte suivant :

Hello World
1

Utiliser des entrées et des sorties

Par défaut, sp_execute_external_script accepte un seul jeu de données en entrée, que vous fournissez généralement sous forme de requête SQL valide. Il retourne ensuite une seule trame de données Python en sortie.

Pour le moment, utilisons les variables d’entrée et de sortie par défaut de sp_execute_external_script : InputDataSet et OutputDataSet.

  1. Créez une petite table de données de test.

    CREATE TABLE PythonTestData (col1 INT NOT NULL)
    
    INSERT INTO PythonTestData
    VALUES (1);
    
    INSERT INTO PythonTestData
    VALUES (10);
    
    INSERT INTO PythonTestData
    VALUES (100);
    GO
    
  2. Utilisez l’instruction SELECT pour interroger la table.

    SELECT *
    FROM PythonTestData
    

    Résultats

    Contenu de la table PythonTestData

  3. Exécutez le script Python suivant. Il récupère les données de la table en utilisant l’instruction SELECT, les transmet via le runtime Python et retourne les données sous forme de trame de données. La clause WITH RESULT SETS définit le schéma de la table de données retournée pour SQL Server, ajoutant le nom de colonne 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));
    

    Résultats

    Sortie du script Python qui retourne des données d’une table

  4. À présent, renommez les variables d’entrée et de sortie. Les variables d’entrée et de sortie se nomment par défaut InputDataSet et OutputDataSet. Le script suivant remplace ces noms par SQL_in et 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));
    

    Notez que Python respecte la casse. Les variables d’entrée et de sortie utilisées dans le script Python (SQL_out, SQL_in) doivent correspondre aux noms définis avec @input_data_1_name et @output_data_1_name, y compris la casse.

    Conseil

    Un seul jeu de données d’entrée peut être passé en tant que paramètre, et un seul jeu de données peut être renvoyé. Toutefois, vous pouvez appeler d’autres jeux de données à partir de votre code Python et retourner des sorties d’autres types en plus du jeu de données. Vous pouvez également ajouter le mot clé OUTPUT à n’importe quel paramètre pour qu’il soit retourné avec les résultats.

  5. Vous pouvez aussi générer des valeurs en utilisant simplement le script Python sans données d’entrée (@input_data_1 est vide).

    Le script suivant génère le texte « hello » et « world ».

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

    Résultats

    Résultats de la requête utilisant <span class=@script comme entrée" />

Conseil

Python utilise des espaces à gauche pour regrouper les instructions. Ainsi, lorsque le script Python incorporé s’étend sur plusieurs lignes (comme dans le script précédent), n’essayez pas de mettre en retrait les commandes Python afin de les aligner sur les commandes SQL. Par exemple, ce script génère une erreur :

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

Vérifier la version de Python

Si vous voulez savoir quelle version de Python est installée sur votre serveur, exécutez le script suivant.

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

La fonction Python print retourne la version dans la fenêtre Messages. Dans l’exemple de sortie ci-dessous, vous pouvez voir que la version 3.5.2 de Python est installée, dans le cas présent.

Résultats

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

Répertorier les packages Python

Microsoft fournit un certain nombre de packages Python préinstallés avec Machine Learning Services dans SQL Server 2016 (13.x), SQL Server 2017 (14.x) et SQL Server 2019 (15.x). Dans SQL Server 2022 (16.x), vous pouvez télécharger et installer tous les runtimes et packages Python personnalisés comme vous le souhaitez.

Pour afficher la liste des packages Python installés avec leur version, exécutez le script suivant.

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 liste provient de pkg_resources.working_set dans Python et est renvoyée à SQL en tant que trame de données.

Étapes suivantes

Pour savoir comment utiliser des structures de données quand Python est utilisé pour l’apprentissage automatique SQL, suivez ce guide de démarrage rapide :