标签: datastax-java-driver

Cassandra:插入timeuuid错误

我有下表

create table test(
         userId varchar,
         notifId timeuuid,
         notification varchar,
         time bigint,read boolean,
         primary key(userId, notifId)) with clustering order by (notifId desc);
Run Code Online (Sandbox Code Playgroud)

我正在运行以下查询:

PreparedStatement   pstmt  = session.prepare("INSERT INTO notifications(userId, notifId, notification, time, read) VALUES(?, now(), ?, ?, ?)");

BoundStatement      boundStatement  = new BoundStatement(pstmt);
        session.execute(boundStatement.bind("123", "hello", new Date().getTime(), false));
Run Code Online (Sandbox Code Playgroud)

我收到以下错误:

Exception in thread "main" com.datastax.driver.core.exceptions.InvalidQueryException: Type error: cannot assign result of function now (type timeuuid) to notifid (type 'org.apache.cassandra.db.marshal.ReversedType(org.apache.cassandra.db.marshal.TimeUUIDType)')
    at com.datastax.driver.core.exceptions.InvalidQueryException.copy(InvalidQueryException.java:35)
    at com.datastax.driver.core.ResultSetFuture.extractCause(ResultSetFuture.java:277)
    at com.datastax.driver.core.Session.toPreparedStatement(Session.java:281)
    at com.datastax.driver.core.Session.prepare(Session.java:172)
    at com.example.cassandra.SimpleClient.loadData(SimpleClient.java:130)
    at com.example.cassandra.SimpleClient.main(SimpleClient.java:214) …
Run Code Online (Sandbox Code Playgroud)

cql cassandra datastax-java-driver

4
推荐指数
1
解决办法
7810
查看次数

Cassandra:使用DataStax Java驱动程序选择一系列TimeUUID

我们正在使用Cassandra解决的用例是:我们需要检索在过去90天内在特定时间范围内更新的实体UUID列表.想象一下,我们正在构建一个文档跟踪系统,因此我们的相关实体是一个Document,其关键是UUID.

我们在此用例中需要支持的查询是:查找StartDateTime和EndDateTime之间已更改的所有Document UUID.

问题1:支持此查询的最佳Cassandra表设计是什么?

我认为答案如下:

CREATE TABLE document_change_events (
    event_uuid TIMEUUID,
    document_uuid uuid,
    PRIMARY KEY ((event_uuid), document_uuid)
) WITH default_time_to_live='7776000';
Run Code Online (Sandbox Code Playgroud)

鉴于我们不能对分区键进行范围查询,我们需要使用该token()方法.因此,查询将是:

SELECT document_uuid 
 WHERE token(event_uuid) > token(minTimeuuid(?)) 
   AND token(event_uuid) < token(maxTimeuuid(?))
Run Code Online (Sandbox Code Playgroud)

例如:

SELECT document_uuid 
 WHERE token(event_uuid) > token(minTimeuuid('2015-05-10 00:00+0000')) 
   AND token(event_uuid) < token(maxTimeuuid('2015-05-20 00:00+0000'))
Run Code Online (Sandbox Code Playgroud)

问题2:我似乎无法使用DataStax的驱动程序获得以下Java代码,以确保可靠性返回正确的结果.

如果我运行以下代码10次,暂停30秒,我将在此表中有10行:

private void addEvent() {

    String cql = "INSERT INTO document_change_events (event_uuid, document_uuid) VALUES(?,?)";

    PreparedStatement preparedStatement = cassandraSession.prepare(cql);
    BoundStatement boundStatement = new BoundStatement(preparedStatement);
    boundStatement.setConsistencyLevel(ConsistencyLevel.ANY);

    boundStatement.setUUID("event_uuid", UUIDs.timeBased());
    boundStatement.setUUID("document_uuid", UUIDs.random());

    cassandraSession.execute(boundStatement);

}
Run Code Online (Sandbox Code Playgroud)

结果如下:

cqlsh:> …
Run Code Online (Sandbox Code Playgroud)

java cassandra datastax-java-driver datastax

4
推荐指数
1
解决办法
2026
查看次数

Cassandra如何处理阻塞datastax java驱动程序中的execute语句

阻止从com.datastax.driver.core.Session执行fethod

