深入浅出R语言数据分析
上QQ阅读APP看书,第一时间看更新

2.5 R语言操作数据库

在实际的工作中,数据往往集中存储在数据库中,因此需要对数据库进行读取操作。R语言可以与市面上的所有数据集进行链接、操作,本节将介绍如何链接数据库,并进行操作。下面列举R语言操作各类数据库的相关资料链接。

● RODBC:R中ODBC数据库范围。官网网址为http://cran.r-project.org/web/packages/RODBC/。

● DBI:在R和数据库管理系统之间定义一个公共的接口。官网网址为https://github.com/rstats-db/DBI。

● Elastic:Elasticsearch HTTP API的包装器。官网网址为https://github.com/ropensci/elastic。

● Mongolite:R中Mongo客户端。官网网址为https://github.com/jeroenooms/mongolite。

● RMySQL:R语言的MySQL数据库接口。官网网址为http://cran.r-project.org/web/packages/RMySQL/。

● ROracle:R中Oracle数据库的接口。官网网址为http://cran.r-project.org/web/packages/ROracle/index.html。

● RPostgreSQL:R语言的PostgreSQL数据库系统接口。官网网址为https://code.google.com/p/rpostgresql/。

● RSQLite:R语言SQLite数据库接口。官网网址为http://cran.r-project.org/web/packages/RSQLite/。

● RJDBC:通过JDBC接口访问数据库。官网网址为http://cran.r-project.org/web/packages/RJDBC/。

● RMongoDB:R中MongoDB驱动。官网网址为https://github.com/mongosoup/rmongodb。

● RRedis:R中Redis驱动。官网网址为http://cran.r-project.org/web/packages/rredis/。

● RCassandra:Apache Cassandra直接接口(不是Java),提供了最多的基本功能。官网网址为http://cran.r-project.org/web/packages/RCassandra/index.html。

● RHive:通过Apache Hive的R扩展促进分布式计算。官网网址为https://github.com/nexr/RHive。

● RNeo4j:Neo4j图形数据库驱动。官网网址为https://github.com/nicolewhite/Rneo4j。

本章节以Redshift数据库为例,使用两种方法进行链接。

1. RJDBC

下面介绍使用RJDBC包来对数据库进行链接。下面的代码就是使用RJDBC包来链接Redshift数据库的。只需要修改对应的数据库链接、数据库的账号密码、端口号等内容,运行即可链接对应的数据库。首先,通过install.packages("RJDBC")下载对应包;然后,通过library加载需要的包。第一步是下载亚马逊Redshift的JDBC驱动,使用download.file进行下载。下载完成之后运行驱动(使用JDBC函数,传入之前下载好的驱动的路径作为参数)。完成之后,输入数据库的地址、端口、数据库名、用户名、密码。将这些信息按照对应的格式赋值给一个字符串,然后就可以链接数据库了(使用dbConnect( )函数,这个函数的第一个参数是JDBC的返回值,另一个参数是之前生成的关于数据库地址、账号、密码等信息的字符串)。

本章节的代码都可以直接运行,其中,需要修改URL,输入所使用的数据库的名称、端口、用户名和密码,然后通过dbConnect进行链接,链接好后即可对数据进行操作。操作数据库用到的函数是dbGetTables( )。使用dbGetTables( )传入链接的数据库,会显示数据库里面的所有表格名称。通过SQL代码操作数据同样使用dbGetTables( )函数,dbGetTables( )函数在传入链接的数据库之后,第二个参数可以是一个SQL代码,返回结果就是SQL代码的运行结果。最后使用dbDisconnect( )函数来关闭数据库。

需要注意的是,dbGetQuery( )会将SQL代码的结果全部返回给R,并且以数据框的方式进行保存,如果数据量比较大,则这种方式会很慢,因此最好不要轻易地将结果返回给R,最好的方式是用SQL进行数据操作,然后将最终的结果返回给R,这样效率会更高一些。

2.dplyr

dplyr是一个用于数据分析的包,这个包依然可以用于操作数据库,使用这个包的好处是可以像处理R的数据一样,去处理数据库中的数据。这意味着并不需要写SQL去操作数据,因为dplyr可以将R函数直接转化成SQL代码,然后在数据库中运行。首先还是下载相应的包,然后需要加载dplyr和RPostgreSQL包,最后要链接数据库。使用dplyr链接数据库的方法与RJDBC不一样。dplyr使用src_postgres( )函数链接数据库,函数的第一个参数是数据库的名称,第二个参数host是数据库的链接,第三个参数port是数据库对应的端口,第四个参数user是数据的用户名,第五个参数password是用户名对应的密码。运行src_postgres( )即可链接数据库。

在上面的代码中,修改src_postgres( )函数中的数据库名称、数据库链接、端口号、用户名、用户名密码,就可以创建数据库的链接。链接数据库之后,即可对数据库进行数据操作(通过tbl( )函数进行操作,操作的方式很多,可以直接通过表名调用数据,也可以通过SQL代码调用数据。如果tbl( )直接传入链接好的数据库,则会返回数据库中的所有表名称。使用tbl( )传入链接好的数据库和对应的表名,则会返回对应表名称的数据)。同样地,也可以通过SQL操作数据,这个时候需要使用dplyr中的SQL函数。

创建好数据库的链接之后,需要获取表的数据(可以采用上面4种方式获取数据)。将获取的结果在R的终端进行输出,会返回数据库中数据的结果,但这并不意味着数据库的结果已经保存在R环境中了,返回的数据只是输出的这张表的部分结果,并没有保存到R环境中,因此,速度比较快。如果想将数据库中的结果保存到R环境,则需要主动地指定这样的操作,使用collect( )函数将数据保存到R环境中。需要注意的是,这样的操作会很耗费时间,因此有必要避免返回大量的结果,只将最终的结果返回到R环境。

remote_df %>% select(var1,var2)的作用是选取abc.mytable1这张表中的两行数据,这样的写法完全是R的数据操作的写法。其背后的原理是,这行代码会被翻译成SQL代码:

同样,其他的数据操作也会被转变成SQL代码,然后传递到数据库进行操作,最后将结果返回给终端。