在我的實際工作中,數據來源一方面是關系型數據庫MS SqlServer, 別一方面是HBase。本節主要介紹通過RODBC訪問MS SqlServer 安裝配置,參見資料(https://msdn.microsoft.com/en-us/library/hh568454(v=sql.110).aspx),請注意:下載的msodbc 的版本與 unixODBC的版本之間有強制的對應關系,參見:(https://msdn.microsoft.com/en-us/library/hh568449(v=sql.110).aspx),本文選擇安裝的是 msodbcsql-11.0.2270.0 ,按官方介紹,對應的unixodbc 版本為:unixODBC-2.3.0
目錄:
- unixODBC安裝
- Msodbcsql安裝
- ODBC配置
- RODBC安裝
- RODBC調用示例
說明:
- unixODBC提供了Linux對ODBC的支持,但它只是一個ODBC的管理器,要連接實際的數據庫還需要提供這種數據庫的ODBC驅動
- msodbcsql是Linux下用於連接sqlServer的免費ODBC驅動 (注意: 必須先裝unixODBC,再安裝sqlserverodbc)
- RODBC是R腳本連接ODBC的軟件包
unixODBC安裝:
- 軟件安裝包下載(unixODBC-2.3.0.tar.gz),下載地址:https://sourceforge.net/projects/unixodbc/files/unixODBC/2.3.0/
- 命令:yum remove unixODBC (如果機器上已經安裝其它版本的unixODBC,安裝前需要先將其刪除)
- 命令:tar xvzf unixODBC-2.3.0.tar.gz (將下載到本地的軟件包上傳至linux主機並解壓)
- 命令:cd unixODBC-2.3.0 (切換至解壓后的目錄)
- 命令:CPPFLAGS="-DSIZEOF_LONG_INT=8"
- 命令:export CPPFLAGS
- 命令:./configure --prefix=/usr --libdir=/usr/lib64 --sysconfdir=/etc --enable-gui=no --enable-drivers=no --enable-iconv --with-iconv-char-enc=UTF8 --with-iconv-ucode-enc=UTF16LE
- 命令:make (編譯安裝)
- 命令:make install
Msodbcsql安裝:
- 軟件安裝包下載(msodbcsql-11.0.2270.0.tar.gz),下載地址:https://www.microsoft.com/en-us/download/details.aspx?id=36437
- 命令:tar xvzf msodbcsql-11.0.2270.0.tar.gz (安裝包上傳到linux 主機后解壓)
- 命令:cd msodbcsql-11.0.2270.0 (切換至解壓后主目錄)
- 命令:./install.sh verify (驗證當前環境是否滿足軟件安裝要求)
- 命令:./install.sh install (上一步ok的前提下,執行安裝)
- 命令:odbcinst -q -d -n "ODBC Driver 11 for SQL Server" (測試安裝是否成功,如下則ok)
Description=Microsoft ODBC Driver 11 for SQL Server Driver=/opt/microsoft/msodbcsql/lib64/libmsodbcsql-11.0.so.2270.0 Threading=1 UsageCount=1
-
ODBC配置:
- 安裝成功后,在 /etc 目錄下能找着 odbcinst.ini 和 odbc.ini 文件
- odbcinst.ini 表示本機已經安裝了哪些類型的驅動,正確安裝后內容如下
[ODBC Driver 11 for SQL Server] Description=Microsoft ODBC Driver 11 for SQL Server Driver=/opt/microsoft/msodbcsql/lib64/libmsodbcsql-11.0.so.2270.0 Threading=1 UsageCount=1
-
命令:vim /etc/odbc.ini (配置MS sqlserver 連接信息),在打開的文件中輸入如下內容
[testsql] Driver=ODBC Driver 11 for SQL Server Server= 數據庫服務器名或IP Database=數據庫名
-
注意:Driver 賦值必須與 odbcinst 文件中 安全一致
- 命令:isql testsql sa XXXX (testsql: 設置的odbc連接名,后面以空格輸入用戶名和密碼,成功連接則OK,如圖)
- 命令: quit (退出)
RODBC安裝:
- 命令:R (進入R命令行)
- 執行:install.packages("RODBC") (安裝RODBC)
- 安裝完成后,在R命令行下執行如下腳本,結果如下則OK
library(RODBC) pile <- odbcConnect("testsql",uid = "sa",pwd = "yourPassword") data <- sqlQuery(pile,"select top 5 code,name from codeItems") close(pile) data
- 結果如下,則ok
ODBC的訪問接口
- odbcConnect 可以打開一個連接,返回一個用於隨后數據庫訪問的控制(handle)。 打印一個連接會給出ODBC連接的一些細節,而調用 odbcGetInfo 會給出客戶端和服務器的一些細節信息。
- 在一個連接中的表的細節信息可以通過函數 sqlTables 獲得。
- 函數 sqlSave 會把 R 數據框復制到一個數據庫的表中,
- 函數 sqlFetch 會把一個數據庫中的表拷貝到 一個 R 的數據框中
- 通過sqlQuery進行查詢,返回的結果是 R 的數據框。
- sqlCopy把一個 查詢傳給數據庫,返回結果在數據庫中以表的方式保存。 一種比較好的控制方式是首先調用 odbcQuery, 然后 用 sqlGetResults 取得結果。后者可用於一個循環中 每次獲得有限行,就如函數 sqlFetchMore 的功能。
- 連接可以通過調用函數 close 來關閉。
sqlSave函數
-
sqlSave(channel, dat, tablename = NULL, append = FALSE, rownames = TRUE, colnames = FALSE, verbose = FALSE, safer = TRUE, addPK = FALSE, typeInfo, varTypes, fast = TRUE, test = FALSE, nastring = NULL) sqlUpdate(channel, dat, tablename = NULL, index = NULL, verbose = FALSE, test = FALSE, nastring = NULL, fast = TRUE)
-
append:代表是否追加,默認不追加,如果一張已經有數據的表,就可以用append追加新的數據,需要同樣的column,一般開個這個就行。
- rownames:可以是邏輯值,也可以是字符型。
- colnames:列名;
- verbose:默認為FALSE,是否發送語句到R界面,如果TRUE,那么每條上傳數據就會出現在命令欄目致之中。
- addPK:是否將rownames指定為主鍵。