Cassandra数据库在维基百科的简介:

Apache Cassandra(社区内一般简称为C*)是一套开源分布式NoSQL数据库系统。它最初由Facebook开发,用于储存收件箱等简单格式数据,集Google BigTable的数据模型与Amazon Dynamo的完全分布式架构于一身。Facebook于2008将 Cassandra 开源,此后,由于Cassandra良好的可扩展性和性能,被 Apple[1], Comcast[2],Instagram[3], Spotify[4], eBay[5], Rackspace[6], Netflix[7]等知名网站所采用,成为了一种流行的分布式结构化数据存储方案。
在数据库排行榜“DB-Engines Ranking”中,Cassandra排在第七位,是非关系型数据库中排名第二高的(仅次于MongoDB)[8]。

R作为一门偏统计学使用的科学计算语言,并不像Java、Python等语言能够及时更新与这些前沿数据库的连接方式,在踩了许多坑之后,终于研究出较为靠谱的方法,在这里记录下来。

本文介绍了三种连接方法,第一种是通过Spark连接Cassandra的方法,这是较为靠谱的方式,但连接速度较慢,其次是JDBC的连接方法,在有了合适的driver后是最合适的方法,最后简单提一下RCassandra包。

通过Spark连接Cassandra

连接Cassandra的主要困难在于没有合适的用来连接数据库的R语言driver。而使用通过R先连接Spark,然后在Spark里连接Cassandra的原因在于,连接Spark的sparklyr包,以及Spark连接Cassandra的driver都能保持更新,这样不容易存在无法连接最新版Cassandra的问题(其他方法会提到)。同时也可以借用Spark的计算框架,先对数据进行处理,然后加载到R环境里。

这个方法主要来自于sparklyr 0.6版本的更新说明。本文不会介绍sparklyr的使用方法,相关介绍可以看官方文档。

R连接Spark除了可以使用RStudio出品的sparklyr外,还可以使用Spark社区自家的SparkR包。有关sparklyr和SparkR的区别可以看这篇文章。

简单介绍一下Spark。Spark是Apache开源的分布式计算框架,在机器学习领域非常火热:

Apache Spark是一个开源集群运算框架,最初是由加州大学柏克莱分校AMPLab所开发。相对于Hadoop的MapReduce会在运行完工作后将中介数据存放到磁盘中,Spark使用了存储器内运算技术,能在数据尚未写入硬盘时即在存储器内分析运算。Spark在存储器内运行程序的运算速度能做到比Hadoop MapReduce的运算速度快上100倍,即便是运行程序于硬盘时,Spark也能快上10倍速度。[1]Spark允许用户将数据加载至集群存储器,并多次对其进行查询,非常适合用于机器学习算法。[2]
使用Spark需要搭配集群管理员和分布式存储系统。Spark支持独立模式(本地Spark集群)、Hadoop YARN或Apache Mesos的集群管理。[3] 在分布式存储方面,Spark可以和HDFS[4]、 Cassandra[5] 、OpenStack Swift和Amazon S3等接口搭载。 Spark也支持伪分布式(pseudo-distributed)本地模式,不过通常只用于开发或测试时以本机文件系统取代分布式存储系统。在这样的情况下,Spark仅在一台机器上使用每个CPU核心运行程序。
在2014年有超过465位贡献家投入Spark开发[6],让其成为Apache软件基金会以及大数据众多开源项目中最为活跃的项目。

R通过Spark连接Cassandra的话,首先需要一个适合Spark连接Cassandra的driver,datastax开源的driver使用非常广泛,在这里确定好机器上的Spark和Cassandra版本后,下载合适的driver。笔者的spark是2.3,Cassandra是3.7,因此使用2.3的driver。

安装好sparklyr后,使用如下方法连接Cassandra

library(sparklyr) # 复制默认参数
config <- spark_config() # 加载Spark连接Cassandra的driver
config[["sparklyr.defaultPackages"]] <- c("datastax:spark-cassandra-connector:2.3.0-s_2.11")
# Cassandra的IP地址,本机为localhost,在其他服务器上输入对应IP地址
config[["spark.cassandra.connection.host"]] <- c("localhost")
# 连接Cassandra的用户名和密码
config[["spark.cassandra.auth.username"]] <- c("<username>")
config[["spark.cassandra.auth.password"]] <- c("<password>")
# 扩大内存
config[["sparklyr.shell.driver-memory"]] <- "8G"
config[["sparklyr.shell.executor-memory"]] <- "8G"   spark_sc <- spark_connect(master="local", config=config)

运行后没有报错并且显示出如下信息,就已经连接上Spark以及Cassandra了。

* Using Spark: 2.3.0

从Cassandra中读取数据到R环境的方式有两种,第一种是使用DBI包里面的SQL语句,这种方式较为简单,并且可以使用where语句来进行数据筛选,但是处理较大的数据时容易报错。

