前面介紹了csv、txt、xlsx等常用數據格式的讀入,這些文件通常都是獨立的小規模數據的存放地。如果需要存儲分析的數據高達千萬級甚至更多,比如一個公司的交易運營信息,這些文件就無法滿足要求了。這時,就要用到資料庫。

資料庫擁有一種獨特的數據結構和數據存儲方式,這讓它不僅能存儲更大量的信息,而且還具備數據共享性好,獨立性高,冗餘度小等眾多優點,是存儲、查詢和處理中大型數據的好手。然而另一方面,如果要進行複雜的統計建模,資料庫就不擅長了。所以實際中通常用資料庫存,用R建模,這中間就涉及軟體間數據的傳輸。因此本節就來介紹:如何從R軟體讀取資料庫數據,又如何通過R對資料庫進行簡單操作。這裡主要以大家最常見的MySQL資料庫為例詳細介紹流程。

讀入資料庫的基本操作分為三大步:(1)連接資料庫;(2)與資料庫進行交互;(3)關閉連接。讀取MySQL資料庫採用的包是RMySQL,下面就以movie數據及部分內置數據為例介紹如何使用這個包讀寫數據。如果電腦上還沒有MySQL,可以移步其官網上下載。Windows用戶可以直接在MySQL on Windows頁面下載,而Mac用戶可以在MySQL Community Server中下載並按提示即可(此處使用MySQL版本為 5.7.23:dev.mysql.com/downloads, 安裝步驟見附錄1(此處只提供MAC版本,Windows版本安裝過程類似))。

首先補充一個基礎知識:MySQL是一個資料庫管理系統,它裡面可以存放很多資料庫,而每個資料庫中又可以存放很多表格,因此我們在用R連接資料庫前首先要明確自己要連的是哪個資料庫。下面我們展示如何用R實現與一個空資料庫(demo)的交互(參閱附錄2查看如何通過終端建一個新的空資料庫)。

01建立R與資料庫連接

操作資料庫的第一步,就是要建立R軟體和資料庫的連接,主要使用的是dbConnect()函數,其基本使用方法是:dbConnect(MySQL(), dbname, user, password, host, port)。MySQL()是建立一個資料庫實例,直接照此輸入即可;dbname是要讀取的數據所在的資料庫名稱,這裡輸入demo即可;user,password是登錄資料庫所需要的用戶名及密碼,如果你按照默認模式安裝過來,用戶名就默認為root, 密碼就是你在安裝過程中記錄下來的臨時密碼,可參見附錄1說明。此處已將臨時密碼修改為「123456」。最後兩個參數,host是主機(默認本機主機是localhost),port就是要登錄的埠(默認本機埠為3306)。如果是本地登錄,後兩個參數可以省略,因為它會默認到本地連介面處,但如果是遠程登錄,就需要具體輸入想要連接的主機和埠。

在成功運行這兩句命令之後,R和MySQL交互的介面就被打通。它返回的就是一個可以直接使用的資料庫對象(比如這裡的con),下面就可以暢快地進行數據的交換了。

02MySQL數據操作

01

將數據寫入資料庫

面對一個空資料庫,我們首先需要把R裏的數據寫進去。採用的命令是dbWriteTable()。它的基本使用方式是:dbWriteTable(資料庫對象,數據表名稱,想要傳的數據對象)。這裡需要將R裏內置的數據集cars以及剛讀入R中的數據集movie寫入資料庫,可按照如下操作。其中,row.names用來設置不把R中數據框的行名寫進資料庫):

02

查看資料庫

寫完數據後,我們可使用dbListTables()函數羅列該資料庫中已有的表,對於不需要的表也可以使用dbRmoveTable(con)來移除。

03

讀入數據

資料庫裏有了數據,我們就可以從庫中把數據讀入R裏了。這裡使用的關鍵命令是dbReadTable(),它需要的基本參數有兩個:資料庫對象以及要讀入的數據表名。運行後就會讀入並存成一個數據框對象。同時還可以採用dbListFields()來查看數據表的欄位。

