R 连接Oracle数据库
在分析任务中,需要将Oracle中部分数据提取出来,在R中进行进一步分析处理。
R主要有三种方式连接操作Oracle:
- RODBC
- ROracle
- RJDBC
其中RJDBC在性能和可伸缩性上都具有明显的局限性,基本不再推荐使用。
RODBC
RODBC是一个实现ODBC数据库连接的R包,通过ODBC方式及函数访问数据库,并将数据库表内容转化为R对象,支持sql操作,生成R对象为dataframe类型。
要保证RODBC使用,需要在系统中配置好ODBC连接,在Windows系统下配置方法
- 下载驱动包,包括base包和ODBC包,分别
instantclient-basic-
和instantclient-odbc-
开头,并保证版本一致。 - 解压上面两个包,把解压后的文件放在同一个目录,运行odbc_install.exe安装
- 在
ODBC数据源管理器
中进行Oracle ODBC Driver Configuration
更多内容参见[1]
RODBC使用方式如下,对于数据导出任务,RODBC是很便捷的实现方式。
library(RODBC)
# 创建连接
con <- odbcConnect("ora", uid="orcl", pwd="pw", rows_at_time = 500)
# 写入表数据
sqlSave(con, test_table, "TEST_TABLE")
# 执行查询
sqlQuery(con, "select count(*) from TEST_TABLE")
# 输出表数据
date <- sqlQuery(con, "select * from TEST_TABLE")
# 关闭连接
close(con)
ROracle
ROracle基于高性能OCI库,实现R与Oracle高性能连接,并支持事务级别的控制和用户提供的SQL语句的执行[2]。
ROracle依赖data.table
包,需提前安装。
ROracle配置方式
- 根据数据库版本,对应安装Oracle Instant Client
- 系统环境变量添加两个:OCI_INC以及OCI_LIB64,分别对应Client目录下
\oci\include
和\BIN
- 安装ROracle包
ROracle 连接使用如下
library(ROracle)
library(DBI)
drv <-dbDriver("Oracle")
con.string <- '(DESCRIPTION =
(ADDRESS = (PROTOCOL = TCP)(HOST = 127.0.0.1)(PORT = 1521))(CONNECT_DATA =(SERVER = server)(SERVICE_NAME = orcl)))'
con <- dbConnect(drv, username = "user", password = "pw", dbname = con.string)
rs <- dbSendQuery(con,"select * from TEST_TABLE")
data <- fetch(rs)
dbDisconnect(con)
性能
根据ROracle官方文档描述,其性能是最好的[3]。更为详细的评测可见此blog[4]
总之,ROracle优势在于其对应R的对象为data.table,并且支持数据类型同步,避免了很多跨平台转化的问题,在大数据量的情况下推荐使用。RODBC在各种平台上配置可能会有许多困难,因此在有配置好ODBC环境下,小数据量数据传输操作可以使用RODBC。我许多计算都是在数据库完成,R和Oracle交互主要是实现可视化,数据量相对较小,因此使用RODBC。