Как читать данные из Кассандры с помощью 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.