使用DBI将R连接到Teradata以与knitr一起使用

时间:2016-08-10 16:28:15

标签: sql r knitr teradata r-dbi

我正在尝试使用knitr中的SQL引擎:http://rmarkdown.rstudio.com/authoring_knitr_engines.html#sql

文档说明“使用knitr SQL引擎首先需要建立与数据库的DBI连接”

它提供了以下示例:

library(DBI)
db <- dbConnect(RSQLite::SQLite(), dbname = "sql.sqlite")

现在我正在尝试连接到Teradata。我过去使用RODBC和RJDBC软件包成功完成了这项工作,并且有相当多的有用文档。我没有直接通过DBI包连接,但是,我也找不到任何示例。

我猜测语法类似于RJDBC连接(引用here):

drv = JDBC("com.teradata.jdbc.TeraDriver","ClasspathForTeradataJDBCDriverFiles") 
conn = dbConnect(drv,"jdbc:teradata://DatabaseServerName/ParameterName=Value","User","Password") 
dbGetQuery(conn,"SQLquery")

但是有没有与Teradata建立DBI联系的例子?

3 个答案:

答案 0 :(得分:2)

我发布的here解决方案适用于Teradata。我使用odbc包和Windows ODBC数据源管理器。下面的RMarkdown示例:

```{r}
# Unfortunately, odbc is not on CRAN yet
# So we will need devtools
# install.packages(devtools)
library(devtools)
devtools::install_github("rstats-db/odbc")

# Get connection info from the Windows ODBC Data Source Administrator using the name you set manually. 
# If you don't know what this is, just search in the windows start menu for     "ODBC Data Source Administrator"
con <- dbConnect(odbc::odbc(), 'MyDataWarehouse')
```

```{sql connection = con, output.var = result}
-- This is sql code, comments need to be marked accordingly
SELECT * FROM SOMETABLE LIMIT 200;
```

```{R}
# And the result is available in the next chunk!
result
```

答案 1 :(得分:1)

您无法连接DBI包 - 它只定义了DBI兼容包必须实现的接口(思考模板)。你应该做的是使用RJDBC包 - 它实现了DBI方法。不要使用RODBC,因为它没有实现DBI方法 - 我猜你需要根据你的问题进行DBI。要使用RJDBC创建与Teradata的连接,您需要执行几个步骤。

您需要来自Teradata here的JDBC驱动程序。您需要成为Teradata的客户才能实现这一目标。

如果你下载并查看zip或tar文件,你会发现两个jar文件:

  • terajdbc4.jar
  • tdgssconfig.jar

将这些文件解压缩到系统上的已知位置。

现在您需要安装install.packages(&#39; RJDBC&#39;)包和依赖项。

由于JDBC是基于Java的,因此请确保安装了最新的Java Runtime。你可以在java.com上选择这个 - 只要注意你得到的是与你相同版本的Java(32或64位)。上次我检查了java网站时没有尝试为你解决这个问题。如果必须安装Java,请确保重新启动R会话。

现在您应该可以加载RJDBC库并创建连接 - 您需要知道要连接的teradata系统的ip / url,以及您的用户名和密码。您还需要指定要连接的数据库:

library(RJDBC)

jars <- c("[path to jar]/terajdbc4.jar", "[path to jar]/tdgssconfig.jar")
drv <- JDBC("com.teradata.jdbc.TeraDriver",jars)
db <- "jdbc:teradata://[ip of teradata system]/TMODE=TERADATA,charset=UTF8"
conn <- dbConnect(drv, db, username, password, database )

通过此连接,您现在可以使用实现的DBI方法来查询数据库 - 例如dbGetQuery(conn,sql)或dbSendQuery()。

查看RJDBC docs了解详情。

答案 2 :(得分:1)

另外,如果你想在knitr中使用SQL代码块引擎,knitr的当前版本不适用于RJDBC的当前版本。 RJDBC没有实现DBI方法dbGetRowCount。作为一个quickfix,我删除了对行数的检查/现在你可以从macwub / knitr的github安装包。某些用例可能会失败。我将尝试使用RJDBC的维护者实现的方法。