【问题标题】:How to read data from Cassandra with R?如何使用 R 从 Cassandra 读取数据?
【发布时间】:2014-03-26 11:43:21
【问题描述】:

我正在使用 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

【问题讨论】:

  • 您应该更新您的旧 R 版本。当前版本是 3.0.2。

标签: r cassandra


【解决方案1】:

你必须下载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))

这适用于我的 unix,但不适用于我的 windows 机器。 希望对您有所帮助。

【讨论】:

【解决方案2】:

这个问题现在已经过时了,但由于它是 R 和 Cassandra 的热门问题之一,我想我会在这里留下一个简单的解决方案,因为我发现对我认为的内容的最新支持很少一个相当普遍的任务。

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

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

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

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

【讨论】:

  • 如何在 sparklyr 中连接远程 Cassandra?
【解决方案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))

谁有更好的主意?

【讨论】:

    【解决方案4】:

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

    显式调用:

    library(rJava)
    .jinit()
    

    【讨论】:

      【解决方案5】:

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

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

      就 RCassandra 包而言,现在它与 RJDBC 相比仍然过于原始。

      【讨论】:

        猜你喜欢
        • 1970-01-01
        • 1970-01-01
        • 2018-04-12
        • 2020-02-09
        • 1970-01-01
        • 2012-12-15
        • 2014-02-01
        • 2014-01-16
        • 2012-12-01
        相关资源
        最近更新 更多