library(DBI)   # 加载数据到Spark环境中
spark_read_source(sc=spark_sc, name="index_returns",    source="org.apache.spark.sql.cassandra", options=list(keyspace="x", table="y"),   memory=F)
# 使用DBI包中的dbGetQuery函数把数据加载到R环境里
index_returns <- dbGetQuery(spark_sc, paste0("select * from index_returns where id in ('", paste(index_id[, "id"], collapse="', '"), "')"))

第二种方式是使用collect函数加载到R环境里,操作方式和第一种有点区别。

# 赋值为handle
spark_h <- spark_read_source(sc=spark_sc, name="index_returns",  source="org.apache.spark.sql.cassandra", options=list(keyspace="x", table="y"),   memory=F)
# 使用dplyr包的filter函数进行处理
spark_h <- dplyr::filter(spark_h, id %in% index_id[, "id"])
# 将handle执行并加载数据到R环境里
dt <- collect(spark_h)

这里使用了dplyr包的函数在spark环境中对数据进行了处理,实际效果和第一种方法一样。也可以直接collect(spark_h)将数据提取到R环境中。

collect()函数在执行之前,写多次filter()函数都不会运行,只是将运行步骤储存了起来,最后一起运行。

通过JDBC连接Cassandra

这个方法来自这个回答,通过R的RJDBC包,再利用Cassandra的JDBC driver也可以连接上Cassandra。在实际操作中,原文提到的driver已经无法在3.x版本的Cassandra上使用。尝试多种JDBC driver后,终于得到了一个靠谱的方式,请看下方第二个driver的介绍。

第一个driver的操作步骤如下:前往这里下载相应的JDBC driver的jar包,然后去这里这里下载Java driver的jar包,放到一个目录下。下载链接在作者提供的Maven代码的下方,是提供了所有依赖包的jar文件。如果会使用Maven的话,也可以使用Maven来安装包。

以现在(2019年3月)为例,下载完成后目录下有“cassandra-jdbc-wrapper-3.1.0-SNAPSHOT.jar”和“cassandra-java-driver-3.7.1”的文件夹。然后把R的工作目录设定到这个文件夹里,运行以下代码

library(RJDBC)   # 加载driver
drv <- JDBC(driverClass="com.github.adejanovski.cassandra.jdbc.CassandraDriver",  classPath=list.files("./", pattern="jar$", full.names=T, recursive=T))
# 参数,数据库的地址,用户名和密码
conn <- dbConnect(drv, "jdbc:cassandra://localhost:9042/<keyspace>", user="", password="")

若没有报错的话,就已经连接上了。然后使用SQL语句进行查询

# 使用SQL语句读取数据
> dbGetQuery(conn, "select x,y from z limit 1;")   x             y
1 6fba75f5-0fd3-11e9-8d27-4a000747d560     0.02969529   # 查询date类型数据时报错
> dbGetQuery(conn, "select date from z limit 1;")
Error in .jcall(rp, "I", "fetch", stride, block) :  java.lang.NullPointerException

发现无法读取date类型的数据,存在问题。

后续笔者使用了探究了其他的driver,发现Cassandra JDBC Driver from DbSchema可以使用,但这个driver只支持Java 11的运行,后续将源码用Java 8编译后(感谢jungle的热情帮助:)),终于可以使用了。使用方式和上一种一样:

library(RJDBC) cassdrv <- JDBC(driverClass="com.dbschema.CassandraJdbcDriver",   classPath=list.files("./Cassandra JDBC Driver from DbSchema", pattern="jar$", full.names=T, recursive=T))
cassconn <- dbConnect(drv, "jdbc:cassandra://localhost:9042/<keyspace>", user="", password="") > dbGetQuery(casscon, "select * from z limit 1;")  a        b                         c       d
1 6fba75f5-0fd3-11e9-8d27-4a000747d560   2009-07-01                   0     0.02969529

类似的,应该也可以通过ODBC的方式连接Cassandra,有兴趣的读者可以自己尝试。

通过RCassandra包

这种方式请参考《R利剑NoSQL系列文章之Cassandra》这篇文章。

由于RCassandra包已经多年没有更新,无法连接3.7版本的Cassandra,因而无法使用。

——————————————

往期精彩:

  • 2019年普通高等程序员招生统一考试

  • “币圈贾跃亭”天价碰瓷巴菲特,王小川隔空回应:骗子!

  • 亚马逊在中国失败,而中国却在亚马逊成功

