如何用R读取Cassandra的数据?

时间:2014-02-24 17:00:17

标签: r cassandra

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

Cassandra架构的定义如下:

create table chosen_samples (id bigint , temperature double, primary key(id))

我首先尝试了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")

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

> cs
Error in data.frame(..dfd. = c("@\"ffffff", "@(<cc><cc><cc><cc><cc><cd>",  : 
  duplicate row.names: 

我也尝试过使用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", "`")

但是这个失败了:

Error in .jfindClass(as.character(driverClass)[1]) : class not found

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

$ ls /Users/svend/dev/libs/cassandra-jdbc-1.2.5.jar
/Users/svend/dev/libs/cassandra-jdbc-1.2.5.jar

5 个答案:

答案 0 :(得分:4)

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

无需在本地计算机上安装Cassandra;只需将cassandra-jdbc-1.2.5.jar和cassandra-all-1.1.0.jar文件放在unziped 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))

这是在我的unix上工作但不在我的Windows机器上。 希望有所帮助。

答案 1 :(得分:4)

这个问题现在已经过时了,但由于它是R和Cassandra的热门歌曲之一,我认为我在这里留下了一个简单的解决方案,因为我发现令人沮丧的是最新的支持因为我认为这是一项相当普遍的任务。

Sparklyr现在很容易从头开始,因为它公开了一个java上下文,因此Spark-Cassandra-Connector可以直接使用。我已经在这个简单的包裹中crassy包裹了绑定,但是没有必要使用它。

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

支持列选择和分区过滤。这些是我认为对于一般Cassandra用例而言必需的唯一功能,因为CQL不能直接提交给集群。

我还没有找到提交更多通用CQL查询的解决方案,这些查询并不涉及编写自定义scala,但是有一个例子说明这是如何工作的here

答案 2 :(得分: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))

有人有更好的主意吗?

答案 3 :(得分:1)

通过批处理文件(R 3.2.4,Teradata驱动程序)执行RscriptRJDBC连接时,我收到了相同的错误消息。 此外,在RStudio中运行时,它在第二次运行时工作正常但不是第一次运行。

有明确要求的帮助:

library(rJava)
.jinit()

答案 4 :(得分:0)

仅下载驱动程序还不够,您还必须下载依赖项并将它们放入JAVA ClassPath(MacOS:/ Library / Java / Extensions)中,如项目main page中所述。

  

在类路径中包含Cassandra JDBC依赖项:下载依赖项

从RCassandra程序包开始,与RJDBC相比,它现在仍然过于原始。