快速入门:通过 SQL 机器学习运行简单的 R 脚本

适用于: SQL Server 2016 (13.x) 及更高版本 Azure SQL 托管实例

在本快速入门中,你将在 SQL Server 机器学习服务中或大数据群集上运行一组简单的 R 脚本。 你将了解如何在 SQL Server 实例中使用存储过程 sp_execute_external_script 执行该脚本。

在本快速入门中,将使用 SQL Server 机器学习服务运行一组简单的 R 脚本。 你将了解如何在 SQL Server 实例中使用存储过程 sp_execute_external_script 执行该脚本。

在本快速入门中,你将使用 SQL Server R Services 运行一组简单的 R 脚本。 你将了解如何在 SQL Server 实例中使用存储过程 sp_execute_external_script 执行该脚本。

在本快速入门中,将使用 Azure SQL 托管实例机器学习服务运行一组简单的 R 脚本。 你将了解如何在数据库中使用存储过程 sp_execute_external_script 执行该脚本。

先决条件

若要运行本快速入门,需要具备以下先决条件。

  • SQL Server 机器学习服务。 如需安装机器学习服务,请参阅 Windows 安装指南
  • 一个用于运行包含 R 脚本的 SQL 查询的工具。 本快速入门使用 Azure Data Studio

运行简单脚本

若要运行 R 脚本,请将它作为参数传递给系统存储过程 sp_execute_external_script。 此系统存储过程启动 R 运行时,将数据传递给 R,安全地管理 R 用户会话并将任何结果返回给客户端。

在下面的步骤中,你将运行此示例 R 脚本:

a <- 1
b <- 2
c <- a/b
d <- a*b
print(c(c, d))
  1. 打开 Azure Data Studio 并连接到你的服务器。

  2. 将完整的 R 脚本传递到 sp_execute_external_script 存储过程。

    通过 @script 参数传递脚本。 @script 参数内的所有内容都必须是有效的 R 代码。

    EXECUTE sp_execute_external_script @language = N'R'
        , @script = N'
    a <- 1
    b <- 2
    c <- a/b
    d <- a*b
    print(c(c, d))
    '
    
  3. 计算出正确的结果,R print 函数将结果返回到“消息”窗口。

    结果应该如下所示。

    结果

    STDOUT message(s) from external script:
    0.5 2
    

运行 Hello World 脚本

典型的示例脚本只输出字符串“Hello World”。 运行以下命令。

EXECUTE sp_execute_external_script @language = N'R'
    , @script = N'OutputDataSet<-InputDataSet'
    , @input_data_1 = N'SELECT 1 AS hello'
WITH RESULT SETS(([Hello World] INT));
GO

sp_execute_external_script 存储过程的输入包括:

输入 说明
@language 定义本例中要调用 R 的语言扩展
@script 定义传递给 R 运行时的命令。 必须将整个 R 脚本作为 Unicode 文本包括在此参数中。 还可将文本添加到 nvarchar 类型的变量并调用该变量
@input_data_1 查询返回的数据传递给 R 运行时,后者将数据以数据帧的形式返回
WITH RESULT SETS 子句定义返回的数据表的架构,并将“Hello World”添加为列名称且 int 为数据类型

命令输出以下文本:

Hello World
1

使用输入和输出

默认情况下,sp_execute_external_script 接受单个数据集作为输入,通常以有效的 SQL 查询的形式提供。 然后,它返回单个 R 数据帧作为输出。

现在,使用 sp_execute_external_script 的默认输入和输出变量:InputDataSet 和 OutputDataSet 。

  1. 创建一个小型测试数据表。

    CREATE TABLE RTestData (col1 INT NOT NULL)
    
    INSERT INTO RTestData
    VALUES (1);
    
    INSERT INTO RTestData
    VALUES (10);
    
    INSERT INTO RTestData
    VALUES (100);
    GO
    
  2. 使用 SELECT 语句来查询表。

    SELECT *
    FROM RTestData
    

    结果

    RTestData 表的内容

  3. 运行以下 R 脚本。 它使用 SELECT 语句从表中检索数据,通过 R 运行时传递数据,并以数据帧的形式返回数据。 WITH RESULT SETS 子句为 SQL 定义返回的数据表的架构,并添加了列名称“NewColName”。

    EXECUTE sp_execute_external_script @language = N'R'
        , @script = N'OutputDataSet <- InputDataSet;'
        , @input_data_1 = N'SELECT * FROM RTestData;'
    WITH RESULT SETS(([NewColName] INT NOT NULL));
    

    结果

    从表返回数据的 R 脚本的输出

  4. 现在,更改输入变量和输出变量的名称。 默认的输入和输出变量名称是 InputDataSet 和 OutputDataSet,而此脚本会将名称更改为 SQL_in 和 SQL_out :

    EXECUTE sp_execute_external_script @language = N'R'
        , @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));
    

    请注意 R 区分大小写。 R 脚本中使用的输入和输出变量(SQL_out、SQL_in)需要匹配使用 @input_data_1_name@output_data_1_name 定义的名称,包括大小写 。

    提示

    只能将一个输入数据集作为参数传递,并且只能返回一个数据集。 但是,可以从 R 代码内部调用其他数据集,并且可以返回除数据集之外的其他类型的输出。 也可向任何参数添加 OUTPUT 关键字,让该参数随结果一起返回。

  5. 还可以仅使用没有输入数据的 R 脚本(@input_data_1 设置为空白)生成值。

    以下脚本输出文本“hello”和“world”。

    EXECUTE sp_execute_external_script @language = N'R'
        , @script = N'
    mytextvariable <- c("hello", " ", "world");
    OutputDataSet <- as.data.frame(mytextvariable);
    '
        , @input_data_1 = N''
    WITH RESULT SETS(([Col1] CHAR(20) NOT NULL));
    

    结果

    使用 <span class=@script 作为输入" /> 查询结果

检查 R 版本

若要查看已安装的 R 的版本,请运行以下脚本。

EXECUTE sp_execute_external_script @language = N'R'
    , @script = N'print(version)';
GO

R print 函数将该版本返回到“消息”窗口。 在下面的示例输出中,可以看到本例中安装的是 R 版本 3.4.4。

结果

STDOUT message(s) from external script:
                   _
platform       x86_64-w64-mingw32
arch           x86_64
os             mingw32
system         x86_64, mingw32
status
major          3
minor          4.4
year           2018
month          03
day            15
svn rev        74408
language       R
version.string R version 3.4.4 (2018-03-15)
nickname       Someone to Lean On

列出 R 包

Microsoft 提供了许多随机器学习服务预安装的 R 包。

Microsoft 提供了许多随 R Services 预安装的 R 包。

若要查看已安装的 R 包列表(包括版本、依赖项、许可证和库路径的信息),请运行以下脚本。

EXEC sp_execute_external_script @language = N'R'
    , @script = N'
OutputDataSet <- data.frame(installed.packages()[,c("Package", "Version", "Depends", "License", "LibPath")]);'
WITH result sets((
            Package NVARCHAR(255)
            , Version NVARCHAR(100)
            , Depends NVARCHAR(4000)
            , License NVARCHAR(1000)
            , LibPath NVARCHAR(2000)
            ));

输出来自 R 中的 installed.packages(),并作为结果集返回。

结果

R 中安装的包

后续步骤

若要了解在通过 SQL 机器学习使用 R 时如何使用数据结构,请按照此快速入门操作: