Avvio rapido: Eseguire script Python semplici con Machine Learning Services per SQL

Si applica a: SQL Server 2017 (14.x) e versioni successive Istanza gestita di SQL di Azure

In questo argomento di avvio rapido verrà eseguito un set di semplici script Python con Machine Learning Services per SQL Server, Machine Learning Services di Istanza gestita di SQL di Azure o cluster Big Data di SQL Server. Si apprenderà come usare la stored procedure sp_execute_external_script per eseguire lo script in un'istanza di SQL Server.

Prerequisiti

Per completare questo argomento di avvio rapido è necessario soddisfare i prerequisiti seguenti.

Eseguire uno script semplice

Per eseguire uno script Python, è necessario passarlo come argomento alla stored procedure di sistema sp_execute_external_script. Questa stored procedure di sistema avvia il runtime Python nel contesto della funzione di Machine Learning in SQL, passa i dati a Python, gestisce le sessioni utente di Python in modo sicuro e restituisce i risultati al client.

Nei passaggi seguenti si eseguirà questo script Python di esempio nel database:

a = 1
b = 2
c = a/b
d = a*b
print(c, d)
  1. In Azure Data Studio aprire una nuova finestra di query connessa all'istanza di SQL.

  2. Passare lo script Python completo alla stored procedure sp_execute_external_script.

    Lo script viene passato tramite l'argomento @script. Tutti gli elementi all'interno dell'argomento @script devono essere costituiti da codice Python valido.

    EXECUTE sp_execute_external_script @language = N'Python'
        , @script = N'
    a = 1
    b = 2
    c = a/b
    d = a*b
    print(c, d)
    '
    
  3. Il risultato corretto viene calcolato e la funzione Python print restituisce il risultato nella finestra Messaggi.

    Dovrebbe essere simile al seguente.

    Risultati

    STDOUT message(s) from external script:
    0.5 2
    

Eseguire uno script Hello World

Uno script di esempio tipico è quello che restituisce come output la stringa "Hello World". Esegui il comando seguente:

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

Gli input per la stored procedure sp_execute_external_script includono:

Input Descrizione
@language Definisce l'estensione del linguaggio da chiamare, in questo caso Python
@script Definisce i comandi passati al runtime Python. L'intero script Python deve essere incluso in questo argomento come testo Unicode. È anche possibile aggiungere il testo a una variabile di tipo nvarchar e quindi chiamare la variabile
@input_data_1 Dati restituiti dalla query, passati al runtime Python, che restituisce i dati come frame di dati
WITH RESULT SETS Clausola che definisce lo schema della tabella dati restituita per Machine Learning in SQL, aggiungendo "Hello World" come nome di colonna e int per il tipo di dati

Il comando restituisce il testo seguente:

Hello World
1

Usare input e output

Per impostazione predefinita, sp_execute_external_script accetta un singolo set di dati come input, che in genere viene fornito sotto forma di query SQL valida. Restituisce quindi un singolo frame di dati Python come output.

Per il momento, verranno usate le variabili di input e di output predefinite di sp_execute_external_script: InputDataSet e OutputDataSet.

  1. Creare una piccola tabella di dati di 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. Usare l'istruzione SELECT per eseguire una query sulla tabella.

    SELECT *
    FROM PythonTestData
    

    Risultati

    Contents of the PythonTestData table

  3. Eseguire lo script Python seguente. Questo script recupera i dati dalla tabella usando l'istruzione SELECT, li passa nel runtime Python e restituisce i dati come frame di dati. La clausola WITH RESULT SETS definisce lo schema della tabella dati restituita per SQL, aggiungendo il nome di colonna 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));
    

    Risultati

    Output from Python script that returns data from a table

  4. Modificare ora i nomi delle variabili di input e di output. I nomi delle variabili di input e di output predefiniti sono InputDataSet e OutputDataSet. Lo script seguente cambia i nomi in SQL_in e 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));
    

    Si noti che Python fa distinzione tra maiuscole e minuscole. Le variabili di input e di output usate nello script Python (SQL_out, SQL_in) devono corrispondere ai nomi definiti con @input_data_1_name e @output_data_1_name, inclusa la distinzione tra maiuscole e minuscole.

    Suggerimento

    È possibile passare come parametro un solo set di dati di input e si può restituire un solo set di dati. È tuttavia possibile chiamare altri set di dati dall'interno del codice Python e restituire output di altri tipi oltre al set di dati. È anche possibile aggiungere la parola chiave OUTPUT a qualsiasi parametro per fare in modo che venga restituito con i risultati.

  5. È anche possibile generare i valori usando solo lo script Python senza dati di input (@input_data_1 è impostato su un valore vuoto).

    Lo script seguente restituisce il testo "hello" e "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));
    

    Risultati

    Query results using <span class=@script come input" />

Suggerimento

Python usa gli spazi iniziali per raggruppare le istruzioni. Quindi, quando lo script Python incorporato si estende su più righe, come nello script precedente, non provare a far rientrare i comandi Python in modo che siano allineati con i comandi SQL. Ad esempio, questo script genera un errore:

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

Controllare la versione di Python

Per vedere la versione di Python installata nel server, eseguire lo script seguente.

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

La funzione Python print restituisce la versione nella finestra Messaggi. Nell'output di esempio seguente si può notare che in questo caso è installata la versione di Python 3.5.2.

Risultati

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

Elencare i pacchetti Python

Microsoft fornisce una serie di pacchetti Python preinstallati con Machine Learning Services in SQL Server 2016 (13.x), SQL Server 2017 (14.x) e SQL Server 2019 (15.x). In SQL Server 2022 (16.x), è possibile scaricare e installare tutti i pacchetti e i runtime Python personalizzati che si desidera.

Per visualizzare un elenco dei pacchetti Python installati, inclusa la versione, eseguire lo script seguente.

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

L'elenco proviene da pkg_resources.working_set in Python e viene restituito a SQL come frame di dati.

Passaggi successivi

Per informazioni su come usare le strutture di dati quando si usa Python con Machine Learning in SQL, seguire questo argomento di avvio rapido: