關(guān)系型數(shù)據(jù)庫(kù)數(shù)據(jù)
關(guān)系型數(shù)據(jù)庫(kù)是目前企業(yè)數(shù)據(jù)存儲(chǔ)最常用的方案,常用的關(guān)系型數(shù)據(jù)庫(kù)系統(tǒng)有MySQL/Oracle/DB2等等。如果需要對(duì)這些數(shù)據(jù)庫(kù)編程一般有如下兩種方式:
- 廠家的專有API
這種方式一般采用廠家提供的開發(fā)包和專有API,優(yōu)點(diǎn)是數(shù)據(jù)庫(kù)操作的性能比較高,且能使用一些廠家提供的數(shù)據(jù)庫(kù)專有的功能。缺點(diǎn)是各個(gè)廠家接口和開發(fā)平臺(tái)不統(tǒng)一,對(duì)于開發(fā)者學(xué)習(xí)成本較高。
- 數(shù)據(jù)庫(kù)驅(qū)動(dòng)
這種方式一般通過一種數(shù)據(jù)庫(kù)中間件提供操作API。中間件直接使用各個(gè)廠家提供的驅(qū)動(dòng)包,對(duì)上層開發(fā)提供統(tǒng)一的API接口。優(yōu)點(diǎn)是所有數(shù)據(jù)庫(kù)的操作可以通過一套API解決,開發(fā)者的學(xué)習(xí)成本低,且開發(fā)簡(jiǎn)單。缺點(diǎn)是性能相比上一中方式要差一些,且無法使用一些數(shù)據(jù)庫(kù)的專有功能。常見的數(shù)據(jù)庫(kù)連接中間件有ODBC和JDBC。ODBC主要用于Windows平臺(tái)的數(shù)據(jù)庫(kù)連接,且大多使用C/C++語(yǔ)言來進(jìn)行連接數(shù)據(jù)庫(kù)。JDBC是專門針對(duì)Java的數(shù)據(jù)庫(kù)連接工具,使用更加廣泛,且跨平臺(tái)。
在R環(huán)境中,我們可以通過rJava包來使用JDBC連接數(shù)據(jù)庫(kù)。既然是采用JDBC連接數(shù)據(jù)庫(kù),那么所有的關(guān)系型數(shù)據(jù)庫(kù),只要能支持JDBC連接的,都可以采用下面內(nèi)容中方式來進(jìn)行連接,所不同的是驅(qū)動(dòng)包而已。
下面就以MySQL為例,詳細(xì)描述如何使用R來連接關(guān)系型數(shù)據(jù)庫(kù)中的表。
假設(shè)MySQL中存在stu表,字段分別為stu_no(學(xué)號(hào)),stu_name(學(xué)生姓名),stu_age(學(xué)生年齡)
# 建表語(yǔ)句
CREATE TABLE STU(
STU_NO INT PRIMARY KEY,
STU_NAME VARCHAR(32) ,
STU_AGE INT );
#插入數(shù)據(jù)
INSERT INTO STU(STU_NO, STU_NAME, STU_AGE) VALUES(1000001, 'zs', 23);
INSERT INTO STU(STU_NO, STU_NAME, STU_AGE) VALUES(1000002, 'ls', 20);
INSERT INTO STU(STU_NO, STU_NAME, STU_AGE) VALUES(1000003, 'ww', 21);
INSERT INTO STU(STU_NO, STU_NAME, STU_AGE) VALUES(1000004, 'xxs', 22);
上述腳本在MySQL中執(zhí)行以后,可以通過查詢語(yǔ)句來驗(yàn)證數(shù)據(jù)插入成功:
SELECT * FROM STU;

數(shù)據(jù)準(zhǔn)備好了以后我們就可以通過R來連接MySQL數(shù)據(jù)庫(kù)了。因?yàn)槭峭ㄟ^JDBC來進(jìn)行連接,所以需要知道MySQL的連接參數(shù):IP地址、用戶名、密碼、數(shù)據(jù)庫(kù)名。假設(shè)測(cè)試環(huán)境中的MySQL上述參數(shù)為:
- IP: 192.168.56.1
- 用戶名:root
- 密碼:root
- 數(shù)據(jù)庫(kù)名:test
直接在命令行下輸入R進(jìn)入環(huán)境:
root@hostname# R

安裝所需要的R包:
install.package("rJava")
install.package("DBI")
install.package("RJDBC")
library('rJava')
library('DBI')
library('RJDBC')
下載MySQL的JDBC驅(qū)動(dòng)包,點(diǎn)我下載.
將下載的jar包保存在當(dāng)前目錄下,假設(shè)當(dāng)前目錄為/home/test/,那么MySQL的驅(qū)動(dòng)包保存的完全路徑為:
/home/test/mysql-connector-java-5.1.30-bin.jar
那么在R中輸入如下命令加載驅(qū)動(dòng):
drv <- JDBC(“com.mysql.jdbc.Driver”, “/home/test/mysql-connector-java-5.1.30-bin.jar”) //加載驅(qū)動(dòng)
上述drv為加載以后的驅(qū)動(dòng),使用該驅(qū)動(dòng)即可鏈接數(shù)據(jù)庫(kù):
conn <- dbConnect(drv, “jdbc:mysql://192.168.56.1:3306/test”, “root”, “root”) //建連接
jdbc:mysql://192.168.56.1:3306/test為jdbc連接參數(shù),格式為:jdbc:mysql://ip:3306/dbname,其中ip和dbname分別為MySQL的IP地址和數(shù)據(jù)庫(kù)名稱。上述語(yǔ)句中的conn為建立的連接參數(shù)。
然后利用建立的連接就可以進(jìn)行查詢了:
dt = dbGetQuery(conn,“select * from stu”) //測(cè)試連接
dt就是查詢出來的結(jié)果集,在R中自動(dòng)轉(zhuǎn)換成為dataframe類型。那么我們可以方便的使用head來查看其中的內(nèi)容:
head(dt)
這樣數(shù)據(jù)就從關(guān)系型數(shù)據(jù)庫(kù)加載到R中了。