R连接Cassandra数据库的方法总结相关推荐

  1. .net连接mysql数据_.net连接MYSQL数据库的方法及示例!

    连接MYSQL数据库的方法及示例 方法一: 使用MYSQL推出的MySQL Connector/Net is an ADO.NET driver for MySQL 该组件为MYSQL为ADO.NET ...

  2. python连接oracle数据库的方法_Python3.6连接Oracle数据库的方法详解

    本文实例讲述了Python3.6连接Oracle数据库的方法.分享给大家供大家参考,具体如下: 下载cx_Oracle模块模块: https://pypi.python.org/pypi/cx_Ora ...

  3. python连接sqlite数据库的代码_Python3实现连接SQLite数据库的方法

    本文实例讲述了Python3实现连接SQLite数据库的方法,对于Python的学习有不错的参考借鉴价值.分享给大家供大家参考之用.具体方法如下: 实例代码如下: import sqlite3 db ...

  4. linux mysql如何远程连接mysql数据库,Linux下远程连接MySQL数据库的方法

    Linux下远程连接MySQL数据库的方法 踩坑笔记 估计搞了一个多小时才把这个远程连接搞好.一台本地电脑,一台云服务器,都是linux系统. 步骤 1.在服务器端开启远程访问 首先进入mysql数据 ...

  5. 用ASP.Net(C#)连接Oracle数据库的方法

    今天看了一下asp.net连接oracle数据库的方法,得到了如下代码.这段代码打开了MyTable表,并把操作员的名字列出.字段类型是OracleString.读取的时候用的是字段编号,我不知道怎么 ...

  6. C#连接Oracle数据库的方法(Oracle.DataAccess.Client也叫ODP.net)

    官方下载地址(ODP.net)(中文):http://www.oracle.com/technetwork/cn/topics/dotnet/downloads/index.html 官方下载地址(O ...

  7. .NET连接ORACLE数据库的方法

    .NET连接ORACLE数据库的方法就目前有3种: 1.OLEDB的方式,这种方式要求你要安装oracle client,这两年来做的关于oracle数据库的,我都采用这种方式,虽然连接的速度慢了一点 ...

  8. LOADRUNNER连接ORACLE数据库的方法

    LOADRUNNER连接ORACLE数据库的方法 最近正在做一个测试数据库性能的项目,直接写出来的连接数据库并且进行数据库查询和插入的脚本 在VUSER_INIT中(连接数据库) #include & ...

  9. redis怎么连接mysql数据库_Golang连接Redis数据库的方法

    Golang连接Redis数据库 golang连接数据库,这里博主推荐使用go-redis这个库,理由很简单(连接数据库的操作类似在数据库里面输入命令) go-redis的安装方式 go get -v ...

  10. PLSQL Developer工具远程连接Oracle数据库的方法

    Oracle数据库安装过程较为繁琐,而且卸载更加麻烦,如果卸载不干净,下次安装Oracle就不会成功.下面就为大家介绍一种不用安装Oracle客户端而利用PLSQL Developer工具远程连接Or ...

最新文章

  1. 对数学本质特征的若干认识
  2. 阿里巴巴2021秋招笔试题20211119
  3. 苹果电脑 默认安装jdk位置_收藏起来你一定用的上!JDK的安装和配置
  4. 什么是MPLS?多协议标签交换
  5. python程序调用函数的过程是什么_Python:函数定义和调用时都加*,有什么作用?...
  6. java语言精通能干什么_Java学到什么程度才能叫精通?
  7. 37.django基础概念
  8. python基础知识——模块
  9. 简述osi参考模型各层主要功能_简述OSI参考模型及各层的功能
  10. PLUTO SDR入门系列之九:强大的开源软件“gnu radio”
  11. MYSQL从简单查询到高级查询(一)
  12. Netty :仿写微信 IM 即时通讯系统
  13. 2022网易最新版本将军令算法刨析(2)
  14. python第五次笔记
  15. 基于android的电子书阅读器app
  16. 为vim添加php和css函数字典
  17. Springboot 实现 上传、下载 以及解决必须项目重启才能访问资源的问题
  18. php点击图片更新验证码,thinkphp点击图片刷新验证码
  19. 网吧服务器系统用什么情况,网吧或网咖的电脑不卡的四大原因
  20. 低功耗蓝牙在未来几年会占据蓝牙设备的90%市场

热门文章

  1. 类加载的过程(加载、验证、准备、解析、初始化)
  2. linux 在字符界面中如何查看超出屏幕显示范围的内容
  3. Alien Skin Exposure7滤镜软件功能作用
  4. building for iOS simulator, but linking in object file built for tvOS, for architecture x86_64
  5. 微信宣布:被禁 8 年的限制解除了!
  6. 微软推出的在线代码查看神器github1s
  7. IntelliJ IDEA 查看类继承关系图,太强大了!
  8. 国外大牛最终还是放弃迁移到微服务,为什么?
  9. Java 阻塞队列实现原理分析
  10. 删除linux分区后grub,删除Ubuntu分区后GRUB救援问题!