我有一个让我发疯的问题。我正在尝试从Cassandra导入R中的数据。
library(RJDBC)
library(glmnet)
cassandra_conn <- dbConnect(JDBC("org.apache.cassandra.cql.jdbc.CassandraDriver",list.files("/data/data/LIBS",pattern="jar$",full.names=T),identifier.quote="`"),"jdbc:cassandra://ciccio01:9160/banza")
name <- "sector"
sect <- order_to_campaign[[name]]
cl_imp_ <- dbGetQuery(cassandra_conn, paste0("select * from adv where order_id = '",sett[1], "'"))
for(i in 2:length(sect))
{
print(sect[i])
cl_imp_ <- rbind(cl_imp_ , dbGetQuery(cassandra_conn, paste0("select * from adv where order_id = '",sect[i], "'")))
}
现在,第一个查询工作正常。但是,在for循环中,我总是得到一个TimeOutException(),我无法理解为什么。我用Google搜索了所有内容,却无法理解该异常的原因。 最后,我和我的同事一起认为这可能是由于R中的分页问题。我们解决这个问题的方法是在shell中编写查询,然后将数据保存在另一个文件中,最后在R中读取该文件。
我的问题是:这可能是唯一的方法吗?我认为使用非常简单的查询必须有一种更简单的方法来解决这个问题。
这是我桌子的架构:
CREATE TABLE adv (
user_id text,
order_id text,
advertiser_id text,
PRIMARY KEY (user_id, order_id)
) WITH CLUSTERING ORDER BY (order_id ASC);
CREATE INDEX adv_order_id_idx ON mytable (order_id);
非常感谢任何帮助。
的Davide
答案 0 :(得分:0)
我认为问题不是来自R分页,因为TimeOutException是Cassandra服务抛出的java异常。
您能否提供进一步的信息:
答案 1 :(得分:0)
正如我想的那样,您正在使用群集列。在主键中, user_id 是您的分区键, order_id 是您的群集列。您在表上创建了一个索引,以便能够查询您的群集列。
在大多数情况下,索引不是一个好主意!
基本上,NoSql数据库没有很好地设计来管理大型表上的索引。所以尽量避免这种情况。一个很好的选择是手动创建一个索引表。每次插入 adv 时,不要忘记插入 adv_idx (在两个不同的查询中)。它看起来像这样:
CREATE TABLE adv (
user_id text,
order_id text,
advertiser_id text,
PRIMARY KEY (user_id, order_id)
) WITH CLUSTERING ORDER BY (order_id ASC);
CREATE TABLE adv_idx (
order_id text,
user_id text,
PRIMARY KEY (order_id, user_id)
)
要检索与 order_id 相关的信息,请查询 adv_idx ,然后预先返回 user_id ,查询 adv 。 Cassandra不再有性能问题了。然而,来自客户端的查询数量更大,处理时间更长。
另一种解决方案是添加一些冗余:
CREATE TABLE adv (
user_id text,
order_id text,
advertiser_id text,
PRIMARY KEY (user_id, order_id)
) WITH CLUSTERING ORDER BY (order_id ASC);
CREATE TABLE adv_by_order (
order_id text,
user_id text,
advertiser_id text,
PRIMARY KEY (order_id, user_id)
)
好的,你的数据库现在增加了两倍。但是你的表现要好得多!
我倾向于说冗余很好!