1

我正在尝试在 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 连接(在此处引用):

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

但是是否有任何 DBI 连接到 Teradata 的示例?

4

3 回答 3

2

我在此处发布的解决方案适用于 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
```
于 2017-03-16T15:28:30.933 回答
1

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

于 2016-08-20T04:00:26.430 回答
1

你不能连接 DBI 包——它只定义了一个符合 DBI 的包必须实现的接口(想想模板)。你应该做的是使用 RJDBC 包——它实现了 DBI 方法。不要使用 RODBC,因为它没有实现 DBI 方法——我猜根据你的问题你需要 DBI。要使用 RJDBC 创建到 Teradata 的连接,您需要执行几个步骤。

您需要 Teradata 的 JDBC 驱动程序。您需要成为 Teradata 的客户才能获得此信息。

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

  • terajdbc4.jar
  • tdgssconfig.jar

将这些文件提取到系统上的已知位置。

现在您需要安装 install.packages('RJDBC') 包和依赖项。

由于 JDBC 是基于 Java 的,请确保您安装了最新的 Java 运行时。您可以在 java.com 上找到它 - 请注意您获得的 Java 版本(32 位或 64 位)与 R 的版本相同。上次我检查 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 文档以获取更多信息。

于 2016-08-19T05:12:35.137 回答