如何用R读取Cassandra的数据?

Sve*_*end 16 r cassandra

我使用的是R 2.14.1和Cassandra 1.2.11,我有一个单独的程序,它将数据写入单个Cassandra表.我没能从R读它们

Cassandra架构定义如下:

create table chosen_samples (id bigint , temperature double, primary key(id))
Run Code Online (Sandbox Code Playgroud)

我首先尝试了RCassandra包(http://www.rforge.net/RCassandra/)

> # install.packages("RCassandra")
> library(RCassandra)
> rc <- RC.connect(host ="192.168.33.10", port = 9160L)
> RC.use(rc, "poc1_samples")
> cs <- RC.read.table(rc, c.family="chosen_samples")
Run Code Online (Sandbox Code Playgroud)

连接似乎成功,但将表解析为数据框失败:

> cs
Error in data.frame(..dfd. = c("@\"ffffff", "@(<cc><cc><cc><cc><cc><cd>",  : 
  duplicate row.names: 
Run Code Online (Sandbox Code Playgroud)

我也尝试过使用JDBC连接器,如下所述:http://www.datastax.com/dev/blog/big-analytics-with-r-cassandra-and-hive

> # install.packages("RJDBC")
> library(RJDBC)
> cassdrv <- JDBC("org.apache.cassandra.cql.jdbc.CassandraDriver", "/Users/svend/dev/libs/cassandra-jdbc-1.2.5.jar", "`")
Run Code Online (Sandbox Code Playgroud)

但是这个失败了:

Error in .jfindClass(as.character(driverClass)[1]) : class not found
Run Code Online (Sandbox Code Playgroud)

即使java驱动程序的位置是正确的

$ ls /Users/svend/dev/libs/cassandra-jdbc-1.2.5.jar
/Users/svend/dev/libs/cassandra-jdbc-1.2.5.jar
Run Code Online (Sandbox Code Playgroud)

fc9*_*.30 5

您必须下载apache-cassandra-2.0.10-bin.tar.gzcassandra-jdbc-1.2.5.jarcassandra-all-1.1.0.jar

无需在本地计算机上安装 Cassandra;只需将 cassandra-jdbc-1.2.5.jar 和 cassandra-all-1.1.0.jar 文件放在解压后的 apache-cassandra-2.0.10-bin.tar.gz 的 lib 目录中即可。然后你可以使用

 library(RJDBC)
 drv <- JDBC("org.apache.cassandra.cql.jdbc.CassandraDriver", 
              list.files("D:/apache-cassandra-2.0.10/lib",
              pattern="jar$",full.names=T))
Run Code Online (Sandbox Code Playgroud)

这在我的 UNIX 上可以工作,但在我的 Windows 机器上不行。希望有帮助。


Akh*_*air 5

这个问题现在已经很老了,但是因为它是R和Cassandra的热门单曲之一,所以我认为我将在这里留下一个简单的解决方案,因为我发现很少有人对我认为相当普遍的最新支持很少任务。

Sparklyr现在公开了Java上下文,因此Spark-Cassandra-Connector可以从头开始轻松地实现此操作。我将绑定打包在这个简单的包crassy中,但是没有必要使用。

我主要是为了使如何隐藏sparklyr连接器的配置神秘化,并且选择列子集的语法有点笨拙(假设没有Scala知识)。

支持列选择和分区过滤。考虑到无法直接将CQL提交给集群,这些是我认为一般Cassandra用例所必需的唯一功能。

我还没有找到一个解决方案,提交不涉及编写自定义斯卡拉更一般的CQL查询,但有这可如何工作的例子在这里


Sve*_*end 3

是的,我找到了一种(诚然丑陋的)方法,只需从 R 调用 python,手动解析 NA 并在 R 中重新分配数据帧名称,如下所示

# install.packages("rPython")
# (don't forget to "pip install cql")
library(rPython)
python.exec("import sys")
# adding libraries from virtualenv 
python.exec("sys.path.append('/Users/svend/dev/pyVe/playground/lib/python2.7/site-packages/')")
python.exec("import cql")

python.exec("connection=cql.connect('192.168.33.10', cql_version='3.0.0')")
python.exec("cursor = connection.cursor()")
python.exec("cursor.execute('use poc1_samples')")
python.exec("cursor.execute('select * from chosen_samples' )")

# coding python None into NA (rPython seem to just return nothing )
python.exec("rep = lambda x : '__NA__' if x is None else x")
python.exec( "def getData(): return [rep(num) for line in cursor for num in line ]" )
data <- python.call("getData")
df <- as.data.frame(matrix(unlist(data), ncol=15, byrow=T))

names(df) <- c("temperature", "maxTemp", "minTemp",
"dewpoint", "elevation", "gust", "latitude", "longitude",
"maxwindspeed", "precipitation", "seelevelpressure", "visibility", "windspeed")

# and decoding NA's    
parsena <- function (x) if (x=="__NA__") NA else x
df <- as.data.frame(lapply(df,  parsena))
Run Code Online (Sandbox Code Playgroud)

有人有更好的主意吗?