我正在尝试使用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联系的例子?
答案 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文件:
将这些文件解压缩到系统上的已知位置。
现在您需要安装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的维护者实现的方法。