快速入门:通过 SQL 机器学习运行简单的 Python 脚本
适用于: SQL Server 2017 (14.x) 及更高版本 Azure SQL 托管实例
在本快速入门中,你将使用 SQL Server 机器学习服务、Azure SQL 托管实例机器学习服务或 SQL Server 大数据群集运行一组简单的 Python 脚本。 你将了解如何在 SQL Server 实例中使用存储过程 sp_execute_external_script 执行该脚本。
先决条件
若要运行本快速入门,需要具备以下先决条件。
以下平台之一上的 SQL 数据库:
- SQL Server 机器学习服务。 如需安装,请参阅 Windows 安装指南或 Linux 安装指南。
- SQL Server 2019 大数据群集。 了解如何在 SQL Server 2019 大数据群集上启用机器学习服务。
- Azure SQL 托管实例机器学习服务。 有关信息,请参阅 Azure SQL 托管实例机器学习服务概述。
用于运行包含 Python 脚本的 SQL 查询的工具。 本快速入门使用 Azure Data Studio。
运行简单脚本
若要运行 Python 脚本,请将它作为参数传递给系统存储过程 sp_execute_external_script。 此系统存储过程在 SQL 机器学习的上下文中启动 Python 运行时,将数据传递到 Python,安全地管理 Python 用户会话,并将所有结果返回到客户端。
在下面的步骤中,你将在数据库中运行此示例 Python 脚本:
a = 1
b = 2
c = a/b
d = a*b
print(c, d)
在连接到 SQL 实例的“Azure Data Studio”中打开一个新的查询窗口。
将完整的 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
存储过程的输入包括:
输入 | 说明 |
---|---|
@language | 定义本例中要调用 Python 的语言扩展 |
@script | 定义传递给 Python 运行时的命令。 必须以 Unicode 文本形式将整个 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 定义返回的数据表的架构,并添加了列名称“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 包
Microsoft 在 SQL Server 2016 (13.x)、SQL Server 2017 (14.x) 和 Server 2019 (15.x) 中提供了许多随机器学习服务预安装的 Python 包。 在 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
此列表来自 Python 中的 pkg_resources.working_set
,并作为数据帧返回到 SQL。
后续步骤
若要了解在 SQL 机器学习中使用 Python 时如何使用数据结构,请按照此快速入门操作: