我使用的是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)
您必须下载apache-cassandra-2.0.10-bin.tar.gz和cassandra-jdbc-1.2.5.jar和cassandra-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 机器上不行。希望有帮助。
这个问题现在已经很老了,但是因为它是R和Cassandra的热门单曲之一,所以我认为我将在这里留下一个简单的解决方案,因为我发现很少有人对我认为相当普遍的最新支持很少任务。
Sparklyr现在公开了Java上下文,因此Spark-Cassandra-Connector可以从头开始轻松地实现此操作。我将绑定打包在这个简单的包crassy中,但是没有必要使用。
我主要是为了使如何隐藏sparklyr连接器的配置神秘化,并且选择列子集的语法有点笨拙(假设没有Scala知识)。
支持列选择和分区过滤。考虑到无法直接将CQL提交给集群,这些是我认为一般Cassandra用例所必需的唯一功能。
我还没有找到一个解决方案,提交不涉及编写自定义斯卡拉更一般的CQL查询,但有这可如何工作的例子在这里。
是的,我找到了一种(诚然丑陋的)方法,只需从 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)
有人有更好的主意吗?