public ResultSet execute(Statement statement);
Run Code Online (Sandbox Code Playgroud)

评论这种方法:

该方法阻塞,直到从数据库接收到至少一些结果.但是,对于SELECT查询,它不保证已完全接收结果.但它确实保证从数据库收到了一些响应,特别是保证如果请求无效,则此方法将抛出异常.

来自com.datastax.driver.core.Session的非阻塞执行方法

public ResultSetFuture executeAsync(Statement statement);
Run Code Online (Sandbox Code Playgroud)

此方法不会阻止.一旦查询传递到底层网络堆栈,它就会返回.特别是,从此方法返回并不保证查询有效或甚至已提交到活动节点.访问{@link ResultSetFuture}时,将抛出与查询失败有关的任何异常.

我有关于它们的02个问题,因此如果你能帮我理解它们会很棒.

假设我有100万条记录,我希望所有这些记录都能到达数据库(没有丢失).

问题1:如果我有n个线程,则所有线程将具有发送到数据库所需的相同数量的记录.所有这些都继续使用阻塞执行调用向cassandra发送多个插入查询.如果我增加n的值,它是否也有助于加快我需要将所有记录插入cassandra的时间?

这会导致cassandra的性能问题吗?Cassandra是否必须确保对于每个插入记录,群集中的所有节点都应立即知道新记录?为了保持数据的一致性.(我假设cassandra节点甚至不会考虑使用本地机器时间来控制记录插入时间).

问题2:通过非阻塞执行,我如何确保所有插入成功?我知道的唯一方法是等待ResultSetFuture检查插入查询的执行.有什么更好的办法吗?非阻塞执行更容易失败然后阻塞执行的可能性更高吗?

非常感谢您的帮助.

cassandra datastax-java-driver datastax

4
推荐指数
1
解决办法
2033
查看次数

删除后,Cassandra UPDATE无法正常工作

我在Cassandra中使用了宽行模式.我的表定义如下:

CREATE TABLE usertopics (
    key text,
    topic text,
    score counter,
    PRIMARY KEY (key, topic)
)
Run Code Online (Sandbox Code Playgroud)

我正在插入条目使用:

UPDATE usertopics SET score = score + ? WHERE key=? AND topic=?
Run Code Online (Sandbox Code Playgroud)

这样如果密钥不存在,它将插入,如果它存在,它将更新.

我正在删除使用的条目:

Delete form usertopics where key in ?
Run Code Online (Sandbox Code Playgroud)

但删除后,当我再次尝试更新时,它没有更新.它没有给出任何错误,但它也没有反映在db中.

当我截断表格时,它再次完美插入.我正在使用Datastax java驱动程序访问Cassandra.有什么建议?

cql insert-update cassandra nosql datastax-java-driver

4
推荐指数
1
解决办法
437
查看次数

如何使用datastax中的java api从语句中获取精确的cql

我的代码直接执行准备好的绑定语句,没有任何确切的查询。那么如何获得它试图在 cassandra 数据库中执行的 cql?

例如:

public <T> void save(T entity) {
    if (entity != null) {
        Statement statement = getEntityMapper(entity).saveQuery(entity);
        statement.setConsistencyLevel(consistencyLevelWrite);
        mappingManager.getSession().execute(statement);
    }
}
Run Code Online (Sandbox Code Playgroud)

我想得到类似INSERT INTO "keyspace"."tableName"("column1","column2") VALUES (value1,value2)

java cassandra datastax-enterprise datastax-java-driver datastax

4
推荐指数
1
解决办法
3864
查看次数

无法使用Java删除以前在Cassandra中使用upsert创建的行

TL; DR是我无法使用Java删除先前使用upsert创建的行.

基本上我有这样一个表:

CREATE TABLE transactions (
key text PRIMARY KEY,
created_at timestamp
);
Run Code Online (Sandbox Code Playgroud)

然后我执行:

String sql = "update transactions set created_at = toTimestamp(now()) where key = 'test' if created_at = null"; 
session.execute(sql)
Run Code Online (Sandbox Code Playgroud)

正如预期的那样,行被创建:

cqlsh:thingleme> SELECT * FROM  transactions ;

 key  | created_at
------+---------------------------------
 test | 2018-01-30 16:35:16.663000+0000
