跳至主要内容

如何在 SQL 中执行 Python/R

阅读本教程后,您将了解如何在 T-SQL 语句中嵌入 R 和 Python 脚本,并了解在 SQL 与 Python/R 之间传递数据所用的数据类型。
· 6分钟 阅读

使用 AI 探索

将智能带到数据所在之处

简介

您知道可以在 T-SQL 语句中编写 R 和 Python 代码吗?SQL Server 中的机器学习服务省去了数据搬移的需要。无需通过网络传输大量敏感数据,或因使用示例 csv 文件而牺牲精度,您即可在数据库内执行 R/Python 代码。利用 SQL 存储过程轻松部署 R/Python 代码,使其可用于您的 ETL 流程或任何应用程序。在数据库中训练并存储机器学习模型,把智能带到数据所在之处。

您可以安装并运行最新的开源 R/Python 包,在 SQL Server 中基于海量数据构建深度学习和 AI 应用。微软的 前沿高性能算法也可通过 RevoScaleR 和 RevoScalePy API 获得。结合开源领域的最新创新,您可以为应用带来无与伦比的选择、性能与可扩展性。

为何在 SQL Server 中进行数据库内分析

如果您迫不及待想体验 SQL Server 机器学习服务,请查看下方的动手教程。若您的 SQL Server 尚未安装机器学习服务,请先按照此处发布的入门教程进行操作:https://blogs.msdn.microsoft.com/mlserver/2018/05/18/getting-started-with-machine-learning-services-in-sql-server/

操作教程

您将学到什么

本教程将介绍如何在 T-SQL 语句中执行 R 和 Python 的基础知识。完成后,您将了解:

  1. 如何在 T-SQL 语句中嵌入 R 和 Python 脚本。
  2. 如何使用基本参数为 R/Python 脚本指定输入与输出数据。
  3. 在 SQL 与 Python/R 之间传递数据所使用的数据类型。

安装前提

如果您的 SQL Server 尚未安装机器学习服务,请先阅读此入门教程或观看这些视频完成设置:https://aka.ms/InstallMLServices https://aka.ms/EnableMLServices

视频配套

如果您喜欢通过视频学习,本教程也可在 YouTube 上观看:@https://aka.ms/ExecuteMLServices https://youtu.be/ACejZ9optCQ

基础

打开 SQL Server Management Studio 并连接到您的服务器。新建查询并粘贴以下基础示例:(示例使用 Python,但您也可以用 R 完成同样的操作)

EXEC sp_execute_external_script @language = N'Python',
@script = N'print(3+4)'

Sp_execute_external_script 是启用 SQL Server 中 R 和 Python 执行的特殊系统存储过程。language 参数允许在 Python 与 R 之间选择。script 参数用于粘贴 R 或 Python 代码。若未看到输出为 7,请返回并查看本文中的设置步骤。

参数介绍

在讨论完基础示例后,让我们开始加入更多要素:

EXEC sp_execute_external_script @language =N'Python',
@script = N'
OutputDataSet = InputDataSet;
',
@input_data_1 =N'SELECT 1 AS Col1';

机器学习服务通过接受任意 SQL 查询的输入数据参数,实现了 SQL 与 R/Python 之间更自然的通信。该输入参数名称为 input_data_1。

您可以在 Python 代码中看到,预定义了在 Python 与 SQL 之间传递数据的默认变量。默认变量名为 OutputDataSet 和 InputDataSet。您也可以像下面的示例一样更改这些默认名称:

EXEC sp_execute_external_script @language =N'Python',
@script = N'
MyOutput = MyInput;
',
@input_data_1_name = N'MyInput',
@input_data_1 =N'SELECT 1 AS foo',
@output_data_1_name =N'MyOutput';

在执行这些示例时,您可能注意到每个示例都会返回带有 (No column name) 的结果?您可以在语句末尾添加 WITH RESULT SETS 子句来为返回的列指定名称,它是一个以逗号分隔的列及其数据类型列表。

EXEC sp_execute_external_script  @language =N'Python',
@script=N'
MyOutput = MyInput;
',
@input_data_1_name = N'MyInput',
@input_data_1 =N'SELECT 1 AS foo,2 AS bar',
@output_data_1_name =N'MyOutput'
WITH RESULT SETS ((MyColName int, MyColName2 int));

输入/输出数据类型

好,接下来多谈一点 SQL 与 Python 之间使用的输入/输出数据类型。您的输入 SQL SELECT 语句会依赖 Python Pandas 包将“DataFrame”传递给 Python。从 Python 返回 SQL 的输出也需要是一个 Pandas DataFrame 对象。如果您需要将标量值转换为 DataFrame,下面是一个示例:

EXEC sp_execute_external_script @language =N'Python',
@script=N'
import pandas as pd
c = 1/2
d = 1*2
s = pd.Series([c,d])
df = pd.DataFrame(s)
OutputDataSet = df
'

变量 c 和 d 都是标量值,您可以将它们加入到 pandas 的 Series,然后再将其转换为 pandas DataFrame。下面这个示例稍微复杂一些,更多细节与示例请参阅 Python pandas 包文档:

EXEC sp_execute_external_script @language =N'Python',
@script=N'
import pandas as pd
s = {"col1": [1, 2], "col2": [3, 4]}
df = pd.DataFrame(s)
OutputDataSet = df
'

现在,您已经掌握了在 T-SQL 中执行 R 和 Python 的基础!调用 EXEC sp_execute_external_script、复制/粘贴您的 R 或 Python 代码,以及复制/粘贴您的 SQL 输入查询都非常简单。也许您需要进行某些在 R/Python 中很容易、但用 SQL 编写却过于复杂的数据转换或提取;也许您要在无法通过网络传输的海量数据上训练深度神经网络;也许您想在进入 OLTP 系统的新数据上自动进行评分/预测。用例非常广泛,而您现在已经准备好借助 SQL Server 的机器学习服务来提升安全性、性能与可扩展性。

延伸阅读

您知道吗?您也可以在自己喜欢的 IDE(如 RStudio 和 Jupyter Notebooks)中编写 R 与 Python 代码,然后将该代码的执行远程发送到 SQL Server。请查看以下文档链接了解更多:文档:https://aka.ms/R-RemoteSQLExecution 文档:https://aka.ms/R-RemoteSQLExecution Github Jupyter Notebook 示例:https://aka.ms/RemoteExecJupyter

如果您想进一步学习 SQL,欢迎查看我们的数据科学 SQL 入门课程以及SQL 学习指南。

主题