在 Linux Centos 6.6 上使用 R 连接到 SQL Server

Posted

技术标签:

【中文标题】在 Linux Centos 6.6 上使用 R 连接到 SQL Server【英文标题】:Connecting to SQL server using R on Linux Centos 6.6 【发布时间】:2016-05-25 17:33:55 【问题描述】:

您好,我无法连接到同事为我设置的 SQL Server 数据库。我主要在 Linux Centos 6.6 机器上运行 R/Rstudio,但有时在 AWS EC2 实例和我的本地 Windows PC 上运行。过去,我连接到由其他人设置的 AWS Redshift,并且能够使用“src_postgres”dplyr 函数建立与它的连接。如果可能的话,我想建立一个类似“dplyr”选项的连接,这样我就可以重用我开发的一些代码来处理这些表。创建 SQL Server 数据库的人创建了用户名、密码和主机名 (***.net)。我使用 Windows 和 SAS 的同事能够使用他的 Windows 用户名/密码,我们在工作中使用该用户名/密码登录我们的 PC。我是否也可以使用该用户名/密码,因为它看起来也是我在 Linux 上的一个选项,还是我必须使用为我创建的特定用户名/密码?

我尝试对执行此操作的最佳方法进行一些研究,以下是我认为我应该如何执行此操作以及一些发现。看起来最好的选择是使用 RSQLServer (https://github.com/imanuelcostigan/RSQLServer),但我愿意接受其他建议(通过 https://support.rstudio.com/hc/en-us/articles/214510788-Setting-up-R-to-connect-to-SQL-Server- 使用 RODBC)。看起来我必须先下载/安装一些项目(例如驱动程序、sql.yaml)才能执行此操作。首先,我认为我需要为我的 Centos 系统安装正确的 SQL 服务器驱动程序(稍后为 EC2 实例安装)。对于我大部分时间使用的 Centos 系统,我可以/应该使用“Red Hat”驱动程序,因为我似乎无法为 Centos 找到一个?我还想知道如果我想使用我用于工作的 Windows 登录凭据,是否需要安装“身份验证驱动程序”(我是使用这个http://jtds.sourceforge.net/ 还是这个https://msdn.microsoft.com/en-us/library/hh568450(v=sql.110).aspx?)。此外,是否还需要安装“unixODBC”驱动程序 (https://msdn.microsoft.com/en-us/library/hh568449(v=sql.110).aspx)?一旦我安装了这些驱动程序(还有其他的吗?),我需要创建一个“sql.yaml”文件来提供我的服务器详细信息。但是,我不确定如何创建这个文件以及它应该放在哪里(例如,使用 Notepad++ 或创建文件并将文件放在工作目录中)?看起来我会在该文件中为我正在使用的 SQL 服务器创建一个单独的条目。我创建了一个“sql.yml”文件,我直接从这里 (https://github.com/imanuelcostigan/RSQLServer) 复制并放置在工作目录中。当我尝试在 Rstudio 中运行示例时,出现以下错误。

aw <- RSQLServer::src_sqlserver("AW", database = "AdventureWorks2012")
Error in rJava::.jcall(drv@jdrv, "Ljava/sql/Connection;", "connect", url,  : 
java.sql.SQLException: Unknown server host name 'AW'.

在尝试在该服务器上安装 ODBC 连接后,我还尝试了“odbcDriverConnect”R 功能,但收到以下错误。

dbConnect(RSQLServer::SQLServer(), server="****",         username="****",password="****", database = "****")
[RODBC] ERROR: state IM002, code 0, message [unixODBC][Driver Manager]Data   source name not found, and no default driver specified

我不确定 sql.yaml 文件是否正确或驱动程序是否有问题,我不确定接下来要尝试什么…… 我执行此操作的 linux IT 技能有限,但我可以按照说明进行操作... :) 我想知道是否有人可以提供有关我需要安装和设置以使其正常工作的详细信息(例如,在命令行中键入什么内容) .我怀疑我没有安装合适的驱动程序,我不确定要尝试哪个以及合适的命令是什么(例如,来自 jTDS、来自 Microsoft 等的命令?)。提前感谢你的帮助!

更新

感谢瓦伦丁!我可以使用 ODBC 连接在本地 Windows PC 上以这种方式连接,但无法使其与 Windows 上的 RSQLServer R 库函数一起使用。我确认我使用 R 与 Windows 操作系统连接,同时使用受信任的用户选项和 SQL 服务器上设置的用户名和密码。我还可以使用与 Rstudio 服务器的 JDBC 连接来连接到数据库(请参阅下面的内容)。

drv <- JDBC(
driverClass = "net.sourceforge.jtds.jdbc.Driver",
classPath = "/**** /RSQLServer/java/jtds-1.2.8.jar",
identifier.quote="`")

conn <- dbConnect(drv,
              "jdbc:jtds:sqlserver://****.net/DBTable",
              "userid",
              "password")

我的问题是我无法使用 ODBC 连接(ODBC(可能是 FreeTDS 驱动程序?)和/或 RSQLServer R 库(可能需要使用 jTDS 并注册它?)使用 Rstudio linux 服务器进行连接。我会想弄清楚如何使用“RSQLServer”R 库,这样我就可以利用 dplyr 后端连接,所以我想弄清楚这个选项。

我使用以下信息 (https://github.com/imanuelcostigan/RSQLServer) 创建了建议的 sql.yaml 文件,并将其放在我的 R 工作目录中。但是,当我尝试按照 RSQLServer github 站点上的示例运行尝试连接到此 SQL Server 数据集 (http://sqlblog.com/blogs/jamie_thomson/archive/2012/03/27/adventureworks2012-now-available-to-all-on-sql-azure.aspx) 时,我会出现以下错误:

#using driver specified above
aw <- dbConnect(drv, "AW", database = 'AdventureWorks2012')
Error in .verify.JDBC.result(jc, "Unable to connect JDBC to ", url) : 
Unable to connect JDBC to AW

#trying to use the connection specifid in the sql.yaml file
aw <- RSQLServer::src_sqlserver("AW", database = "AdventureWorks2012")
Error in rJava::.jcall(drv@jdrv, "Ljava/sql/Connection;", "connect", url,  : 
java.sql.SQLException: Unknown server host name 'AW'.

我认为 jTDS 驱动程序设置不正确,或者在 R 工作目录中创建 sql.yaml 文件时我没有做正确的事情(应该放在其他地方吗?)。再次感谢您的任何建议!

【问题讨论】:

【参考方案1】:

你试过吗?

SQL Server RODBC Connection https://support.rstudio.com/hc/en-us/articles/214510788-Setting-up-R-to-connect-to-SQL-Server-

【讨论】:

【参考方案2】:

凯文! 我正在尝试做同样的事情。将带有 RSQLServer 库的 Centos 6.5 连接到 MS-SQL 服务器。 它适用于 RODBC 和 FreeTDS 驱动程序,但我没有成功使用 RSQLServer。 看起来我已经成功连接(它看到了我的 tbls),但是“SELECT FROM ...”失败了

>res <- RSQLServer::src_sqlserver("printDB", database = "printlog")
>res
src:  SQLServer 10.50.1600 [sa@10.87.1.170:1433/printlog]
tbls: log, TEMPlog

> tbl(res, sql("SELECT * FROM TEMPlog"))
Error in rJava::.jnew("com/github/RSQLServer/MSSQLResultPull", rJava::.jcast(res@jr,  :
java.lang.ClassNotFoundException

我不知道那个错误是什么意思。所以我所了解的,这可能会对你有所帮助:

    您应该将 sql.yaml 文件放在您的用户主目录中。不在 R 主目录中。 看起来 RSQLServer 不适用于 Centos。在库页面上,安装部分https://github.com/imanuelcostigan/RSQLServer#installation 有信息表明它仅在 Windows 和 OSX 上进行了测试。所以我暂时忘记了它。

如果您能找到解决方案,如何使其发挥作用 - 请在此处发布信息。 如果您在配置 RODBC 方面需要帮助 - 我可以显示我的配置并分享一些链接。 附言对不起我的英语。

【讨论】:

欢迎来到 Stack Overflow!这没有提供问题的答案。要批评或要求作者澄清,请在他们的帖子下方发表评论 - 您可以随时对自己的帖子发表评论,一旦您获得足够的声誉,您就可以对任何帖子发表评论。如果您有一个相关但不同的问题,请提出一个引用该问题的新问题,如果它有助于提供上下文。

以上是关于在 Linux Centos 6.6 上使用 R 连接到 SQL Server的主要内容,如果未能解决你的问题,请参考以下文章

在Linux CentOS 6.6上安装Python 2.7.9

CentOS 6.6 中jdk1.6的安装和配置方法

CentOS 6.6 系统剪裁

CentOS 6.6 系统剪裁

CentOS 6.6 系统剪裁

Linux CentOS 6.6安装JDK1.7