如果只是想簡單地把一個表讀進來,那麼dbReadTable()就足夠了,但是,這並未體現出R與SQL結合起來的強大作用,SQL擅長儲存大規模數據,R適合調用小數據進行建模,因此更常見的場景是,只需要把資料庫中的一部分數據讀入R,這時就要用到這兩個函數:dbSendQuery()和dbGetQuery()(對於dbSendQuery()和dbGetQuery()的操作,需要涉及一些SQL語言,沒有接觸過的讀者可以通過搜索先簡單瞭解一下這種結構化查詢語言(SQL:structured query language))。

第一個函數dbSendQuery()是用來向資料庫發送查詢命令的函數,它會讓資料庫執行一個查詢,但本身並不能提取出查詢結果。如果想把查詢結果提取到R中,必須另外使用dbFetch(),選擇提取全部或者部分查詢結果。最後,當不再需要從dbSendQuery()中提取結果時,還要用dbClearResult()關閉本次查詢。比如想提取出票房超過7億元的電影,可以進行如下操作:

由此可知,使用dbSendQuery()的流程略顯繁瑣,所以R官網文檔中也建議:For interactive use, you should almost always prefer dbGetQuery,也就是說,如果需要跟資料庫交互使用數據,最好直接使用下面這個函數:dbGetQuery()。

dbGetQuery()函數,相當於自動化完成了發送「查詢命令」「返回結果」「關閉查詢」的三步操作,因此使用到的基本參數與dbSendQuery()相同,仍是資料庫對象及SQL查詢語句。比如想獲得數據集中的前3條記錄、票房超過7億元的電影以及女星白百何出演過的電影,使用這個函數就可以直接把想要的數據放進R內存,供我們使用。

最後,完成了所有與資料庫的交互操作後,別忘了關閉R與MySQL的連接。

03其他資料庫讀入

除了MySQL資料庫,也許一些讀者在工作中還經常用到加州大學伯克利分校計算機系開發的PostgreSQL(沒有接觸過PostgreSQL的讀者,可以通過官網下載安裝:postgresql.org/download;此處使用版本為9.6)或者甲骨文公司開發的Oracle等其他中大型資料庫,這些常用的庫在R中都有專門對應的介麵包,比如RPostgreSQL,ROracle等。它們的使用方法與RMySQL大同小異,通用步驟都是先用dbConnect命令打開與對應資料庫的介面,然後使用上面介紹的函數對資料庫進行讀寫增刪等操作,最後再通過dbDisconnect關閉連接即可。這裡再展示一下RPostgreSQL包的簡單用法,其他用法可完全移植RMySQL包的函數介紹。同樣ROracle包的用法也類似,大家可以舉一反三。

04一般化的解決方案:ODBC

從前文的介紹可以看出:好像很多資料庫都可執行同一套操作來與R進行交互,只是連接的方式有所差別。那麼有沒有一個介面能統一各種資料庫,然後直接連接這個介面操作就行呢?RODBC包就可以實現。

ODBC的全稱是open database connectivity,是一個資料庫介面的解決方案,它為所有的基於SQL語言的資料庫管理系統(DBMS)提供一個通用的API介面,這些DBMS包括MySQL,PostgreSQL,Microsoft Access and SQL Server,DB2,Oracle and SQLite等。

ODBC最初是由微軟在20世紀90年代設計進Windows系統裏的,後來一些例如unixODBC和iODBC等驅動管理工具的出現也讓多平臺使用ODBC成為可能。這裡就以Mac平臺上的ODBC為例,展示RODBC包的使用。這裡將繼續使用MySQL裏的數據,感興趣的讀者可以自行嘗試PostgreSQL等其他資料庫的連接。

首先需要將MySQL driver中的數據源(DSN)配置進ODBC(Mac的詳細配置過程見附錄;Windows本身已自帶配置)。配置好後,同樣先用odbcConnect()命令把R與ODBC相連接,其中第一個參數即配置好的DSN名字,後兩個即連接該資料庫所需的用戶名和密碼。

