讲一下有关 R 语言的数据库操作。要想成为一名数据分析师、数据科学家、BI 系统开发人员,或者更加高大上的算法工程师、AI 工程师,数据库操作算的上是一项基本技能。
更具体一点讲,得学会一点 SQL 语言,或者找个工具来操作数据库。但是,数据库有很多种,虽然很多都使用类似 SQL 的语言,不过细节上仍然有些差别,这多少增加了学习成本。
于是,新西兰统计学家、美国统计学会院士、Rstudio 公司首席科学家 Hadley Wickham 考虑到 R 社区更广大人民群众的需求,开发了一个叫 dplyr 的工具,作为统一的数据库接口语言。这些数据库包括了我们常用的 MySQL、SQLite、 PostgreSQL、bigquery、HIVE 等开源数据库,也包括 Oracle 、Microsoft SQL Server 等商业数据库。
不过 Hadley Wickham 并不是平地建起了 dplyr 。这种试着统一不同数据库接口的做法,最早是微软从 ODBC 开始的(可能还要更早),背景是当年的数据库厂商实在是太多了,不但学习起来有点难,不同数据库间的交流(数据共享)也是个大问题,这是ODBC的诞生背景。类似 ODBC,还有 Java 的 JDBC、Perl 的 DBI/DBD、Python 的 DBAPI,以及 R语言的 DBI (R语言的 DBI 可以追溯到 S 语言,所以也被称为 R/S DBI,R 语言的 DBI 也是贝尔试验室的科学家们开发出来的),这些技术意味着可以在 DBI(或 ODBC )之上开发应用,再不用和各种数据库较劲了。所以,DBI(或 ODBC )可以看做是一种替人类干些“苦、累、脏”活的中间件。有关这段漫长的历史可以参考 http://db.rstudio.com/dbi/
Rstudio 公司就 dplyr 给出下面这张图(http://db.rstudio.com/overview),描述了如何在 R 语言环境里建立 dplyr 和开源数据库的联系 ,RMySQL、RPostgreSQL、RSQLite、bigrquery都是依赖于 DBI 的 R 语言的数据库接口程序包。所以,要想建立 dplyr 与开源数据库的联系,得先安装这些必要的数据库接口程序包。像常用的 RMysql 的安装,可以参见张丹老师的 http://blog.fens.me/r-mysql-rmysql/ 。
dplyr是怎么开源数据库接上头的这张图也说明了,“把大象装冰箱,还是得站在巨人肩膀上实现。”
dplyr 和 SQL 还是很相似的。dplyr提供了一个函数 show_query( ),可以直接将 dplyr 语句转换为 sql 语句。如下面这个例子。
flights %>%
select(contains("delay")) %>%
show_query()
#> <SQL>
#> SELECT `dep_delay` AS `dep_delay`, `arr_delay` AS `arr_delay`
#> FROM `nycflights13::flights`
flights %>%
select(distance, air_time) %>%
mutate(speed = distance / (air_time / 60)) %>%
show_query()
#> <SQL>
#> SELECT `distance`, `air_time`, `distance` / (`air_time` / 60.0) AS `speed`
#> FROM (SELECT `distance` AS `distance`, `air_time` AS `air_time`
#> FROM `nycflights13::flights`)
我本来以为 show_query( ) 这个函数会很有用,但实际上并没有想象的那么大。我把用 dplyr 写的 sql 给其他程序员看,发现他们都能读懂。有些人甚至很快就开始用 dplyr 写 sql 了 (R语言和 dplyr 是面向不懂计算机技术的人开发的,所以,在程序员看来,dplyr 并不很难学)。
另外一个值得注意的事情是, Rstudio 公司目前仅支持微软公司的 ODBC,并不支持更常用的甲骨文公司的 JDBC,虽然 R 社区有支持 JDBC 的 RJDBC 。在 https://www.javatpoint.com/java-jdbc 有这样一段话:
Why Should We Use JDBC
Before JDBC, ODBC API was the database API to connect and execute query with the database. But, ODBC API uses ODBC driver which is written in C language (i.e. platform dependent and unsecured). That is why Java has defined its own API (JDBC API) that uses JDBC drivers (written in Java language).
这段话讲的是,在 JDBC 之前, Java 是基于 ODBC 的 API 进行数据库操作的,但 ODBC 所要求的数据库驱动程序是要用 C 语言来写的(这里面涉及平台依赖,并且是不安全的)。所以呢,Java定义了自己的API,就是 JDBC,相应的数据库驱动程序也得用 Java 来写。
我对“ODBC是不安全的”这句话很感兴趣,到底是甲骨文的宣传手法,还是 ODBC 真不安全,就不好判断了。另外一篇 IBM 公司的文章 Using R with databases,是在 IBM 自家的 DB2 数据库上使用 R 语言,使用的数据库接口程序是 RJDBC。
我戏说一下的猜测:IBM 公司是开发服务器的,甲骨文公司主要用 JAVA 来开发服务器端软件,两家公司走得近一些说得过去。可 Rstudio 公司只支持微软公司的 ODBC,这就有些偏向了。
莫非 Rstudio 公司要被微软公司收购了吗?
网友评论