Краткое руководство. Выполнение простых скриптов Python с использованием машинного обучения SQL

Применимо к: SQL Server 2017 (14.x) и более поздние Управляемый экземпляр SQL Azure

В этом кратком руководстве вы запустите ряд простых сценариев Python с помощью Служб машинного обучения SQL Server, Служб машинного обучения управляемых экземпляров SQL Azure или в Кластерах больших данных SQL Server. Также вы узнаете, как применить хранимую процедуру sp_execute_external_script для выполнения скрипта в экземпляре SQL Server.

Предварительные требования

Для работы с этим кратким руководством необходимо следующее.

Выполнение простого сценария

Чтобы выполнить сценарий Python, необходимо передать его в качестве аргумента в системную хранимую процедуру sp_execute_external_script. Эта системная хранимая процедура запускает среду выполнения Python в контексте машинного обучения SQL, передает данные в Python, безопасно управляет пользовательскими сеансами в Python и возвращает результаты на клиент.

На следующих этапах вы запустите этот скрипт Python в базе данных:

a = 1
b = 2
c = a/b
d = a*b
print(c, d)
  1. Откройте новое окно запроса в среде Azure Data Studio, подключенной к вашему экземпляру SQL.

  2. Передайте весь сценарий Python в хранимую процедуру sp_execute_external_script.

    Сценарий передается с помощью аргумента @script. Все, что находится внутри аргумента @script, должно быть допустимым кодом Python.

    EXECUTE sp_execute_external_script @language = N'Python'
        , @script = N'
    a = 1
    b = 2
    c = a/b
    d = a*b
    print(c, d)
    '
    
  3. Далее вычисляется правильный результат, и функция Python print возвращает результат в окне Сообщения.

    Он должен выглядеть примерно так.

    Результаты

    STDOUT message(s) from external script:
    0.5 2
    

Выполнение сценария Hello World

Типичный пример — сценарий, который просто выводит строку "Hello World". Выполните следующую команду.

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

В хранимую процедуру sp_execute_external_script передаются следующие входные данные.

Входные данные Описание
@language Определяет вызываемое расширение языка (в данном случае Python).
@script Определяет команды, которые передаются в среду выполнения Python. Весь скрипт Python должен быть включен в этот аргумент в виде текста в Юникоде. Также можно добавить текст в переменную типа nvarchar, а затем вызвать ее.
@input_data_1 Данные, возвращаемые запросом, передаются в среду выполнения Python, которая возвращает их в виде кадра данных.
WITH RESULT SETS Это предложение определяет схему возвращаемой таблицы данных для машинного обучения SQL. В данном случае добавляется "Hello World" в качестве имени столбца и int в качестве типа данных.

Эта команда выводит следующий текст:

Hello World
1

Использование входных и выходных данных

По умолчанию процедура sp_execute_external_script принимает в качестве входных данных один набор данных, обычно предоставляемый в виде допустимого SQL-запроса. Затем она возвращает один кадр данных Python в качестве выходных данных.

Сейчас мы будем использовать заданные по умолчанию входные и выходные переменные процедуры sp_execute_external_script: InputDataSet и OutputDataSet.

  1. Создайте небольшую таблицу тестовых данных.

    CREATE TABLE PythonTestData (col1 INT NOT NULL)
    
    INSERT INTO PythonTestData
    VALUES (1);
    
    INSERT INTO PythonTestData
    VALUES (10);
    
    INSERT INTO PythonTestData
    VALUES (100);
    GO
    
  2. Используйте инструкцию SELECT для запроса в эту таблицу.

    SELECT *
    FROM PythonTestData
    

    Результаты

    Содержимое таблицы PythonTestData

  3. Выполните следующий скрипт Python. Он получает данные из таблицы с помощью инструкции SELECT, передает их через среду выполнения Python и возвращает результаты в виде кадра данных. Предложение WITH RESULT SETS определяет схему таблицы возвращаемых данных для SQL Server, добавляя имя столбца 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));
    

    Результаты

    Результат скрипта Python, возвращающий данные из таблицы

  4. Теперь измените имена входных и выходных переменных. Имена входных и выходных переменных по умолчанию°— InputDataSet и OutputDataSet. Следующий сценарий изменяет их на SQL_in и 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));
    

    Обратите внимание, что в Python учитывается регистр. Входные и выходные переменные, используемые в сценарии Python (SQL_out, SQL_in), должны соответствовать именам, определенным в аргументах @input_data_1_name и @output_data_1_name, включая регистр.

    Совет

    В качестве параметра может быть передан только один входной набор данных, и можно возвращать только один набор данных. Однако вы можете вызывать из кода Python другие наборы данных, а также возвращать выходные данные других типов в дополнение к этому набору данных. Вы также можете добавить ключевое слово OUTPUT к любому параметру, чтобы он возвращался с результатами.

  5. Можно также формировать значения только с помощью сценария Python, без каких-либо входных данных (в аргументе @input_data_1 задано пустое значение).

    Следующий сценарий выводит текст "hello" и "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));
    

    Результаты

    Результаты запроса при использовании <span class=@script в качестве входных данных" />

Совет

В Python начальные пробелы используются для группирования инструкций. Поэтому когда внедренный сценарий Python разделяется на несколько строк, как в предыдущем примере, не пытайтесь выровнять команды Python по одной линии с командами SQL. Например, следующий сценарий выдаст ошибку.

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

Проверка версии Python

Если вы хотите узнать, какая версия Python установлена на сервере, выполните следующий сценарий.

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

Функция Python print возвращает версию в окне Сообщения. В приведенном ниже примере можно видеть, что в данном случае установлен Python версии 3.5.2.

Результаты

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

Список пакетов Python

Корпорация Майкрософт предоставляет ряд пакетов Python, которые предустанавливаются вместе со службами машинного обучения в SQL Server 2016 (13.x), SQL Server 2017 (14.x) и SQL Server 2019 (15.x). В SQL Server 2022 (16.x) по желанию можно скачать и установить любые пользовательские среды выполнения и пакеты Python.

Чтобы просмотреть список установленных пакетов Python вместе с их версиями, выполните следующий сценарий.

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

Список возвращается из pkg_resources.working_set в Python в формате кадра данных.

Дальнейшие действия

Сведения о том, как применять структуры данных при использовании Python в машинном обучении SQL, см. в этом кратком руководстве: