這一節內容就基本上脫離了基礎,可能需要有點其他領域的積累才能看懂或者閱讀完全數後才能徹底明白,個人建議先將此節內容擱置,因為這一節真的沒有標準的答案:我的系統能搞定的流程和代碼放到你的系統上不一定能搞定,牽涉甚廣,但是我們這裡儘量講解一些通用的內容,但並非本節的內容不重要,因為一旦數據上升到平臺,你需要和資料庫打交道,即從資料庫中讀取數據,然後將結果寫入到資料庫。
這裡使用RJDBC與資料庫溝通,因為它對多種數據均適用,所以這裡暫時以這種簡單的方式與資料庫溝通,但是在使用RJDBC之前你首先要安裝java並配置環境變量,請參看輿情分析的章節,安裝完成之後可以在R裡面安裝rJava和RJDBC包了,如果還是不懂,就需要百度了,比如說如何安裝oracle客戶端,如何配置java的環境變量等等。
RJDBC與Oracle資料庫install.packages("rjava")install.packages("RJDBC")library(RJDBC)jdbcDriver <- JDBC(driverClass ="oracle.jdbc.driver.OracleDriver", classPath ="c:/ojdbc6.jar", "") conn <- dbConnect(jdbcDriver,"jdbc:oracle:thin:@//172.35.28.75:1521/bigdata", "well","well2")
包加載完成後需要使用JDBC函數指定一個jdbc驅動,第一個參數用於指定驅動的類型,這裡是連接的oracle就是指定oracle類型,參數classPath用於指定驅動存放的路徑,我的jdk是1.6版本所以選擇的驅動也是6版本,你可以去百度搜索並下載相應的ojdbc6.jar文件,不一定是6哦,但儘量要和你的jdk版本一致才好;dbConnect函數用於與資料庫建立連接,第一個參數指定上一步已經構建的驅動文件,第二個參數用於指定資料庫連接的ip,172.35.28.75指所連接遠程數據的ip,1521指oracle的埠,一般都是1521,後面的bigdata指庫的名稱,因人而異,這裡需要注意的是你要保證本機具有訪問遠程資料庫的權限,如果沒有請找運維的同事幫忙開通,而且需要注意這個參數還有另外一種寫法「jdbc:oracle:thin:@172.35.28.75:1521/bigdata」可以參考,第三個參數用於指定用戶名,第四個參數用於指定用戶密碼,通過以上的連接基本上可以和資料庫溝通了。
RJDBC與mysql資料庫library(RJDBC)jdbcDriver <-JDBC(driverClass="com.mysql.jdbc.Driver",classPath="c:/mysql-connector-java-5.1.18-bin.jar", " ")conn <- dbConnect(jdbcDriver, "jdbc:mysql://172.35.28.75:3306/bigdata?useUnicode=true&characterEncoding=UTF8","mysql", "msql_2016")
連接mysql和oracle幾乎一樣,使用JDBC函數指定一個jdbc驅動,第一個參數用於指定驅動的類型,這裡指定mysql類型,參數classPath用於指定驅動的存放路徑,你可以去百度搜索並下載相應的mysql-connector-java-5.1.18-bin.jar文件;dbConnect函數第一個參數指定上一步已經構建的驅動文件,第二個參數用於指定資料庫連接的ip,172.35.28.75指所連接遠程數據的ip,3306指mysql的埠,一般都是3306,後面的bigdata指庫的名稱,因人而異,再後面?useUnicode=true&characterEncoding=UTF8指定數據的編碼方式,因為mysql資料庫用的是gbk編碼,而項目中我們一般使用utf-8編碼數據,所以要告訴資料庫我們使用的編碼方式,不然會出現上傳的數據亂碼,後兩個參數用於指定用戶及密碼。
連上了資料庫就需要學會一下基本的操作,以下可能牽涉到一些簡單的資料庫語言:SQL,請百度一下sql入門。
RJDBC常見的操作temp <- data.frame(a = 1:4)dbWriteTable(conn, "TESTJDBC",temp)dbWriteTable(conn, "TEMP", temp)dbSendUpdate(conn, "insert intoTESTJDBC select * from TEMP")dbSendUpdate(conn, "drop tableTEMP")temp <- dbGetQuery(conn, "select *from TESTJDBC")dbSendUpdate(conn, "truncate tableTESTJDBC")
1行創建了一個數據框temp;2行dbWriteTable函數將temp上傳到資料庫,在資料庫上創建了一個新表TESTJDBC,它的第一個參數就是上一步創建的資料庫連接conn,第二行是在資料庫上創建的表名稱,第三個參數就是準備上傳的數據框temp;3行同樣在資料庫上創建一個新表TEMP然後將temp寫入進去;有趣的是RJDBC這個包是個半成品,它不能將數據添加到某個已經存在的表中,只能創建新表,也就是說不能更新表,所以如果更新的話就只能用4行的方式,使用dbSendUpdate函數對數據表進行更新,它的作用是在資料庫上執行一條SQL語句,既然它能做到這一點,我們直接寫一條SQL語句將一個表的數據添加到目標表就可以了,這樣我們只需要將數據上傳到臨時表(2句),在用SQL語句添加到目標表就可以了,「insert into TESTJDBC select from TEMP」這句sql的意思分兩部分:「select from TEMP」表示取出TEMP這個表中的所有數據,「insert into TESTJDBC」表示將剛剛取出的數據插入到TESTJDBC,這樣通過3、4句我們就完成了表的更新;5句用於刪除表TEMP;6行dbGetQuery函數用於查詢數據,第一個參數為資料庫連接;第二個參數是一條SQL查詢語句;除了直接將表刪除以外,還有清空表的操作,7行就是執行一條清空表TESTJDBC語句。
RJDBC連接到Hive需要的R所在的機子也要在Hive集群內,而且已經安裝了Hive,然後才能通過RJDBC連接,上面這些活必須找專業的人去做,不要一個人偷偷的把集群搞癱瘓了,那就悲催了。
library(RJDBC)jdbcDriver <-JDBC("org.apache.hive.jdbc.HiveDriver",list.files("/usr/lib",pattern="jar$", full.names=T,recursive=TRUE))conn <- dbConnect(jdbcDriver,sprintf('jdbc:hive2://172.35.28.75:10000/default'), 'hive', 'hive_2016')temp <- dbGetQuery(conn,"select *from test")
可以去hive官網下載apache-hive-1.2.1-bin.tar.gz,然後解壓在/usr/lib路徑下,這個路徑可以自己更改;3行創建hive連接,連接的ip、埠等參數和普通資料庫一樣;4行直接使用SQL語句在hive裡面查詢數據。
以上我們連接了各種資料庫,但是這些放在基礎章節比較難以理解,大家可以跳過此節繼續往下一章閱讀,等自己的知識體系構建起來之後再回頭閱讀此節。
好主意值得擴散,激發我們創造的動力,非常感謝花粉傳播者關注理性與文藝,用數據創作內容性的精緻閱讀,更多資料分享添加qq群。