2014-02-24 91 views
12

我使用R 2.14.1和Cassandra 1.2.11,我有一個單獨的程序,它已經將數據寫入單個Cassandra表。我無法從R.閱讀如何用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 
+0

你應該更新你古老的R版本。目前的版本是3.0.2。 – Roland

回答

2

右,我發現了一個(不可否認的難看的)的方式,簡單地通過調用來自R蟒,手動解析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

你必須下載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文件放入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機器。 希望有所幫助。

+0

也在我的Windows機器上工作。我從這裏下載了驅動程序:https://code.google.com/a/apache-extras.org/p/cassandra-jdbc/downloads/list和依賴項(但不是驅動程序):https:// code .google.com/A/apache-extras.org/p /卡桑德拉-JDBC/ – 2015-01-21 22:37:49

+0

忘了提:由於某種原因,我不得不兩次執行的最後一個命令,JDBC(...)。第一次失敗;第二個成功。 – 2015-01-21 22:52:29

0

僅僅下載驅動程序是不夠的,您還必須下載依賴關係並將其放入您的JAVA ClassPath(MacOS:/ Library/Java/Extensions),如項目main page所述。

包含在類路徑中卡桑德拉JDBC的依賴關係:下載依賴

由於RCassandra包,現在它還是太原始相比RJDBC。

1

當通過批處理文件(R 3.2.4,Teradata驅動程序)執行RscriptRJDBC連接時,我收到了相同的錯誤消息。 另外,在RStudio運行時,它在第二次運行中運行良好,但不是第一次運行。

什麼幫助了明確要求:

library(rJava) 
.jinit() 
3

這個問題是老了,但因爲它是爲R和卡桑德拉排名靠前的一個,我想我會離開這裏一個簡單的解決辦法,因爲我發現令人沮喪的最新支持我認爲是一個相當普遍的任務。

Sparklyr使這很容易,現在從頭開始做,因爲它暴露了一個Java的背景下,因此Spark-Cassandra-Connector,可直接使用。我在這個簡單的包中包裝了綁定,crassy,但沒有必要使用。

我主要是爲了揭開如何讓sparklyr加載連接器的配置,並且因爲選擇列的子集的語法有點笨拙。

列選擇和分區濾波都支持。由於CQL不能直接提交給羣集,因此這些是我認爲對於一般Cassandra用例必需的唯一功能。

我還沒有找到解決方案來提交不涉及編寫自定義scala的更一般的CQL查詢,但是有一個示例說明這可以如何工作here