跳转至

R集成#

简介#

从SQL Server 2016发布起,Microsoft在安装中随附了一个开放源代码版本的R,以及由Microsoft提供且支持分布式和/或并行处理的包。

运行R脚本的能力通过一项新功能实现:SQL Server R Services。

该架构的设计支持使用R的外部脚本在与SQL Server不同的进程中运行,并允许在SQL Server引擎与R之间传递数据。

在SQL Server“内部”运行的R代码通过调用存储过程来执行。因此,任何可以进行存储过程调用的应用程序都可以启动R代码的执行。此后,SQL Server管理R代码的执行,如下图所示:

rintegration01

  1. 对R运行时的请求由传递给存储过程sp_execute_external_script的参数@language='R'指示。SQL Server将此请求发送到启动板服务
  2. 启动板服务启动相应的启动程序;此时是RLauncher
  3. RLauncher启动外部R进程
  4. BxlServer与R运行时协调,以管理与SQL Server的数据交换和处理结果的存储
  5. SQL Satellite管理与SQL Server有关的任务和进程的通信
  6. BxlServer使用SQL Satellite向SQL Server传达状态和结果
  7. SQL Server获得结果并关闭相关任务和进程

在使用R语言集成之前,您必须先为您的SQL Server实例启用对外部脚本的支持,但在此之前,您必须确保R Services已正确安装并正常运行。请参阅设置SQL Server R Services(数据库内) ⧉,以了解如何安装和配置SQL Server R集成。

安装检查清单#

要检查R集成是否成功完成,并运行第一个测试脚本,请执行以下步骤:

  1. 使用SQL Server Management Studio连接到SQL Server数据库(其中应已安装了R Services)
  2. 运行exec sp_configure并检查“external scripts enabled”变量。如果running值已经设为1,请转至步骤6。否则,请继续执行下一步
  3. 运行 exec sp_configure 'external scripts enabled',1; reconfigure with override;
  4. 重新启动SQL Server服务。这还应重新启动SQL Server可信启动板服务。
  5. 重新运行exec sp_configure 'external scripts enabled',并检查running值。现在此值应已设置为1
  6. 运行以下测试脚本:
exec sp_execute_external_script  @language =N'R', @script=N'OutputDataSet<-InputDataSet', @input_data_1 =N'select 1 as hello' with result sets (([hello] int not null));
go

如果所有步骤都正确执行,则应获得以下结果:

rintegration02

使用外部工具#

您也可以使用RStudio ⧉等R客户端连接到SQL Server R Services。

SQL Server与RStudio之间的连接是使用RODBC库建立的。在使用RODBC包之前,必须在RStudio中安装RODBC包。

启动RStudio后,打开命令窗口并运行Install.packages("RODBC")。这将下载并安装所有必要的包和功能。

正确安装后,请运行library(RODBC)以在当前环境中加载库。

