關系型數據庫數據
關系型數據庫是目前企業數據存儲最常用的方案,常用的關系型數據庫系統有MySQL/Oracle/DB2等等。如果需要對這些數據庫編程一般有如下兩種方式:
- 廠家的專有API
這種方式一般采用廠家提供的開發包和專有API,優點是數據庫操作的性能比較高,且能使用一些廠家提供的數據庫專有的功能。缺點是各個廠家接口和開發平臺不統一,對于開發者學習成本較高。
- 數據庫驅動
這種方式一般通過一種數據庫中間件提供操作API。中間件直接使用各個廠家提供的驅動包,對上層開發提供統一的API接口。優點是所有數據庫的操作可以通過一套API解決,開發者的學習成本低,且開發簡單。缺點是性能相比上一中方式要差一些,且無法使用一些數據庫的專有功能。常見的數據庫連接中間件有ODBC和JDBC。ODBC主要用于Windows平臺的數據庫連接,且大多使用C/C++語言來進行連接數據庫。JDBC是專門針對Java的數據庫連接工具,使用更加廣泛,且跨平臺。
在R環境中,我們可以通過rJava包來使用JDBC連接數據庫。既然是采用JDBC連接數據庫,那么所有的關系型數據庫,只要能支持JDBC連接的,都可以采用下面內容中方式來進行連接,所不同的是驅動包而已。
下面就以MySQL為例,詳細描述如何使用R來連接關系型數據庫中的表。
假設MySQL中存在stu表,字段分別為stu_no(學號),stu_name(學生姓名),stu_age(學生年齡)
# 建表語句
CREATE TABLE STU(
STU_NO INT PRIMARY KEY,
STU_NAME VARCHAR(32) ,
STU_AGE INT );
#插入數據
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中執行以后,可以通過查詢語句來驗證數據插入成功:
SELECT * FROM STU;
數據準備好了以后我們就可以通過R來連接MySQL數據庫了。因為是通過JDBC來進行連接,所以需要知道MySQL的連接參數:IP地址、用戶名、密碼、數據庫名。假設測試環境中的MySQL上述參數為:
- IP: 192.168.56.1
- 用戶名:root
- 密碼:root
- 數據庫名:test
直接在命令行下輸入R進入環境:
root@hostname# R
安裝所需要的R包:
install.package("rJava")
install.package("DBI")
install.package("RJDBC")
library('rJava')
library('DBI')
library('RJDBC')
下載MySQL的JDBC驅動包,點我下載.
將下載的jar包保存在當前目錄下,假設當前目錄為/home/test/,那么MySQL的驅動包保存的完全路徑為:
/home/test/mysql-connector-java-5.1.30-bin.jar
那么在R中輸入如下命令加載驅動:
drv <- JDBC(“com.mysql.jdbc.Driver”, “/home/test/mysql-connector-java-5.1.30-bin.jar”) //加載驅動
上述drv為加載以后的驅動,使用該驅動即可鏈接數據庫:
conn <- dbConnect(drv, “jdbc:mysql://192.168.56.1:3306/test”, “root”, “root”) //建連接
jdbc:mysql://192.168.56.1:3306/test
為jdbc連接參數,格式為:jdbc:mysql://ip:3306/dbname
,其中ip和dbname分別為MySQL的IP地址和數據庫名稱。上述語句中的conn為建立的連接參數。
然后利用建立的連接就可以進行查詢了:
dt = dbGetQuery(conn,“select * from stu”) //測試連接
dt就是查詢出來的結果集,在R中自動轉換成為dataframe類型。那么我們可以方便的使用head來查看其中的內容:
head(dt)
這樣數據就從關系型數據庫加載到R中了。