Run Code Online (Sandbox Code Playgroud)

但是(这是让我发疯的原因)如果我执行:

sql = "delete from transactions where key = 'test'"; 
ResultSet resultSet = session.execute(sql);
Run Code Online (Sandbox Code Playgroud)

什么都没发生.我的意思是:没有抛出异常而且行仍在那里!

其他一些奇怪的东西:

  • 如果我用普通插入替换upsert,那么删除工作
  • 如果我使用cqlsh直接运行sql代码(更新和删除),它的工作原理
  • 如果我针对EmbeddedCassandraService运行此代码,它可以工作(这非常糟糕,因为我的集成测试只是绿色!)

我的环境:

  • cassandra:3.11.1
  • datastax java驱动程序:3.4.0
  • docker image:cassandra:3.11.1

关于如何解决这个问题的任何想法/建议真的很感激;-)

java cassandra datastax-java-driver

4
推荐指数
1
解决办法
115
查看次数

用于基于maxTimeuuid和minTimeuuid的查询的Java API

使用maxTimeuuid和minTimeuuid的查询的Java API是什么?我在QueryBuilder或其他任何地方找不到任何内容.我正在使用DataStax客户端

        <artifactId>cassandra-driver-core</artifactId>
        <version>1.0.3</version>
Run Code Online (Sandbox Code Playgroud)

表"a"有2列:1.类型为String的id 2.类型为TimeUuid的LMD

这就是我在做什么,似乎不对,当然不起作用

    Query q = QueryBuilder
    .select()
    .all()
    .from("test","a")
    .where().and(QueryBuilder.gt("LMD", "minTimeUUid('2013-11-03 14:33:50')"))
    .and(QueryBuilder.lt("LMD", "maxTimeUUId('2013-11-03 14:45:50')"));
Run Code Online (Sandbox Code Playgroud)

任何指针都非常感谢

谢谢

java cassandra cql3 datastax-java-driver

3
推荐指数
1
解决办法
2175
查看次数

如何使用DataStax QueryBuilder向集合中添加元素?

我有一个列类型为的表

text, bigint, set<text> 
Run Code Online (Sandbox Code Playgroud)

我正在尝试更新单行并使用QueryBuilder向集合添加元素.

覆盖现有集的代码如下所示(注意这是scala):

val query = QueryBuilder.update("twitter", "tweets")
  .`with`(QueryBuilder.set("sinceid", update.sinceID))
  .and(QueryBuilder.set("tweets", setAsJavaSet(update.tweets)))
  .where(QueryBuilder.eq("handle", update.handle))
Run Code Online (Sandbox Code Playgroud)

我能够找到实际的CQL来为一个集合添加一个元素:

UPDATE users
SET emails = emails + {'fb@friendsofmordor.org'} WHERE user_id = 'frodo';
Run Code Online (Sandbox Code Playgroud)

但是找不到使用QueryBuilder的例子.

基于CQL,我也尝试过:

  .and(QueryBuilder.set("tweets", "tweets"+{setAsJavaSet(update.tweets)}))
Run Code Online (Sandbox Code Playgroud)

但它没有用.提前致谢

scala cql cql3 datastax-java-driver datastax

3
推荐指数
1
解决办法
1064
查看次数

如何在不创建快照的情况下从cassandra表中删除所有记录

我在删除表中的所有记录时遇到问题.

我可以使用Truncate表.但truncate会创建数据的快照,这可能是我方案中存储空间的浪费.

如果任何节点关闭,截断也会失败.

所以我想知道是否有任何方法可以删除表中的所有记录而不创建在节点关闭时有效的快照.

cassandra datastax-java-driver datastax cassandra-2.0 cassandra-2.1

3
推荐指数
2
解决办法
2373
查看次数

Dse图模式已满或模式较少

如果架构已满或无架构,我感到困惑DataStax graph .

我问这个问题,因为 入门教程 告诉创建架构.但我key-value在边缘属性上插入随机并DSE graph接受它而没有错误.

如果我在DSE-Graph上插入随机Vertex或edge属性(键值)会有问题吗?

datastax-enterprise datastax-java-driver datastax datastax-startup datastax-enterprise-graph

3
推荐指数
1
解决办法
178
查看次数