使用 DBI 将 R 连接到 Teradata 以与 knitr 一起使用
Connect R to Teradata using DBI for use with knitr
我正在尝试在 knitr 中使用 SQL 引擎:http://rmarkdown.rstudio.com/authoring_knitr_engines.html#sql
文档指出 "to use the knitr SQL engine you first need to establish a DBI connection to a database"
它提供了以下示例:
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")
但是有没有 DBI 连接到 Teradata 的例子?
您无法连接 DBI 包 - 它只定义了 DBI 兼容包必须实现的接口(想想模板)。你应该做的是使用 RJDBC 包——它实现了 DBI 方法。不要使用 RODBC,因为它没有实现 DBI 方法——根据您的问题,我猜您需要 DBI。要使用 RJDBC 创建到 Teradata 的连接,您需要执行几个步骤。
您需要来自 Teradata here 的 JDBC 驱动程序。您需要成为 Teradata 的客户才能获得此功能。
如果您下载并查看 zip 或 tar 文件,您会发现两个 jar 文件:
- terajdbc4.jar
- tdgssconfig.jar
将这些文件提取到系统上的已知位置。
现在您需要安装 install.packages('RJDBC') 包和依赖项。
由于 JDBC 是基于 Java 的,请确保您安装了最新的 Java 运行时。您可以在 java.com 获取它 - 请注意您获得的 Java 版本与 R 版本相同(32 或 64 位)。上次我查看 java 站点没有尝试为您解决这个问题。如果您必须安装 Java,请确保您重新tar您的 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 了解更多信息。
此外,如果您想在 knitr 中使用 SQL 代码块引擎,则 knitr 的当前版本不能与 RJDBC 的当前版本一起使用。 RJDBC 没有实现 DBI 方法 dbGetRowCount。作为快速修复,我删除了对行数的检查/现在你可以从 github 在 mattwg/knitr 安装包。对于某些用例,它可能会失败。我将尝试获取 RJDBC 维护者实现的方法。
我发布的解决方案 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
```
我正在尝试在 knitr 中使用 SQL 引擎:http://rmarkdown.rstudio.com/authoring_knitr_engines.html#sql
文档指出 "to use the knitr SQL engine you first need to establish a DBI connection to a database"
它提供了以下示例:
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")
但是有没有 DBI 连接到 Teradata 的例子?
您无法连接 DBI 包 - 它只定义了 DBI 兼容包必须实现的接口(想想模板)。你应该做的是使用 RJDBC 包——它实现了 DBI 方法。不要使用 RODBC,因为它没有实现 DBI 方法——根据您的问题,我猜您需要 DBI。要使用 RJDBC 创建到 Teradata 的连接,您需要执行几个步骤。
您需要来自 Teradata here 的 JDBC 驱动程序。您需要成为 Teradata 的客户才能获得此功能。
如果您下载并查看 zip 或 tar 文件,您会发现两个 jar 文件:
- terajdbc4.jar
- tdgssconfig.jar
将这些文件提取到系统上的已知位置。
现在您需要安装 install.packages('RJDBC') 包和依赖项。
由于 JDBC 是基于 Java 的,请确保您安装了最新的 Java 运行时。您可以在 java.com 获取它 - 请注意您获得的 Java 版本与 R 版本相同(32 或 64 位)。上次我查看 java 站点没有尝试为您解决这个问题。如果您必须安装 Java,请确保您重新tar您的 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 了解更多信息。
此外,如果您想在 knitr 中使用 SQL 代码块引擎,则 knitr 的当前版本不能与 RJDBC 的当前版本一起使用。 RJDBC 没有实现 DBI 方法 dbGetRowCount。作为快速修复,我删除了对行数的检查/现在你可以从 github 在 mattwg/knitr 安装包。对于某些用例,它可能会失败。我将尝试获取 RJDBC 维护者实现的方法。
我发布的解决方案 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
```