现在,您可以使用以下命令连接到SQL Server:(请更改“SQL Server服务器名称”和“数据库名称”,以与您的凯睿德制造软件MES安装相匹配,例如CMF-VM-CLT-DB1\ONLINE2016ProductionODS

cn<-odbcDriverConnect(connection="Driver={SQL Server Native Client 11.0};server=<SQL Server Server name>;database=<Database Name>;trusted_connection=yes;")

“cn”变量现在保存了SQL Server连接,必须使用它来检索数据并将数据直接保存到SQL Server

示例:

table<-sqlFetch(cn,"table name",colnames=FALSE,rows_at_time=1000)
machinefailuresdata<-sqlQuery(cn,"select * from analytics.MachineFailures")
sqlSave(cn,machinefailuresdata, rownames=FALSE, tablename="MachineFailures_R",colname=FALSE,append=FALSE)
odbcClose(cn)

有关详细的包文档和使用示例,请参阅“RODBC”包 ⧉

凯睿德制造软件MES R集成#

凯睿德制造软件MES使用R集成构建丰富的内容图形和统计信息分析。可以创建丰富的内容图形,并配合使用SQL Server报表生成器,直接以图像形式显示在报表中。

为了实现这一目标,凯睿德制造软件MES建立了一组过程,这些过程已经处理了必要的R连接、图像处理和清理,因此可以无缝集成。

除了标准的R图形库(Graphics)外,凯睿德制造软件MES还使用GGplot2Lattice ⧉库。

对于统计分析,凯睿德制造软件MES使用CARStats ⧉库。

由于这些库并不包含在R标准发行程序包中,您必须从CRAN ⧉下载并安装它们。安装必须使用管理权限,并且直接在运行R Services的服务器(SQL Server也在相同位置运行)中完成。

为此,请执行以下步骤:

  1. 打开与运行SQL Server的服务器之间的远程连接
  2. 使用管理权限打开命令提示符
  3. 转到C:\Program Files\Microsoft SQL Server\MSSQL13.MSSQLSERVER\R_SERVICES\bin或R Services二进制文件所在的位置
  4. 通过该目录中的R.exe应用程序,可以直接打开一个运行R安装额终端
  5. 运行R.exe,以便直接从互联网或zip文件安装必要的包
  6. 要从CRAN(通过互联网访问)安装包,只需运行install.packages("package_name")命令。此命令会妥善处理下载、其依赖项以及所需包的安装
  7. 要从本地zip文件安装包,请键入 install.packages("package_zip_file_name", repos=null)

ggplot2latticecarstats运行步骤6或7。完成此操作后,您当前的R安装和凯睿德制造软件MES程序包即可广泛地使用这些包。

可用的凯睿德制造软件MES R包#

如前所述,为了实现对R Services的访问,凯睿德制造软件MES安装内置了一组存储过程,这些过程包括一组有用的R图形和统计函数。这些函数可以通过SQL Server Reporting Services(图形和统计信息)或SQL Server Management Studio(统计信息)直接访问。

每个图形过程的输出都是一个二进制字符串,以jpeg格式表示结果。然后,通过创建具有以下通用过程调用的数据集,可以在SQL Server报表生成器中直接将此输出字符串用作图像:

DECLARE @id uniqueidentifier=NEWID()
exec p_dynamic_plot
    @id,@DependentVar,@IndependentVar,@Parameter3,@Parameter4,
    @Table,
    @GraphName,
    @Flip,
    @Position,
    @Width,
    @Scalefill,
    @FacetWrap,
    @Smooth,
    @Jitter,
    @DateTimeColumn,
    @BeginDate,
    @EndDate,
    @AdditionalFilter

SELECT plot FROM GraphPlots where identifier=@id
DELETE FROM GraphPlots where identifier=@id

这将创建一个包含一列(绘图)和一条记录的数据集。此列将包含代表jpeg图像的二进制字符串。

然后,您可以向报表中添加图像对象,指定源为“数据库”、MIME类型为图像/jpeg,然后选择该字段作为包含以下内容的表达式:=First(Fields!plot.Value, "Plot") (此代码假定上述创建的数据集名为“Plot”)

rintegration03

rintegration04

rintegration05

统计检验返回键/值(K/V)对数据集。这些K/V对在每个单独检验中都有所不同,它们代表检验本身的输出。

与图形集成类似,统计检验也可以与SQL Server报表生成器配合使用。为此,请使用通用过程调用创建数据集:

DECLARE @id uniqueidentifier=NEWID()

exec p_dynamic_statistic_test @id,
                              @TestName,
                              @Table,
                              @DependentVar,
                              @IndependentVar,
                              @Parameter3,
                              @DateTimeColumn,
                              @BeginDate,
                              @EndDate,
                              @AdditionalFilter,
                              @Paired,
                              @Method,
                              @Alternative,
                              @ConfidenceLevel,
                              @Ordered,
                              @MedianTest

SELECT * FROM StatisticsTestTable where identifier=@id
DELETE FROM StatisticsTestTable where identifier=@id

这将输出一个包含四列(行号、描述、值和标识符)的表。数据集将包含输出检验结果所必需的行数。

rintegration06

然后,您可以通过使用以下配置创建矩阵,将此数据集作为数据透视表插入到报表中:

rintegration07

图形#

凯睿德制造软件MES包含一组存储过程,用作R图形函数的包装器。这些过程的主要入口点是dbo.p_dynamic_plot。此过程可接受多个参数。某些参数在所有图形过程之间共享(例如,包含原始数据的表名称),而其他参数则是可选的,具体取决于调用的图形类型。

PROCEDURE p_dynamic_plot(@id uniqueidentifier,
       @Parameter1 nvarchar(256),
       @Parameter2 nvarchar(256),
       @Parameter3 nvarchar(256),
       @Parameter4 nvarchar(256),
       @Table varchar(256),
       @GraphName varchar(256),
       @Flip integer,
       @Position nvarchar(256),
       @Width Decimal,
       @Scalefill nvarchar(256),
       @FacetWrap integer,
       @Smooth integer,
       @Jitter integer,
       @DateTimeColumn varchar(256),
       @BeginDate datetime,
       @EndDate datetime,
       @AdditionalFilter varchar(256))
参数名称 描述
@id 内部标识符
@Parameter1 图表的列名,例如:“湿度"。此列名必须与输入数据集的一个列名匹配(@Table)
@Parameter2,@Parameter3,@Parameter4 可选参数,用于指定依赖项、数字变量或分类变量。这些值取决于调用的图形类型,并且始终引用@Table输入参数
@Table 包含原始数据或数据集的表名称。这可以是任何数据库对象(表、视图或函数),前提是在分析架构中创建了该对象
@GraphName 要创建的图形名称
@Flip 坐标翻转(0 - 否,1 - 是)
@Position 如设为“identity”,则使用默认定位;如设为“dodge”,则并排分组
@Width 直方图中的条形宽度
@Scalefill 配色方案。“none”- 标准,“blue”或“grey”
@FacetWrap 按分面类型分组(0 - 否,1 - 是)
@Smooth 在ggplot2 ScatterPlot中使用线性平滑线(0 - 否,1 - 是)
@Jitter 使用ggplot2为盒须图的每个点的位置添加少量随机变化
@DateTimeColumn 标识输入数据集中的一个日期时间列(@Table)
@BeginDate 使用@DateTimeColumn筛选数据时非常有用
@EndDate 同上
@AdditionalFilter 额外筛选器子句,例如:“where/and Temperature>60”。如果与@DatetimeColumn一起使用,请使用“and”,否则使用“where”

Table: R - 图形

下表描述了所有可用的图形类型以及它们实现的R函数

图形名称 R包 R函数
MultipleRegressionPlot 图形 ⧉ lm ⧉
Estimate-Real Plot 图形 ⧉ lm,使用abline ⧉
Barplot ggplot2 ⧉ geom_bar ⧉
Barplot2Var ggplot2 ⧉ geom_bar ⧉,使用两个变量
StackedBarplot ggplot2 ⧉ geom_bar ⧉
直方图 ggplot2 ⧉ geom_histogram ⧉
Scatterplot ggplot2 ⧉ geom_point ⧉
StripPlot ggplot2 ⧉ geom_point ⧉
Boxplot ggplot2 ⧉ geom_boxplot ⧉
Boxplot1var ggplot2 ⧉ geom_boxplot ⧉
AreaGraph ggplot2 ⧉ geom_area ⧉
DensityGraph ggplot2 ⧉ geom_density ⧉
LevelPlot ggplot2 ⧉ geom_tile ⧉
StackedDensity ggplot2 ⧉ geom_density ⧉
QqPlot ggplot2 ⧉ geom_qq ⧉
CirclePlot ggplot2 ⧉ geom_barcoord_polar ⧉
StackedAreaGraph ggplot2 ⧉ geom_area ⧉
DotPlot ggplot2 ⧉ geom_dotplot ⧉
LinePlot ggplot2 ⧉ geom_line ⧉
BoxplotLattice lattice ⧉ bwplot ⧉
DensityLattice lattice ⧉ densityplot ⧉
QqplotLattice lattice ⧉ qqmath ⧉
3DScatterPlotLattice lattice ⧉ cloud ⧉
ScatterPlotLattice lattice ⧉ xyplot ⧉
HistogramLattice lattice ⧉ histogram ⧉
StripPlotLattice lattice ⧉ stripplot ⧉
LevelPlotLattice lattice ⧉ levelplot ⧉
BarchartLattice lattice ⧉ barchart ⧉
WireframeLattice lattice ⧉ wireframe ⧉
ContourPlotLattice lattice ⧉ contourplot ⧉

Table: R - 可用的图形类型

统计检验#

与图形过程类似,所有统计检验过程都以名为dbo.p_dynamic_statistic_test的通用存储过程包装。此过程也可接受多个参数。某些参数在所有统计过程之间共享(例如,包含原始数据的表名称),而其他参数则是可选的,具体取决于调用的检验类型。

PROCEDURE p_dynamic_statistic_test(@id uniqueidentifier,
           @TestName varchar(256),
           @Table varchar(256),
           @Parameter1 nvarchar(256),
           @Parameter2 nvarchar(256),
           @Parameter3 nvarchar(256),
           @DateTimeColumn varchar(256) NULL,
           @BeginDate datetime NULL,
           @EndDate datetime NULL,
           @AdditionalFilter varchar(256) NULL,
           @Paired integer NULL,
           @methodCor varchar(256) NULL,
           @alternat varchar(256)NULL,
           @conflevel float NULL,
           @Ordered integer,
           @median integer)
参数名称 描述
@id 内部标识符
@TestName 要运行的检验名称
@Table 包含原始数据或数据集的表名称。这可以是任何数据库对象(表、视图或函数),前提是在分析架构中创建了该对象
@Parameter1 以逗号分隔的检验列名称,例如:“Humidity,Temperature”。这些值取决于调用的检验类型,并且始终引用@Table输入参数
@Parameter2 以逗号分隔的检验列名称(可选),例如:“Humidity,Temperature”。同上
@Parameter3 检验列名称(可选),例如:“湿度"。同上
@DateTimeColumn 标识输入数据集中的一个日期时间列(@Table)
@BeginDate 使用@DateTimeColumn筛选数据时非常有用
@EndDate 同上
@AdditionalFilter 额外筛选器子句,例如:“where/and Temperature>60”。如果与@DatetimeColumn一起使用,请使用“and”,否则使用“where”
@Paired 可选检验参数(0 - 样本未配对,1 - 样本已配对)
@methodCor 可选的相关性方法名称(“kendall”、“pearson”或“spearman”)
@Alternat 检验相关参数,表示备选假设中的自相关符号(“two.sided”、“less”或“greater”)
@ConfLevel 返回置信区间的置信水平。默认值为0.95 (95%)
@Ordered 一个逻辑值,指示是否应在取差异之前根据样本中的递增平均值对因子水平进行排序(0 - 未排序,1 - 已排序)
@Median 指定用于构成空假设的可选参数的数字(Wilcoxon检验)

Table: R - 统计检验

下表描述了所有可用的统计检验类型以及它们实现的R函数

检验名称 R包 R函数 描述
MultipleRegression stats ⧉ lm ⧉ 拟合线性模型
Anova stats ⧉ anova ⧉ Anova表
Durbin car ⧉ durbinWatsonTest ⧉ 针对自相关误差的Durbin-Watson检验
Levene car ⧉ leveneTest ⧉ Levene检验
Tukey stats ⧉ TukeyHSD ⧉ 计算图基释释义可靠的显著差异
Outlier car ⧉ outlierTest ⧉ Bonferroni离群值检验
Correlation stats ⧉ cor.test ⧉ 配对样本之间的关联性/相关性检验
Covariance stats ⧉ cov ⧉ 相关性、方差和协方差(矩阵)
Ttest stats ⧉ t.test ⧉ Student T检验
OneSampletest stats ⧉ t.test ⧉ 单样本Student T检验
ChisqTest stats ⧉ chisq.test ⧉ 计数数据的Pearson卡方检验
Shapiro stats ⧉ shapiro.test ⧉ Shapiro-Wilk正态检验
Smirnov stats ⧉ ks.test ⧉ Kolmogorov-Smirnov检验
Wilcoxon stats ⧉ wilcox.test ⧉ Wilcoxon秩和与符号秩和检验
Friedman stats ⧉ friedman.test ⧉ Friedman秩和检验

Table: R - 统计检验类型