接下來所使用到的函數名與前文介紹的包略有差異,但實現功能及參數設置十分類似。表2-10羅列出了這些常用函數的參數及功能(RODBC包的更多用法可以參考:RODBC包的R官網Cran介紹)。

表2?10 RODBC包常用函數與功能對照表

註:其中channel就是建立的連接,示例代碼中con_odbc就是這個channel。

本章介紹了R語言中的基本數據類型和數據結構,以及常用的數據操作。它們是整理數據,歸納結果的「利器」。實際數據分析過程中,往往組合使用,如能熟練掌握,則威力無窮。學習本章過程中,不必死記硬背,讀者不妨嘗試分析實際數據,在實際問題場景中鍛煉升級這項技能。

01

附錄 1:如何下載MySQL(MAC版)

Step 1:在官網上選擇5.7.23版本的MySQL以及你的電腦系統,下載dmg格式的安裝包;(隨後會顯示註冊賬戶的頁面,可以選擇註冊或者不註冊,如果不註冊,直接點擊「No thanks, just start my download」即可)

Step 2:下載好dmg包後,按照其默認設置一直點擊下一步即可。需要特別注意的是當安裝成功後會跳出這樣一個臨時密碼頁面,需要保存好這個密碼(這裡的密碼是fcMh&dtk%1Uq),之後無論在終端登錄資料庫或者在R中連接資料庫時,都需要用到這個密碼。你也可以修改成為更簡單的密碼,詳情請見附錄2。

Step 3:安裝成功後,你可以在MAC電腦中「系統偏好設置」的面板中查看到MySQL的圖標,每次在使用前,需要點擊這個圖標進入到開啟MySQL Server的頁面,點擊Start MySQL Server後,就可以看到頁面會顯示 「The MySQL Server Instance is running」的標記,就是開啟成功啦!

02

附錄2:MySQL添加demo資料庫

Step 1:登錄資料庫並修改密碼

首先在終端輸入「PATH="$PATH":/usr/local/mysql/bin(這是Mac的PATH,Windows下不是這樣的目錄。)」和「mysql -u root –p」來登錄你的資料庫,之後需要輸入你的資料庫登錄密碼。初始登錄密碼為附錄1中記錄的臨時密碼fcMh&dtk%1Uq。

登錄成功之後,會出現「mysql>」的標記,我們可以使用「show databases;」的命令查看一下現有的資料庫。

如果你覺得臨時密碼太繁瑣不便於保存,也可以使用如下語句將其修改為更簡單的密碼(如「123456」):

mysql> set password for 用戶名@localhost = password(新密碼);

Step 2:使用「CREATE DATABASE」的命令添加demo資料庫,顯示「Query Ok, 1 row affected」後就表示添加成功了!

Step 3:檢查現有的資料庫列表,可以看到demo已經被成功添加進去了

03

附錄 3:Mac配置ODBC過程詳解

在Mac中配置ODBC需要兩個基本零件,驅動器管理軟體(例中是 iODBC(例中使用版本號為3.52.12))以及相應資料庫的驅動器(例中使用的MySQL Connector / ODBC, 一個標準的資料庫driver,可從官網下載(例中使用版本號為8.0.12)),iODBC配置的初始界面如下所示:

配置過程可以通過三步完成:

Step 1:點擊Add,選擇一個合適的驅動器,點擊Finish.(這裡會自動羅列你電腦上已成功安裝的驅動器,如果沒有顯示列表,請檢查驅動器是否安裝成功。我們這裡使用最新的MySQL ODBC 8.0 Unicode Driver)

Step 2:跳出設置界面,我們輸入該DSN的名字(需用戶指定),然後在關鍵詞下面,點擊+添加需要連接的資料庫(此處我們需要連接demo資料庫),點擊OK即可,這時候就會看到User DSN界面中增加了新添的數據源sql。

Step 3:選中該DSN,點擊右下角的test,如果顯示以下成功信息,則說明配置成功,可以在R中使用RODBC連接。


推薦閱讀:
相關文章