Как читать данные из Кассандры с помощью R?

Я использую 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

Ответ 1

Вам нужно скачать 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 в каталог lib из unziped apache-cassandra-2.0.10-bin.tar.gz. Затем вы можете использовать

 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 загрузкой соединителя, а так как синтаксис выбора подмножества столбцов немного громоздкий.

Поддерживаются выбор столбцов и фильтрация разделов. Это были единственные функции, которые, как я думал, были необходимы для общих случаев использования Cassandra, поскольку CQL не может быть отправлен непосредственно в кластер.

Я не нашел решения для отправки более общих запросов CQL, которые не связаны с написанием пользовательского scala, однако есть пример того, как это может работать .

Ответ 3

Правильно, я нашел (по общему признанию, уродливый) способ, просто вызвав python из 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    
parsena <- function (x) if (x=="__NA__") NA else x
df <- as.data.frame(lapply(df,  parsena))

У кого-то есть лучшая идея?

Ответ 4

У меня было такое же сообщение об ошибке при выполнении Rscript с RJDBC подключением через пакетный файл (R 3.2.4, драйвер Teradata). Кроме того, при запуске в RStudio он работал нормально во втором запуске, но не в первый раз.

То, что помогло, было явно вызвано:

library(rJava)
.jinit()

Ответ 5

Недостаточно просто загрузить драйвер, вы также должны загрузить зависимости и поместить их в свой JAVA ClassPath (MacOS:/Library/Java/Extensions), как указано в проекте главная страница.

Включить зависимости Cassandra JDBC в свой путь к классам: загрузить зависимости

Как и в пакете RCassandra, он по-прежнему слишком примитивен по сравнению с RJDBC.