Краткое руководство. Выполнение простых скриптов Python с использованием машинного обучения SQL
Область применения: SQL Server 2017 (14.x) и более поздних версий Управляемый экземпляр SQL Azure
В этом кратком руководстве вы запустите ряд простых сценариев Python с помощью Служб машинного обучения SQL Server, Служб машинного обучения управляемых экземпляров SQL Azure или в Кластерах больших данных SQL Server. Также вы узнаете, как применить хранимую процедуру sp_execute_external_script для выполнения скрипта в экземпляре SQL Server.
Необходимые компоненты
Для работы с этим кратким руководством необходимо следующее.
База данных SQL на одной из следующих платформ:
- Службы машинного обучения SQL Server. Сведения об установке см. в руководстве по установке для Windows или руководстве по установке для Linux.
- Кластеры больших данных SQL Server 2019. Узнайте, как включать службы машинного обучения в кластерах больших данных SQL Server 2019.
- Службы машинного обучения в Управляемом экземпляре SQL Azure. Дополнительные сведения см. в статье Общие сведения о службах машинного обучения в управляемом экземпляре SQL Azure.
Средство для выполнения SQL-запросов, содержащих сценарии Python. В этом кратком руководстве используется Azure Data Studio.
Выполнение простого сценария
Чтобы выполнить сценарий Python, необходимо передать его в качестве аргумента в системную хранимую процедуру sp_execute_external_script. Эта системная хранимая процедура запускает среду выполнения Python в контексте машинного обучения SQL, передает данные в Python, безопасно управляет пользовательскими сеансами в Python и возвращает результаты на клиент.
На следующих этапах вы запустите этот скрипт Python в базе данных:
a = 1
b = 2
c = a/b
d = a*b
print(c, d)
Откройте новое окно запроса в среде Azure Data Studio, подключенной к вашему экземпляру SQL.
Передайте весь сценарий 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) '
Далее вычисляется правильный результат, и функция 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
передаются следующие входные данные.
Входные данные | Description |
---|---|
@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.
Создайте небольшую таблицу тестовых данных.
CREATE TABLE PythonTestData (col1 INT NOT NULL) INSERT INTO PythonTestData VALUES (1); INSERT INTO PythonTestData VALUES (10); INSERT INTO PythonTestData VALUES (100); GO
Используйте инструкцию
SELECT
для запроса в эту таблицу.SELECT * FROM PythonTestData
Результаты
Выполните следующий скрипт 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));
Результаты
Теперь измените имена входных и выходных переменных. Имена входных и выходных переменных по умолчанию°— 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 к любому параметру, чтобы он возвращался с результатами.
Можно также формировать значения только с помощью сценария 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));
Результаты
@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, см. в этом кратком руководстве: